在Box2D中改变方向时如何更新速度?

时间:2017-04-09 05:39:37

标签: box2d physics-engine

我正在写一个精灵,身体以恒定速度移动。所以在时间步骤中就是这样:

const v = body.getLinearVelocity();
v.normalize();

body.setLinearVelocity(v * speed);

然后我想听鼠标点击事件,精灵会相应地移动到新的方向。

这就是我在mouseclicked事件处理程序中所做的事情:

const point = /* new Point on screen */
const rotation = Math.atan2(point.y - player.y, point.x - player.x);
body.setTransform(body.getPosition(), rotation);

但是当我点击鼠标时,我的精灵不会转向新方向,它会以相同的恒定速度向旧方向移动。我可以看到每个时间步都改变了身体的角度。它只是不会走向新的方向。

如何将我的精灵转向Box2D的新方向?

2 个答案:

答案 0 :(得分:0)

最好使用applyForce()和/或applyImpulse(),因为这会让身体真正移动。 setTransform(),好吧,#"梁"它是新的变换,没有任何动作。

当您使用apply*方法时,B2D将计算所有速度,包括角度速度,这将导致逼真的模拟。如果应该发生非现实的事情,应该使用setTransformsetLinearVelocity之类的东西。

如果你的身体在整理过程中表现得像真正的那样,你需要计算使它移动到所需的新位置所需的力量,定期

答案 1 :(得分:0)

通过调用b2Body::SetLinearVelocity方法可以即时更新Velocity。这可能会改变身体速度的大小和/或方向。

仅改变身体的行进方向:

  1. 获取正文的当前线速度(调用b2Body::GetLinearVelocity)。
  2. 将返回的b2Vec2的本地副本旋转到新标题。
  3. 将新的线性速度设置为旋转的b2Vec2(调用b2Body::SetLinearVelocity)。
  4. 但请注意,在物理世界中things with mass basically can't instantaneously change their velocities。因此,如果您的精灵具有质量,那么从物理角度来看,以这种方式改变精灵的速度是不太现实的。如果它具有质量,那么正如菲利普所解释的那样,applyForceapplyImpulse是用来提供更加真实的速度变化的方法(从物理学的角度来看)。