Box2D物体之间的层级连接

5
我有一个在box2d中任意深层次的物体树结构。当父对象与其他对象碰撞时,它应该让其子对象一起移动。另一方面,如果由于碰撞而移动了子对象,则不应触及父对象。一个物体可能同时是另一个物体的父对象和子对象。
有没有办法在Box2D中实现这个功能?似乎没有一个关节能够代表这个,因为它们都是对称的。

如果我的回答解决了您的问题,请考虑接受它,或者留下评论说明仍未解决的问题。谢谢! - Louis Langholtz
很抱歉,在那九个月期间,我实现了一个完全不基于box2d的不同解决方案,所以我无法验证你的解决方案是否可行,尽管它听起来很有前途。 - anlumo
@anlumo 你最终使用了什么解决方案? - Marc J. Schmidt
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接