2017-04-09 43 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是旨在提供更爲現實(從物理學角度)更改速度的方法。

相關問題