2015-06-21 35 views
2

我想創建一些physx到遊戲,我從一個小例子開始瞭解它是如何工作的。在這期間,我遇到了一些問題,但我解決了他們的90%。Verlet/Euler積分不準確

爲了創建我的例子,我研究了一些其他的例子,並創建了一個我用過的代碼:codeflow.org/entries/2010/aug/28/integration-by-example-euler-vs-verlet-vs-runge-kutta/

在第一 - 這是髒和低效代碼,只有一樣東西我感興趣的兩個問題:

#1有「時間步長」循環創建精確的橢圓形,但如果我移動1對象(第二個是靜態的),例如steps = 5,橢圓是精確的,但是如果兩個對象都是動態的,曲線總是不準確的。

但運行步驟= 1我的對象更準確(什麼?)此外,如果1對象是靜態的,我的橢圓幾乎不準確。

planet1.updateVelocity(planet2.position); 

planet1.updatePosition(); 
planet1.repaint(); 

的jsfiddle例如 1靜態 - http://jsfiddle.net/hnq8eqta/ 變化window.steps(1或5)來測試。

planet1.updateVelocity(planet2.position); 
planet2.updateVelocity(planet1.position); 

planet1.updatePosition(); 
planet1.repaint(); 

planet2.updatePosition(); 
planet2.repaint(); 

的jsfiddle例如 2動態 - http://jsfiddle.net/agbhwe9g/ 變化太步驟。

#2我認爲這不是正常行爲 - 如果1個對象有更大的初始向量,則兩個對象軌跡都是werid,並且它們離開屏幕。這個算法是正常的嗎?我們可以在這裏做的非常相似模擬:phet.colorado.edu/sims/my-solar-system/my-solar-system_en.html 但這是不一樣的......

window.planet1 = new Planet("planet1",250,350,0,1); 
window.planet2 = new Planet("planet2",550,250,0,-1); 
//changed to 
window.planet1 = new Planet("planet1",250,350,0,1); 
window.planet2 = new Planet("planet2",550,250,0,-2); 

例如 - jsfiddle.net/hr1ebq3c/

我的verlet集成有什麼問題?

回答

1

首先,你正在使用的不是Verlet而是辛歐拉方法。其次,將耦合系統視爲耦合系統是非常重要的。在這種特殊情況下,這恰好適用於steps=1steps的任何其他值或這種風格的Verlet實現都會破壞該方法的一致性。

總是立即計算系統所有組件的加速度,而不更新它們之間的任何位置或速度值。

+0

是的,我已經找到解決方案,但這是正確的答案。在應用先前的計算之前,計算新位置和加速度無法計算 - 這是計算錯誤。無論如何,謝謝你的關注:) – Griva