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);
但这就是我得到的:
添加圆圈后,我无法移动栏。这是固定的。但我希望它加入这个圈子。我试图将锚点更改为不同的位置,但它没有帮助。我错过了什么?也许不可能将动态体连接到多个静态体。
答案 0 :(得分:1)
来自box2d手册:
所有关节都连接在两个不同的身体之间。 一个人可能是静止的。
您可以手动移动静态物体,但是您应该小心,以免在两个或多个静态物体之间挤压动态物体
你在这里有效地完成了将杆体压在两个带有旋转关节的静止体之间。静态物体无法移动 ,因此您看到的输出实际上是有意义的。第一个旋转接头(连接盒和连杆)允许杆的远端移动(旋转)。然而,当这个远端通过另一个限制所有运动但是旋转的关节连接到另一个静止体时,它不再移动。因此,在将杆体与两个不同的静止体连接后,杆体的旋转将变得固定是有道理的。
我搜索了box2d代码并没有发现任何直接设置通过关节连接的身体旋转的东西。
你想做什么?看起来你可能试图让球随着杆的末端移动,在这种情况下我会建议让球成为一个动态的身体(所以它可以移动)。此外,根据您的工作情况,焊接接头可能更合适。