14.b2GearJointDefでギアジョイントを作る

ギアジョイントを作る

ラック・アンド・ピニオン

ギアジョイントを使うと歯車やラック・アンド・ピニオンのような表現ができます。

ラック・アンド・ピニオンというのは右のように、歯車の片方の部品が直線状に歯が並んでいるような機構です。

自動車のハンドルの回転をタイヤの角度を変えるところなどに使われています。

下のサンプルはこのギアジョイントを使ったかなりひねくれた(?)サンプルです。

中心の小さい円はモーターになっています。

このモーターと左の大きい円にギアジョイントを設定。

さらに、モーターと右の四角にもギアジョイントを設定しています(こちらは上のラック・アンド・ピニオンっぽいですよね)。

スタートボタンをクリックすると、物体が動き始めるかと思います。

ほら、モーターに駆動され、左の円は回転し、右の四角は上に動くでしょう。

でも何か変でしょ、、、?

歯車なのに、接触していないし、右側の四角は回転と逆方向に進んでいるし、、、

まあ、そのあたりが"かなりひねくれたサンプル"でして。

ギアジョイントを作り方 (1)ギア同士の場合

ギア同士の場合(つまりサンプルでいうとモーターと左の円のジョイントです)、ギアジョイント関連部分のコードはこんな感じです。

var jointDef:b2GearJointDef = new b2GearJointDef();

jointDef.body1 = body1;
jointDef.body2 = body2;
jointDef.joint1 = revoluteJoint1;
jointDef.joint2 = revoluteJoint2;
jointDef.ratio = 2;

world.CreateJoint(jointDef);

このコードではモーターがbody1、左の円がbody2を指します。

ギアですから、二つの物体を指定する必要があります。

物体は回転ジョイントか直動ジョイントのどちらかで固定されている必要があり、そのジョイントを示すオブジェクトをjoint1/joint2というプロパティで指定する必要があります。

ここで、revoluteJoint1、revoluteJoint2ともb2RevoluteJointの型を持ちます(b2RevoluteJointDefではないので注意)。

ratioを2に指定していますので、モーターが2回転すると左の円が1回転してますね。

サンプルのように、物体は接していなくても構いません。

ギアジョイントを作り方 (2)ラック・アンド・ピニオンの場合

ラック・アンド・ピニオン風の場合(つまりサンプルでいうとモーターと右の四角のジョイントです)、のコードはこんな感じです、、、ってほとんど変わりませんが。

var jointDef:b2GearJointDef = new b2GearJointDef();

jointDef.body1 = body1;
jointDef.body2 = body3;
jointDef.joint1 = revoluteJoint1;
jointDef.joint2 = prismaticJoint;
jointDef.ratio = 1;

world.CreateJoint(jointDef);

ほとんど同じなのですが、画面右の四角であるbody3が直動ジョイントで固定されているので、それ相応の指定をしています。

prismaticJointというのはb2PrismaticJoint型を持ちます。

これも二つの物体が接していなくても構いません。

では、動く方向はどのようにして決まるのでしょうか?

そもそも直動ジョイントの設定で動く方向をベクトル指定します。

このベクトルを反対に向けると、逆方向に移動します。

また、上記コード内にあるratioの符号を変えることでも逆方向に移動するようになります。

では、モーターの回転量と移動距離はどのような関係があるの?

というのを見るために、サンプル内でモーターの回転角(ラジアン)と四角の移動距離(メートル)を表示させています。

ほら、ratio=1なので、二つの値は同じになります。

ちなみにration=2とすると、四角の移動距離はモーター回転角の半分になります。

よって、上記サンプルの場合、

deltaY[m] = MotorAngle[rad] / ratio

となります。

従って、ratioは[1/m]の次元を持っています(逆の場合もできるので、ratioは[m]の次元を持つこもありえます)。

2010年3月1日

13.b2PulleyJointDefでプーリージョイントを作る←