Box2DでActionScript物理プログラミング

第5回 ジョイントで物をつなぐ

この記事を読むのに必要な時間:およそ 4 分

車体と車輪をジョイントでつなぐ

ここまででCarParts.asの大まかな説明をしましたが,このソースコードから作られるFlashは,先ほどお見せしたとおり,車には程遠いものです。車体が床に落ちてしまい,車輪はゴロゴロとどこかに転がっていってしまいます。これらをつなぐのがジョイントの役目です。/p>

なお,ここから説明するソースコードは,後輪を作るところの直後から書き足していくものと考えてください。

b2RevolutionJointDefでつなぐ場所を決める

ジョイントを作るには,物体を作るときと同じように

  1. XxxJoiontDefクラスを使ってジョイントを定義する
  2. 定義を使ってXxxJointクラスの変数を作る

という順番で作業を進めます。車体と車輪をつなぐには,回転ジョイント(b2RevolutionJointDef)を使います。

// ジョイントを定義するjointDef変数
var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();
// つながれる2つの物体と,つなぐ位置(前輪の中央)を使って,定義を初期化する
jointDef.Initialize(body, frontWheel, frontWheel.GetWorldCenter());

jointDef変数を作ったら,まずInitializeメソッドで初期化します。1番目と2番目の引数は,つなぎ合わせる物体です。まずは車体と前輪をつなぐので,bodyとfrontWheelを指定します。

3番目の引数は,回転の軸となる座標です。この座標に指定しているfrontWheel.GetWorldCenter()は,前輪の中心座標,つまり画面の左から2.8m,上から2mの場所を表します。数字で直接指定することもできますが,このようにGetWorldCenterメソッドを使ったほうが分かりやすいかと思います。

ジョイントの細かい設定

次に,ジョイントに関する細かい設定をします。

// 回転速度の設定(6秒で1回転ぐらい)
jointDef.motorSpeed = 1;
// トルクの設定(大きいほど坂道に強くなる)
jointDef.maxMotorTorque = 1;
// 車輪を回すようにする
jointDef.enableMotor = true;

motorSpeedは,回転の速さを表す値です。単位はラジアン毎秒なので,1にすると約6秒で車輪が1回転することになります。

maxMotorTorqueは,トルク(回転の強さ)を表す値です。速さとはまた別の値で,坂道を走らせるのであればある程度意味を持ってくる値です。単位はニュートンメートルですが,今回のサンプルでは少し説明しづらいので詳細は省きます。

ここまで設定してきた値は,enableMotorをtrueにすることで効果を発揮します。これは文字通り,回転ジョイントをモーターとさせるかどうかのフラグです。連載第1回のサンプルで紹介したラグドールのようなものを作るときは,これがfalseになります。

定義からジョイントを作る

ジョイントの定義が終わったので,実際にジョイントを作ります。

// 回転ジョイントを作る
var frontJoint:b2RevoluteJoint = b2RevoluteJoint(world.CreateJoint(jointDef));

ここの書き方はCreateDynamicBodyなどを使って物体を作るときとほぼ同じですが,b2RevoluteJointにキャストしている部分だけが違います。CreateJointメソッドが返すオブジェクトの型がb2Jointという汎用的な型なので,それをfrontJointに代入するためにキャストしています。

後輪のジョイントを作る

後輪のジョイントを作るときには,前輪のジョイントの定義をほぼそのまま使えるので,たった2行で書くことができます。

// つながれる2つの物体と,つなぐ位置(後輪の中央)を使って,定義を初期化する
jointDef.Initialize(body, rearWheel, rearWheel.GetWorldCenter());
// 回転ジョイントを作る
var rearJoint:b2RevoluteJoint = b2RevoluteJoint(world.CreateJoint(jointDef));

後輪の中心を軸に車体と後輪をつなぐように設定し,ジョイントを作るだけです。他のパラメータは変える必要がありません。

ここまで書いてきたプログラムに必要なimport文を書き加えてコンパイルすると,以下のような結果になります(これもクリックで動作開始するように書き換えてます⁠⁠。

ちゃんと車ができましたね。四角や円だけでもそこそこ使えるBox2Dですが,ジョイントを使うとできることが格段に増えます。

著者プロフィール

木村秀敬(きむらひでたか)

茨城高専,北陸先端大を卒業後,独立系ベンチャーにあこがれてjig.jpに就職。 ActionScript好きですが,根はコテコテのC/C++プログラマです。Flash/ActionScriptに興味のある方は是非Spark Projectへ。