PythonによるOpen Dynamics Engine講座 その7
サンプルプログラムはここです。ずいぶん久しぶりの更新ですが、今回はジョイントを作成します。
・・・・・プログラムが汚くなってきたな。次回あたり整理します。
物体を二つジョイントでつなげるため、直方体を二つ作ります。link1とlink2という名前をつけてます。
大体は球を作るときと一緒ですが、create_box数のmass.setBox(m,lx,ly,lz)はlx,ly,lzの長さをもつ直方体のパラメータを設定しています。あと、ode.GeomBox(space,
(lx,ly,lz))も同様に直方体のジオメトリの設定をしています。
あと、draw_box関数のglScale(sx, sy, sz)はglutSolidCube(1)dで作った立方体をx軸方向、y軸方向、z軸方向に拡大縮小して直方体を作成しています。
さて、本題のジョイントの作成ですが、最初のほうにあるjoint1 = ode.FixedJoint(world)とjoint2 = ode.HingeJoint(world)でジョイントを作成して、create_joint関数でジョイントの取り付け、パラメータの設定を行っています。
joint1 = ode.FixedJoint(world)は固定ジョイントを作成しています。
create_joint関数のjoint1.attach(link1, ode.environment)で地面とlink1を繋げて、
joint1.setFixed()で完全に固定します。
joint2 = ode.HingeJoint(world)はヒンジジョイントを作成しています。
ヒンジジョイントは図1のようなジョイントです。
joint2.attach(link1, link2)でlink1とlink2を繋げています。
joint2.setAnchor( (0,0,0.7) )はジョイントの中心点、joint2.setAxis((0,0,1))はジョイントの回転軸を設定しています。この場合、z軸を中心に回転します。joint2.setParam(ode.ParamVel,
10)は目標角速度の設定、joint2.setParam(ode.ParamFMax, 20)は.ParamVelを達成するための発揮可能なトルクを設定しています。
あと、near_callback関数にif geom1 == floor or geom2 == floor:とありますが、これは地面以外の物体同士が衝突しても無視するという意味です。
図1:ヒンジジョイント(Russell Smith:Open Dynemics Engine v0.5 User Guide,http://www.ode.org/ode-latest-userguide.htmlより引用)
次回はプログラムの整理をやります。
PythonによるOpen Dynamics Engine講座に戻る