Box2D的。我可以在静态框和动态链形状之间进行旋转连接吗?

时间:2014-02-06 18:41:49

标签: c++ box2d

在Box2D中,我可以在静态框和动态链形状之间进行旋转连接,如下图所示吗?我希望能够使用带电机的旋转接头旋转链条形状。 关节在身体上的位置也很重要吗?在实际的形状上它可以但在某个地方之外吗?

enter image description here

以下代码生成两个灯具但它们之间没有旋转关节

    b2BodyDef bd2;
    b2Body* ground = world->CreateBody(&bd2);

    b2PolygonShape shape;
    const b2Vec2 vertices[4] = {
        b2Vec2(-40, -30),
        b2Vec2(40, -30),
        b2Vec2(40, 30),
        b2Vec2(-40, 30) };
    shape.Set(vertices, 4);
    ground->CreateFixture(&shape, 0.0f);


b2BodyDef bd;
bd.type = b2_dynamicBody;
b2Body* container = world->CreateBody(&bd);


b2Vec2 vs[4];
vs[0].Set(-11.583f, 20.806f);
vs[4].Set(-9.164f, -19.383f);
vs[6].Set(9.164f, -19.383f);
vs[8].Set(11.342f, 0.0f);

vs[4].Set(11.583f, 20.806f);

b2ChainShape chain;
chain.CreateChain(vs, 4);
container->CreateFixture(&chain, 0.0f);

b2RevoluteJointDef revoluteJointDef;
revoluteJointDef.bodyA = ground;
revoluteJointDef.bodyB = container;
revoluteJointDef.collideConnected = false;
revoluteJointDef.localAnchorA.Set(0, 0);
revoluteJointDef.localAnchorB.Set(0, 0);
b2RevoluteJoint* m_joint = (b2RevoluteJoint*)world->CreateJoint(&revoluteJointDef);

1 个答案:

答案 0 :(得分:1)

关节锚可以在任何地方,它与任何方式的夹具形状无关。你甚至可以拥有两个没有固定装置的物体,并在它们之间建立联合。

所以是的,你可以在静态框和动态链形状之间建立一个旋转关节。你会遇到的问题是,当一个物体只有链状时,它没有质量,因为形状没有体积。当它没有质量时,Box2D认为它具有无限的转动惯量并且它不会旋转。

你可以通过添加一个具有体积(例如多边形或圆形)的虚拟夹具来解决这个问题。您可以将灯具设置为传感器,这样就不会产生碰撞响应(或将碰撞滤波器标志位设置为零)。

如果你真的不想在身体上有任何其他夹具,你也可以用b2Body :: SetMassData手动设置身体的'质量数据'的值,但是你需要知道什么值设置。找到这些值的最简单方法是首先创建虚拟夹具,使用GetMassData获取值,销毁夹具,然后将值返回SetMassData。