我相信你有两个问题:
问题 #1:
localAnchorA 和 localAnchorB 是您希望关节所在的点。这将是世界空间中映射到各个物体的局部坐标系中的点。您可以手动执行此操作,也可以使用joint_def 上的函数执行此操作(至少这是它在c++ 中的工作方式):
自动地:
b2RevoluteJointDef jointDef;
b2Vec2 anchor = _body->GetWorldCenter();
jointDef.Initialize(_body, otherBody, anchor);
jointDef.collideConnected = true;
_world->CreateJoint(&jointDef);
手动:
b2RevoluteJointDef jointDef;
b2Vec2 anchor = _body->GetWorldCenter();
jointDef.bodyA = _body;
jointDef.bodyB = otherBody;
jointDef.localAnchorA = _body->GetLocalPoint(anchor);
jointDef.localAnchorB = otherBody->GetLocalPoint(anchor);
jointDef.referenceAngle = otherBody->GetAngle() - _body->GetAngle();
_world->CreateJoint(&jointDef);
您正在使用 b2Vec2(0,0) 初始化锚点(两者)。 我将使用此代码库来演示不同之处:
当您在每个主体的局部空间中定义了两个锚点时:
请注意,“T”在旋转,但另一个物体没有移动。但是关节使它们彼此保持旋转距离。
如果您将两个本地锚点都设置为 (0,0):
一般来说,如果您有 Initialize(...) 方法,请使用它来创建关节。
问题 2:
如果您从相距 10m 的物体开始,并且这是您创建旋转关节的位置,那么它们将停留在此处。如果您希望他们开始彼此靠近...我认为最简单的方法是做到这一点(我已经做到了...见这里)是在两者之间连接一个绳索接头,然后,每次“更新”物理循环,做这样的事情(知道绳索关节是第一个也是唯一一个连接到身体的关节):
b2JointEdge* jointEdge = GetBody()->GetJointList();
b2RopeJoint* rope = (b2RopeJoint*)jointEdge->joint;
rope->SetMaxLength(rope->GetMaxLength()-_ropeClimbDistPerUpdate);
当绳索长度小于某个公差时,连接你的旋转接头。让蜘蛛从小行星上摆动效果很好……
注意 您也可以使用 b2DistanceJoint 代替 b2RopeJoint。绳索接头约束最大距离,而距离接头约束固定距离。对于这种情况,它的结果应该差不多。绳索接头可能不存在于其他 box2d 端口中。
这是你需要的吗?