簡體   English   中英

Box2D機構之間的層次連接

[英]Box2D Hierarchical Connection Between Bodies

我在box2d中有一個任意深度的樹體結構。 當父體碰撞任何東西時,它應該移動它的孩子。 另一方面,如果孩子因碰撞而移動,則不應觸摸父母。 一個身體可以是一個身體的父母,另一個身體可以是另一個身體的父母。

有沒有辦法在Box2D中實現這個? 沒有一個關節似乎能夠代表這一點,因為它們都是對稱的。

是。 從算法上講,使用概念上嵌套的世界。

這是一些偽代碼。 您需要填寫詳細信息,例如將機構設置為動態以及密度應該是多少。 但希望代碼能夠顯示完成此任務的方法:

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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM