2011-05-29 31 views
20

我有一個b2Body,我想移動到某個目標位置。我不想使用SetPosition函數。我怎樣才能達到這個使用:將身體移動到特定位置 - Box2D

  1. 改變線速度。
  2. 使用mouseJoint。 (目標位置是固定的,不涉及鼠標)

我正在使用Box2DAS3 2.1a。任何其他語言的幫助也將不勝感激。

+0

你的意思是它固定在一個地方,你希望它被移動,或者你想它移動到某個地方,然後呆在那裏?無論如何請詳細說明。 – Shannon 2011-06-16 07:57:20

回答

41

最簡單的方法實際上是使用SetPosition/SetTransform(position,angle)。例如:

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

顯然,瞬跳意味着你顛覆物理模擬,但它是設置一個物體的位置的最簡單最直接的方式。

鑑於您不想使用SetPosition(相當於上面的代碼),那麼ApplyLinearImpulse與適當的力量(基於身體的質量和當前的速度)將做的伎倆,更從模擬的角度來看是正確的,但是考慮到潛在的副作用可能會造成更多的問題,等等。

無論如何,iforce2d覆蓋了SetLinearVelocity ......,我會補充說鼠標關節是非常有用的,即使當不涉及「鼠標」。

+1

謝謝,body-> SetTransform(b2Vec2(0,0),body-> GetAngle())爲我做了... – 2013-04-13 18:11:58

+0

這是完美的,謝謝。 – 2013-07-09 14:56:31

+0

爲什麼在應用這個後我看不到動畫?它顯示在確定的位置,如'setPosition' – TomSawyer 2017-03-20 06:00:19

19

最簡單的方法是設置身體的線速度,以便在一個時間步中覆蓋必要的距離。例如。如果身體需要移動(2,3)個單位才能到達期望的位置,並且您的時間步長爲60Hz,則可以將SetLinearVelocity(120,180)設置爲一個時間步。在下一個時間步驟中,您當然必須將速度設置回零以停止它飛入距離。這樣做的結果與使用SetTransform的情況沒有多大區別,除了CCD可以工作,並且如果有任何事情發生,它會發生重擊。

如果你不想讓身體在一個時間步到達,只限制它的最大速度。

如果你想使用ApplyForce/ApplyLinearImpulse,你可以做類似的事情,但是你也需要考慮到身體的當前速度。您可能會發現此頁有幫助,它解釋了此旋轉版本,但原理相同:http://www.iforce2d.net/b2dtut/rotate-to-angle

相關問題