Verlet / Euler Integration是不准确的

时间:2015-06-21 19:20:56

标签: javascript physics game-physics verlet-integration

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

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

首先 - 这是脏和低效代码,我只对以下两个问题感兴趣:

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

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

planet1.updateVelocity(planet2.position);

planet1.updatePosition();
planet1.repaint();
带有1个静态的

jsfiddle示例 - http://jsfiddle.net/hnq8eqta/ 更改window.steps(1或5)以进行测试。

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

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

planet2.updatePosition();
planet2.repaint();
带有2个动态的

jsfiddle示例 - 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集成有什么问题?

1 个答案:

答案 0 :(得分:1)

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

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

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