11.b2RevoluteJointで回転ジョイント情報を得る/設定する

回転ジョイントの情報を得る

回転ジョイントに関する情報をb2RevoluteJointクラスで得ることができます。

b2RevoluteJointDefじゃなくてb2RevoluteJointです、ややこしいですね。

b2RevoluteJointDefで回転ジョイントを作る」にあるように、今までCreateJointメソッドでジョイントを生成していましたが、ここでは以下のように変更しています。

var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
jointDef.Initialize(body, ground, body.GetWorldCenter());

jointDef.enableMotor = true;
jointDef.motorSpeed = 0.5;
jointDef.maxMotorTorque = 10000;

//world.CreateJoint(jointDef); ←ここを下のように変更
RevJoint = b2RevoluteJoint(world.CreateJoint(jointDef));

ここで、RevJointはb2RevoluteJointクラスのインスタンスです。

worldはb2Worldクラスのインスタンスで、CreateJointメソッドは、b2Joint型のインスタンスを返します。

上記のようにしてRevJointというインスタンスを作っておけば、様々なデータを得ることができます。

上のswfでは以下のようにして回転ジョイントの角度と角速度情報を得ています。

var jointAngle:Number = RevJoint.GetJointAngle();//角度[rad]
var jointSpeed:Number = RevJoint.GetJointSpeed();//角速度[rad/s]

なお、ここで得られる角度は回転体のもつ角度というわけではありません!

よく見ると、時計と反対回りがプラスになってて、通常と違うでしょ?

これはあくまで回転ジョイントの角度ということなので、設定時の

jointDef.Initialize(body, ground, body.GetWorldCenter());

この部分で、Initializeメソッドの1番目と2番目の引数を入れ替えると正負が逆転します。

回転ジョイントの設定

上のswfで青いup/downのボタンをクリックすると、画面中央の回転体の設定角速度が変わります。

これは、クリックされた場合に以下のような処理をしています(下のはupボタンの場合)。

RevJoint.SetMotorSpeed(RevJoint.GetMotorSpeed() + 0.5);

現在のモーターの角速度(設定値)を得て、0.5[rad/s]足した値をセットしています。

なお、GetMotorSpeed()で得る値は設定値であり、回転体の角速度ではありません。

ところで、モーターの角速度を設定するのは、b2RevoluteJointDefクラスでもできましたよね(「b2RevoluteJointDefで回転ジョイントをモータにする」)。

b2RevoluteJointDefクラスの場合、初期設定としては可能なようですが、今回のように後で変更するような場合だと、b2RevoluteJointDefクラスではできず、b2RevoluteJointクラスを使う必要があるようです。

他にもb2RevoluteJointクラスを使うことで、回転角度の制限なども行うことができます。

2010年1月29日

→12.b2PrismaticJointDefで直動ジョイントを作る

10.b2RevoluteJointDefで回転ジョイントをモータにする←