我有一个b2Body,我想在某个目标位置移动。我不想使用SetPosition函数。我怎样才能实现这个目的:
我正在使用Box2DAS3 2.1a。任何其他语言的帮助也将不胜感激。
答案 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