Box2D Иерархическая связь между телами

У меня произвольно глубокая древовидная структура тел в box2d. Когда родительское тело сталкивается с чем-либо, оно должно перемещать своих детей вперед. С другой стороны, если ребенок перемещается из-за столкновения, к родителю не следует прикасаться. Одно тело может быть родительским для одного тела и дочерним для другого одновременно.

Есть ли способ реализовать это в Box2D? Кажется, ни один из суставов не может это представить, поскольку все они симметричны.

5

Решение

Да. Алгоритмически говоря, используйте концептуально вложенные миры.

Вот некоторый псевдокод для этого. Вам нужно будет заполнить детали, такие как установка тел, чтобы они были динамическими, и какой должна быть плотность Но, надеюсь, код покажет способ сделать это:

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

Другие решения

Других решений пока нет …