2
    b2Body* foundation =[self createStaticBodyAtLocation:CGPointMake(15, 15) withSize:CGSizeMake(35, 35)];
    b2Body* beam=[self createDynamicBodyAtLocation:CGPointMake(105, 35) withSize:CGSizeMake(150, 10)];
    b2RevoluteJointDef revoluteJointDef;
    revoluteJointDef.Initialize(foundation, beam, b2Vec2(30.0/PTM_RATIO,30.0/PTM_RATIO));
    _world->CreateJoint(&revoluteJointDef);

上面的代码创建了一个静态体和一个动态体,然后用一个 revolutejoint 将它们连接起来。这是我得到的:

添加第二个静态体之前

然后我添加以下几行来添加另一个主体,这是一个静态圆圈,然后将圆圈和之前添加的栏连接到栏的另一端。

    b2Body *jointBall=[self createCircleAtLocation:CGPointMake(160, 135)];
    revoluteJointDef.Initialize(jointBall, beam, b2Vec2(100.0/PTM_RATIO,10.0/PTM_RATIO));
    _world->CreateJoint(&revoluteJointDef);

但这是我得到的:

添加第二个静态体后

添加圆圈后,我无法移动栏。它是固定的。但我希望它加入这个圈子。我试图将锚点更改为不同的位置,但没有帮助。我错过了什么?也许不可能将一个动态物体连接到多个静态物体上。

4

1 回答 1

1

来自 box2d 手册:

所有关节都连接在两个不同的身体之间。一个物体可能是静止的。

您可以手动移动静态物体,但您应该小心,以免在两个或多个静态物体之间挤压动态物体

您在这里有效地完成了将杆体挤压在两个带有旋转接头的静态体之间。静态物体根本无法移动,因此您看到的输出实际上是有道理的。第一个旋转接头(连接箱和杆)允许杆的远端移动(旋转)。然而,当这个远端通过另一个限制除了旋转之外的所有运动的关节连接到另一个静态物体时,它就不能再移动了。因此,在将杆体与两个不同的静态体连接后,杆体的旋转将变得固定是有道理的。

我搜索了 box2d 代码,没有找到任何直接设置通过关节连接的身体旋转的东西。

你想做什么?看起来你可能试图让球随着杆的末端移动,在这种情况下,我建议让球成为一个动态的物体(这样它就可以移动)。此外,根据您的操作,焊接接头可能更合适。

于 2013-03-02T16:32:52.730 回答