0

我有两个对象,当它们之间的距离小于 10 时,我创建了一个关节:

var joint_def = new box2d.b2RevoluteJointDef();
joint_def.bodyA = body1;
joint_def.bodyB = body2;
joint_def.localAnchorA = new box2d.b2Vec2(0, 0);
joint_def.localAnchorB = new box2d.b2Vec2(0, 0);
world.CreateJoint(joint_def);

然而,问题在于,一个物体在另一个物体上传送/跳跃。预期的行为是一个对象在另一个对象之上缓慢移动。

任何想法?谢谢。

4

1 回答 1

1

我相信你有两个问题:

问题 #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 端口中。

这是你需要的吗?

于 2013-12-31T00:03:21.447 回答