2013-02-24 68 views
3

據我瞭解,有一個非常標準的方法來實現引力,這幾乎是真正的交易;在每個時間步中向對象的向下垂直速度添加一個數字(比如9.8)。重力物理,避免無限反彈?

但是,這個簡單的數學問題導致了我的程序中出現了「無限反彈」問題(and apparently others)。到目前爲止,簡單的測試案例有一個球直下,並擊中「地板」。在碰撞時,球的矢量被偏轉並減少1/4(佔位符係數恢復)。在每個時間步中,重力值(在我的情況下大約爲2)被添加到矢量中。結果,球反彈,然後反彈,然後下降......然後,而不是真正停止,或者甚至停止(真正的目標),它在屏幕底部上下抖動。調試讀數表明它的速度永遠不會低於2幀超過幾幀,因爲這個常量只是不斷增加和取消,並無限期地重新添加。

現在,瞭解爲什麼不是最難的部分。這正是我從一開始就害怕的事情,我只是認爲有一些數學魔術我忽略了,因爲在解釋數學時沒有人真的提到過這樣的問題。但是 - 因爲從來沒有人討論過它 - 這讓我想知道,修復它的「典型」方法是什麼?

編輯:相當下班後,我已經確定,使用單獨的加速度值不會單獨解決這個問題 - 它仍然會一直嘗試添加重力的一些固定比例。恆定時間步長意味着恆定加速度恆定加速度意味着等速度增加。上彈跳恢復係數將導致速度降低到一個點,並否定加速度,但加速度會從0重新開始像這樣:

  1. 加速度從0開始,速度爲y。
  2. 加速度遞增(g​​rav * timestep)。
  3. 速度按加速度遞增。
  4. 重複2-3次,直至與地面碰撞。
  5. 加速度現在返回0.
  6. 速度矢量相應地反映,然後乘以CoR。
  7. 當速度從負值變爲0再次變爲正值時,重申2-3。
  8. 重申2-7,每次反彈比最後一次節省動力。
  9. 反彈現在非常小。
  10. 速度現在小於(grav * timestep)。
  11. 碰撞與地板設置加速回0.
  12. 加速度再次增加(grav * timestep)。
  13. 速度通過加速度增加 - 現在足以一次擺動從負向正。
  14. 無限重複11-13。

現在,整體問題是而不是速度永遠不會等於0.這是預期的。但是,也有人預計,是一個無限的減少號碼。係數爲0的恢復係數。5,由此產生的反彈速度應該是最後一次的反彈速度的一半,逐漸減小,直到它可以作爲「停止」被丟棄。通過引入純粹的常量加法 - 無論是直接添加速度還是將其添加到另一個增加速度的值 - 都會產生此問題。我需要知道如何解決這個問題,具體而言。

+0

你爲什麼要將引力常數加到速度上?它應該應用於加速度。 – 2013-02-24 14:12:01

+0

@WilliamPursell目前沒有「加速」的價值。球想要在時間步的末尾處於x,y處,並且重力影響y的位置。我會研究真實加速度值的可行性。 – DigitalMan 2013-02-24 14:57:41

+1

這是由於您的集成方案不足。當球離地面太近時,速度的增加必須是整個加速度值的一小部分,因爲在落地之前,球向下移動的時間不到整個時間步。 – 2013-02-24 15:49:07

回答

0

爲了解決這個問題,你需要做的唯一事情是當球擊中地面反向垂直速度,並把球的屏障使球會鎖定在了地上,因爲9.8/4向上速度不足以「解鎖」它並將其設置爲另一次反彈。

1

剛剛處理了同樣的問題。

這裏是固定它爲我的代碼:

if (cat.y + cat.height >= ground.y) // if the cat has hit the ground 
{ 
    cat.y = ground.y - cat.height; // reset to the bottom 
    cat.vector.y = Math.round(COR * -cat.vector.y); // might want to round down 
} 

這裏最重要的部分是四捨五入。