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 实现都会破坏该方法的一致性。
始终同时计算系统所有组件的加速度,而不更新其间的任何位置或速度值。
我想为游戏创建一些 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 实现都会破坏该方法的一致性。
始终同时计算系统所有组件的加速度,而不更新其间的任何位置或速度值。