【问题标题】:Box2D Hierarchical Connection Between BodiesBox2D 实体之间的层次连接
【发布时间】:2016-03-16 15:29:14
【问题描述】:

我在 box2d 中有一个任意深度的实体树结构。当父体与任何物体发生碰撞时,它应该移动它的子体。另一方面,如果孩子因碰撞而移动,则不应触摸父母。一个 body 可以同时是一个 body 的 parent,同时也是另一个 body 的 child。

有没有办法在 Box2D 中实现这一点?似乎没有一个关节能够代表这一点,因为它们都是对称的。

【问题讨论】:

  • 如果它回答了您的问题,请考虑接受我的回答,或者留下评论来解释似乎仍未回答的问题。谢谢!
  • 很抱歉,但在那 9 个月中,我实施了一个完全不再基于 box2d 的不同解决方案,因此我无法验证您的解决方案是否有效,尽管听起来很有希望.

标签: c++ box2d box2d-joints


【解决方案1】:

是的。从算法上讲,使用概念上的嵌套世界。

这里有一些伪代码。您需要填写详细信息,例如将主体设置为动态以及应该有什么密度。但希望代码显示了完成此任务的方法:

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

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 2016-09-01
    • 2020-12-07
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多