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講座に戻る

トップページへ戻る