2009.9.4
Box2D(Box2DFlashAS3)によるActionScript物理シミュレーション

●第4回:動体の生成と表示

◆動体の作成

前回述べた通り、Box2Dの2.0.2では動体は「静体にプラスαの情報を加えたもの」となっています。
動体にするためにプラスαする情報は「質量」です。質量はデフォルトで0(kg)で、質量が0の物体は静体となります。
質量を設定するには、形状(b2Shapeオブジェクト)に密度(kg/m2)を設定しそこから自動的に算出・適用する方法と、明示的に指定する方法の2つがあります。
今回は自動的に算出する方法を紹介します。
密度の指定にはb2ShapeDef.densityプロパティを使います。
b2ShapeDefオブジェクトにdensityプロパティを設定し、b2Body.CreateShape()メソッドで物体に形状を適用した後にb2Body.SetMassFromShapes()メソッドを実行することで質量が算出されb2Bodyオブジェクトに適用されます。

【P】b2ShapeDef.density:Number-物体の密度(kg/m2
【M】b2Body.SetMassFromShapes() : void-形状(b2Shapeオブジェクト)から質量を算出

引数-なし
戻り値-なし

ここでは、x=2.75m、y=1mの位置に幅0.6m、高さ0.4mの箱を配置し、前回作成した床に落下させます。
箱を表すb2Bodyオブジェクトは後々他の複数のメソッドから参照するつもりなのでプライベートプロパティ_bBoxとして定義しておきます。
次のスクリプトを前回のスクリプト【スクリプト:3-4】(Box2D_03_01.as)に追加します。

スクリプト:4-1

・プロパティ定義のセクションに追加

private var _bBox:b2Body;

・コンストラクタの最後尾に追加

//▼箱(動体)の生成
var bdBox:b2BodyDef = new b2BodyDef();
bdBox.position.Set(5.5 / 2, 1);
//ShapeDefの設定
var pdBox:b2PolygonDef = new b2PolygonDef();
pdBox.SetAsBox(0.3, 0.2);
pdBox.density = 1;//密度(1平方メートルあたりの重量(kg))
//ボディの生成
_bBox = _world.CreateBody(bdBox);
_bBox.CreateShape(pdBox);
//質量の設定
_bBox.SetMassFromShapes();

前回作成した静体の作成手順に、質量の設定をプラスしたものであることが分かっていただけると思います。
箱のサイズ、床との位置の関係は次の画像のようになっています。

動体(箱)の設定内容

ここまでのスクリプトの全体像は次のようになります。追加部分はで表示してあります。また、ドキュメントクラス名の変更に伴い変更した部分をで表示してあります。

スクリプト:4-2

//Box2D_04_01.as
package {
    //▼インポート
    import flash.display.Sprite;
    import Box2D.Collision.b2AABB;
    import Box2D.Common.Math.b2Vec2;
    import Box2D.Dynamics.b2World;
    import Box2D.Dynamics.b2BodyDef;
    import Box2D.Collision.Shapes.b2PolygonDef;
    import Box2D.Dynamics.b2Body;

    public class Box2D_04_01 extends Sprite {
        //▼プロパティ定義
        private var _world:b2World;
        private var _bBox:b2Body;
        //▼コンストラクタ定義
        public function Box2D_04_01() {
            //▼物理エンジンのセットアップ
            //物理エンジン適用範囲の設定(ステージの100ピクセル外側)

            var worldRegion:b2AABB = new b2AABB();//矩形作成
            worldRegion.lowerBound.Set(-1, -1);
            worldRegion.upperBound.Set(6.5, 5);
            //重力の設定
            var gravity:b2Vec2 = new b2Vec2(0, 9.8);
            //範囲・重力・スリープの有無を指定して物理ワールドを作成
            _world = new b2World(worldRegion, gravity, true);

            //▼床(静体)の生成
            //BodyDefの設定

            var bdFloor:b2BodyDef = new b2BodyDef();
            bdFloor.position.Set(5.5 / 2, 3);
            //ShapeDefの設定
            var pdFloor:b2PolygonDef = new b2PolygonDef();
            pdFloor.SetAsBox(2, 0.15);
            //ボディの生成
            var bFloor:b2Body = _world.CreateBody(bdFloor);
            bFloor.CreateShape(pdFloor);

            //▼箱(動体)の生成
            var bdBox:b2BodyDef = new b2BodyDef();
            bdBox.position.Set(5.5 / 2, 1);

            //ShapeDefの設定
            var pdBox:b2PolygonDef = new b2PolygonDef();
            pdBox.SetAsBox(0.3, 0.2);
            pdBox.density = 1;
//密度(1平方メートルあたりの重量(kg))
            //ボディの生成
            _bBox = _world.CreateBody(bdBox);
            _bBox.CreateShape(pdBox);

            //質量の設定
            _bBox.SetMassFromShapes();
        }
    }
}

→ここまでのファイル【Box2D_04_01.zip

今回は2ページ構成です。次はようやく表示について。

このサイトへのご意見・ご感想は[takuya@haphands.com]までお願いします!