フラッシュ上の物理学。 Box2Dエンジン



高速で便利で強力なオープンソースの物理エンジン。 カットの下-リンク、小さなチュートリアルと使用例。



参照資料



Box2Dプロジェクト自体は、このアドレス( http://www.box2d.org/ )にありますこのアドレスでは、その機能について読んだり、フォーラムでチャットしたりできます。

AS3ポートはそれから作成され、ホームページはhttp://box2dflash.sourceforge.net/です。 このエンジンの機能を示すビデオが投稿されています。 ところで、すべて金曜日)





使用法(最も基本的な)



1.「世界」を作成します。すべての計算はこの世界内でのみ行われ、境界を越えるオブジェクトは計算から除外されます。 したがって、マージンで行うこと(WIDTHおよびHEIGHT-ウィンドウサイズ):

// world bounding box

var worldAABB : b2AABB = new b2AABB();

worldAABB.lowerBound.Set(-WIDTH, -HEIGHT);

worldAABB.upperBound.Set(2*WIDTH, 2*HEIGHT);



// create world. zero gravity + use "sleeping" for objects

m_world = new b2World(worldAABB, b2Vec2.Make(0, 0), true );




* This source code was highlighted with Source Code Highlighter .






2.オブジェクトをワールドに追加します。

オブジェクトは2つのコンポーネントによって特徴付けられます。

1つ目は、オブジェクト(その「表面」)の幾何学的表現です。 各オブジェクトは、凸多角形または円である複数の形状で構成できます(ただし、基本的な形状を拡張して独自の形状を作成することを妨げるものはありません)。

また、密度、摩擦力なども設定します。

// shape definition

var bodyShapeDef : b2PolygonDef = new b2PolygonDef();

// as rectangle

bodyShapeDef.SetAsBox(w/2, h/2);

// density

bodyShapeDef.density = 1.0;

// friction

bodyShapeDef.friction = 0.3;




* This source code was highlighted with Source Code Highlighter .






2番目は、オブジェクト自体、その位置、質量、慣性モーメントなどです。

オブジェクトの説明:

// object definition

var bodyDef : b2BodyDef = new b2BodyDef();

// world position

bodyDef.position.Set(xc, yc);

// linear "friction with world"

bodyDef.linearDamping = 0.3;

// angular "friction with world"

bodyDef.angularDamping = 0.3;




* This source code was highlighted with Source Code Highlighter .






オブジェクトの作成(世界に自動的に登録されます)。 以前に作成した幾何学的表現の彼への割り当て、およびその密度と形状に基づいたすべての物理パラメーターの(非常に便利な)自動計算。

// create object from definition

var body : b2Body = m_world.CreateBody(bodyDef);

// create object shape from shape definition

body.CreateShape(bodyShapeDef);

// calculate mass, center of mass and inertia

// based on shape

body.SetMassFromShapes();




* This source code was highlighted with Source Code Highlighter .






オブジェクトの3番目(オプション)のコンポーネント、つまり画面上のプレゼンテーションがあります。 開発の初期段階では、b2DebugDrawクラスを使用できます。b2DebugDrawクラスは、すべてのオブジェクト、オブジェクト間の関係などを表示します。 しかし、たとえば、独自のMovieClipと物理オブジェクトを接続する方法は?

最も一般的に使用される方法は、作成されたオブジェクトのuserDataフィールドを使用することです。

このフィールドの画面表示を覚えておいてください。

// save screen object in userData field

body.SetUserData(bodyDisplayObject);



* This source code was highlighted with Source Code Highlighter .






3.エミュレーション

ここではすべてが簡単です。 ワールドには、 ミリ単位のステップ時間と、このステップで実行する必要がある反復回数をとるステップ関数があります。 エミュレーションの後、世界のすべてのオブジェクトを調べ、userDataフィールドに画面表現が含まれている場合、物理オブジェクトのフィールドに従ってこのビューの位置/回転を更新します。

// calculate physics

// using 10 steps of physics for each frame

m_world.Step(dt, 10);



// loop for all physic objects

for ( var body : b2Body = m_world.GetBodyList(); body; body = body.GetNext())

{

// if userData is not a shape, then skip this object

if (!(body.GetUserData() is Shape))

continue ;



// update screen object to be equal physical object

body.GetUserData().x = body.GetPosition().x;

body.GetUserData().y = body.GetPosition().y;

body.GetUserData().rotation = body.GetAngle() * 180.0 / Math.PI;

}




* This source code was highlighted with Source Code Highlighter .








ヘビを作成するために小さなアプリケーションを作成しました。 80個の長方形がRevoluteJointsによってペアで接続され、回転制限は+ -20度です。 マウスが動くと、ヘビの頭の部分がカーソルの方向に衝動を受け、その結果、ヘビ全体がクリープします。 また、世界ではオブジェクトが配置されているため、巡回するものがあります。

クリックすると、アプリケーションは独自の描画とb2DebugDrawを切り替えます。

アプリケーション-http://www.rexxar.ru/snake/

ソース-http://www.rexxar.ru/snake/src.zip



別のテスト-影響のポイントを示します。 クリックすると、新しい長方形が作成され、地面に落ちます。

アプリケーション-http://www.rexxar.ru/phys/



おわりに



エンジンの分析とサンプルの作成には文字通り数時間かかり、物理学をエミュレートするための非常にシンプルで便利で高速かつ強力なツールでした。 使用します。




All Articles