将身体移动到特定位置 - Box2D

时间:2011-05-29 20:00:37

标签: box2d

我有一个b2Body,我想在某个目标位置移动。我不想使用SetPosition函数。我怎样才能实现这个目的:

  1. 改变线速度。
  2. 使用mouseJoint。 (目标位置是固定的。鼠标不参与。)
  3. 我正在使用Box2DAS3 2.1a。任何其他语言的帮助也将不胜感激。

2 个答案:

答案 0 :(得分:48)

最简单的方法是使用SetPosition / SetTransform(position,angle)。例如:

body->SetTransform(b2Vec2(0,0),body->GetAngle())

显然,瞬时跳跃意味着你正在颠覆物理模拟,但它是设置身体位置最简单最直接的方法。

鉴于您不想使用SetPosition(相当于上面发布的代码),那么ApplyLinearImpulse具有适当的力(基于身体的质量和当前速度)将从模拟的角度来看,这个技巧更为正确,但鉴于潜在的副作用等,可能会出现更多问题。

无论如何,iforce2d覆盖SetLinearVelocity ...,我想补充一点,即使不涉及“鼠标”,鼠标关节也非常有用。

答案 1 :(得分:20)

最简单的方法是设置身体的线速度,使其在一个时间步长内覆盖必要的距离。例如。如果身体需要移动(2,3)个单位以到达所需的位置并且您的时间步长为60Hz,则可以使用SetLinearVelocity(120,180)一次。在下一个时间步骤中,您当然必须将速度设置回零以阻止它飞向远处。如果您使用了SetTransform,那么结果并没有太大的不同,除了CCD可以工作,如果有什么事情会被打乱。

如果您不希望身体在一个时间内到达,只需限制它可以拥有的最大速度。

如果你更愿意使用ApplyForce / ApplyLinearImpulse,你可以做类似的事情,但你也需要考虑身体的当前速度。您可能会发现此页面有用,它解释了此页面的轮换版本但原理是相同的:http://www.iforce2d.net/b2dtut/rotate-to-angle