我想为游戏创建一些physx,然后从一个小示例开始,以了解其工作原理。在此期间,我遇到了一些问题,但我以90%的比例解决了它们。
为了创建示例,我研究了其他一些示例,并创建了一个示例:codeflow.org/entries/2010/aug/28/integration-by-example-euler-vs-verlet-vs-runge-kutta/
首先-这是肮脏且效率低下的代码,我只对以下两个问题感兴趣:
#1有一个“ timestep”循环可创建精确的椭圆,但是如果我移动1个对象(第二个是静态的),例如steps = 5,则椭圆是精确的,但是如果两个对象都是动态的,则曲线完全不准确。
但是以1 = 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集成怎么了?
最佳答案
首先,您使用的不是Verlet,而是辛欧拉方法。
其次,将耦合系统视为耦合系统至关重要。在这种特殊情况下,这对steps=1
正确。 steps
的任何其他值或这种样式的Verlet实现都会破坏方法的一致性。
始终一次计算系统所有组件的加速度,而不更新其间的任何位置或速度值。
关于javascript - Verlet/Euler集成不准确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30968407/