2015-06-21 32 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