2017-04-09 47 views
0

我正在写一个精灵,以恒速运动的身体。因此,它是这样的时间步长:如何在Box2D中改变方向时更新速度?

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

body.setLinearVelocity(v * speed); 

然后,我要听的mouseClicked事件和精灵将相应地移动到新的方向。

这是我在的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中打开我的精灵并将其移向新的方向?

回答

0

最好使用applyForce()和/或applyImpulse(),因为这会使身体实际移动。 setTransform(),好吧,将它“束”到新的变换中,而没有任何移动。

当您使用那些apply*方法时,B2D将计算所有速度,包括角速度,结果是逼真的模拟。如果发生不切实际的事情,应使用setTransformsetLinearVelocity之类的东西。

如果你的身体应该表现得像colision方面真正的一个来回,你需要计算所需的力,使其移动到所需的新的地方,经常

+0

对不起,我仍然不明白你的意思是“束”到新的变换。我明白,当我希望它逐渐移动到一个速度时,最好使用'applyForce()'/'applyImpulse()',但我只是希望它以恒定的速度移动,开始并永远不停止或开始。我的问题是如何在保持原有速度的同时向新的方向发展。 – newguy

+0

也许不是说“梁”,而应该说“传送”。 'body.setTransform'就像拿起身体并将其放置在新的位置。 –

0

速度可瞬间更新通过调用b2Body::SetLinearVelocity方法。这可能会改变人体速度的大小和/或方向。

如果只改变一个体的行进方向:

  1. 获取体的当前线速度(呼叫b2Body::GetLinearVelocity)。
  2. 将返回的b2Vec2的本地副本旋转到新标题。
  3. 将新的线速度设置为旋转的b2Vec2(请致电b2Body::SetLinearVelocity)。

但是请注意,在物理世界things with mass basically can't instantaneously change their velocities。所以如果你的精灵有质量的话,那么以这种方式改变你的精灵的速度从物理角度来说是不太现实的。如果它具有质量,那么正如phillip解释的那样,applyForceapplyImpulse是旨在提供更为现实(从物理学角度)更改速度的方法。

相关问题