Verlet / Euler 积分不准确

Verlet / Euler Integration is inaccurate

我想为游戏创建一些 physx,我从小例子开始了解它是如何工作的。在此期间我遇到了一些问题,但我在 90% 内解决了它们。

为了创建我的示例,我研究了一些其他示例并创建了我使用的这个示例:codeflow。org/entries/2010/aug/28/integration-by-example-euler-vs-verlet-vs-runge-kutta/

起初 - 这是肮脏且低效的代码,只有一件事我对两个问题感兴趣:

#1 有 "timestep" 循环来创建准确的椭圆但是如果我移动 1 个对象(第二个是静态的)例如步数 = 5,椭圆是准确的,但如果两个对象都是动态的,则曲线完全不准确。

但是 运行 steps = 1 我的对象更准确(什么?)此外,如果 1 个对象是静态的,我的椭圆有点不准确。

planet1.updateVelocity(planet2.position);

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

jsfiddle 示例 with 1 static - 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 个具有更大的初始矢量,则两个对象的轨迹都是奇怪的并且它们 运行 远离屏幕.这个算法正常吗?我们可以在这里做非常相似的模拟: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 集成有什么问题?

首先,你用的不是Verlet,而是辛欧拉法

其次,将耦合系统视为耦合系统至关重要。在这种特殊情况下,steps=1 恰好是正确的。 steps 的任何其他值或此样式的 Verlet 实现都会破坏该方法的一致性。

始终同时计算系统所有组件的加速度,而不更新其间的任何位置或速度值。