2016-03-16 29 views
5

私はボックス2dのボディの任意の深いツリー構造を持っています。親の身体が何かに衝突すると、それは子どもを動かすべきです。一方、衝突により子供が動かされた場合、親は触れてはならない。 1つのボディは、1つのボディの親となり、同時に他のボディに親となることができます。Box2D間の階層的な接続

Box2Dでこれを実装する方法はありますか?彼らはすべて対称であるので、どのジョイントもこれを表現することはできないようです。

+0

それは、あなたの質問に答えるならば私の答えを受け入れる考えるか、まだ未回答思われるものを説明するコメントを残してください。ありがとうございました! –

+0

申し訳ありませんが、9ヶ月間、私はbox2dをベースにしていない別のソリューションを実装しました。したがって、あなたのソリューションが有効かどうかを確認することはできません。 – anlumo

答えて

2

はい。アルゴリズム的に言えば、概念的に入れ子にされた世界を使用する。

これにはいくつかの疑似コードがあります。体をダイナミックに設定する、密度を設定するなどの詳細を記入する必要があります。しかし、うまくいけば、コードはこれを成し遂げるための方法を示しています

extern void render(b2World& world, b2Vec2 position); 

b2World world(b2Vec2(0, 0)); 
b2World subWorld(b2Vec2(0, 0)); 

b2BodyDef bodyDef; 

// Create body outside of "parent". 
bodyDef.position = b2Vec2(-15, 14); 
b2Body* otherBody = world.CreateBody(&bodyDef); 

// Setup "parent" body. 
b2Body* parentBody = world.CreateBody(&bodyDef); 
b2Vec2 vertices[] = { b2Vec2(10, 10), b2Vec2(-10, 10), b2Vec2(-10, -10), b2Vec2(10, -10) }; 
b2PolygonShape parentShape; 
parentShape.Set(vertices, 4); 
b2FixtureDef parentFixtureDef; 
parentFixtureDef.shape = &parentShape; 
parentBody->CreateFixture(&parentFixtureDef); 

// Setup container for bodies "within" parent body... 
b2BodyDef childBodyDef; 
// set childWorldBody to being static body (all others dynamic) 
b2Body* childWorldBody = subWorld.CreateBody(&childBodyDef); 
b2ChainShape containerShape; 
containerShape.CreateLoop(vertices, 4); 
b2FixtureDef childContainerFixture; 
childContainerFixture.shape = &containerShape; 
childWorldBody->CreateFixture(&childContainerFixture); 

// First example of creating child body "within" the parent body... 
childBodyDef.position = b2Vec2(0, 0); // Inside child world and with childContainerShape. 
b2Body* bodyInChild = subWorld.CreateBody(&childBodyDef); 
// Call subWorld.CreateBody for all the bodies in the child world. 
// Always create those child bodies within the bounds of vertices. 

for (;;) 
{ 
    world.Step(0.1, 8, 3); 
    subWorld.Step(0.1, 8, 3); 

    render(world, b2Vec2(0, 0)); 
    render(subWorld, parentBody->GetPosition()); 
} 
関連する問題