2

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

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

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

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

但是以 step = 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 集成有什么问题?

4

1 回答 1

1

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

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

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

于 2015-07-08T16:20:45.243 回答