在运行时创建关节时,对象传送

时间:2013-12-30 22:46:48

标签: box2d box2dweb

我有两个物体,当它们之间的距离小于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);

但问题是,一个物体传送/跳跃在另一个物体之上。预期的行为是一个物体慢慢地移动到另一个物体之上。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分: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)初始化锚点(两者)。 I'm going to use this code base to demonstrate what the difference looks like

如果在每个正文的本地空间中定义了两个锚点:

enter image description here

请注意,“T”正在旋转,但另一个身体没有移动。但是关节使它们彼此保持旋转距离。

如果您将两个本地锚点设置为(0,0):

enter image description here

通常,如果您使用Initialize(...)方法,请使用它来创建关节。

问题#2: 如果你从相距10米的身体开始,那就是你创造旋转关节的地方,这就是他们留下的地方。如果你希望他们开始相互走向...我认为最简单的方法(我已经完成了...... see here)是在两者之间连接绳索,然后每一个“更新物理循环,做这样的事情(知道绳索关节是第一个也是唯一连接到身体的关节):

  b2JointEdge* jointEdge = GetBody()->GetJointList();
  b2RopeJoint* rope = (b2RopeJoint*)jointEdge->joint;
  rope->SetMaxLength(rope->GetMaxLength()-_ropeClimbDistPerUpdate);

当绳索长度小于某个公差时,连接您的旋转关节。它可以让蜘蛛从小行星中摆脱出来......

注意您也可以使用b2DistanceJoint而不是b2RopeJoint。绳索关节约束最大距离,而距离关节约束固定距离。对于这种情况,它应该大致相同。绳索接头可能不存在于其他box2d端口中。

这是你需要的吗?