我有两个物体,当它们之间的距离小于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);
但问题是,一个物体传送/跳跃在另一个物体之上。预期的行为是一个物体慢慢地移动到另一个物体之上。
有什么想法吗?感谢。
答案 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:
如果在每个正文的本地空间中定义了两个锚点:
请注意,“T”正在旋转,但另一个身体没有移动。但是关节使它们彼此保持旋转距离。
如果您将两个本地锚点设置为(0,0):
通常,如果您使用Initialize(...)方法,请使用它来创建关节。
问题#2: 如果你从相距10米的身体开始,那就是你创造旋转关节的地方,这就是他们留下的地方。如果你希望他们开始相互走向...我认为最简单的方法(我已经完成了...... see here)是在两者之间连接绳索,然后每一个“更新物理循环,做这样的事情(知道绳索关节是第一个也是唯一连接到身体的关节):
b2JointEdge* jointEdge = GetBody()->GetJointList();
b2RopeJoint* rope = (b2RopeJoint*)jointEdge->joint;
rope->SetMaxLength(rope->GetMaxLength()-_ropeClimbDistPerUpdate);
当绳索长度小于某个公差时,连接您的旋转关节。它可以让蜘蛛从小行星中摆脱出来......
注意您也可以使用b2DistanceJoint而不是b2RopeJoint。绳索关节约束最大距离,而距离关节约束固定距离。对于这种情况,它应该大致相同。绳索接头可能不存在于其他box2d端口中。
这是你需要的吗?