PythonによるOpen Dynamics Engine講座 その6
例の如くプログラムはここ。地面との衝突をやります。
まず、space = ode.Space()で衝突計算用のスペースを作ります。
これに登録された剛体同士のみ衝突できます。
create_sphere()の
geom = ode.GeomSphere(space, apple.sphereRadius)
geom.setBody(apple)
でspaceに衝突計算用のジオメトリを登録します。apple.sphereRadiusは球の半径ですが、ボディのサイズと同じにする必要はありません。
floor = ode.GeomPlane(space, (0,0,1), 0)は(0,0,1)が法線ベクトルとなる、つまりx、y軸に平行な地面のジオメトリを高さ0の位置に生成しています。
地面の描画はdraw_ground()です。
sx,sy,sz = [100, 100, 1]
glScale(sx, sy, sz)
glTranslatef(0.0, 0.0, -0.5)
glutSolidCube(1)
といったように、厚さ1、100×100の地面を描画しています。
glTranslatef(0.0, 0.0, -0.5) は厚さが1なので0.5だけ下に平行移動しただけです。
衝突は_idlefunc ()のspace.collide((world,contactgroup), near_callback)でやってます。
near_callback(args, geom1, geom2)では、contacts = ode.collide(geom1, geom2)でgeom1とgeom2の衝突点数を取得します。そのあと、衝突点数分だけ計算を行います。
c.setBounce(0.2)は反発係数、c.setMu(5000)は摩擦です。
j = ode.ContactJoint(world, contactgroup, c)
j.attach(geom1.getBody(), geom2.getBody())
は、衝突点にジョイントを作っています。ODEでは接触をジョイントの拘束として計算しています。
contactgroupに接触点が格納されます。
そして、最後に_idlefunc ()のcontactgroup.empty()でcontactgroupを空にします。
次はジョイントを作成します。
PythonによるOpen Dynamics Engine講座に戻る