![](https://habrastorage.org/getpro/habr/post_images/1e4/541/8ef/1e45418efce5ba8a49a19ea88ae06528.gif)
高速で便利で強力なオープンソースの物理エンジン。 カットの下-リンク、小さなチュートリアルと使用例。
参照資料
Box2Dプロジェクト自体は、このアドレス( http://www.box2d.org/ )にあります。このアドレスでは、その機能について読んだり、フォーラムでチャットしたりできます。
AS3ポートはそれから作成され、ホームページはhttp://box2dflash.sourceforge.net/です。 このエンジンの機能を示すビデオが投稿されています。 ところで、すべて金曜日)
![](https://habrastorage.org/getpro/habr/post_images/1eb/ce0/781/1ebce0781198aeae9b99252165c5e689.png)
使用法(最も基本的な)
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.エミュレーション
ここではすべてが簡単です。 ワールドには、
// 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/
おわりに
エンジンの分析とサンプルの作成には文字通り数時間かかり、物理学をエミュレートするための非常にシンプルで便利で高速かつ強力なツールでした。 使用します。