我找到了解决方案。我没有仔细阅读所有来源,但之前有一些使用 Physicsjs 集成器的经验(https://coderwall.com/p/ntb6bg/metres-seconds-and-newtons-in-physicsjs)我开始认为它们可能是我的问题。
因此,显然,verlet 积分器是 Physicsjs 模拟的默认值。我以前用过它,它很棒。但是verlet积分器使用前一个位置来计算下一个位置(不仅仅是位置,它比那个复杂一点),所以手动改变它搞砸了。我不知道如何“修复”,或者是否有可能。但还有另一种方式。
在我的情况下,我所拥有的是一个普通的牛顿模拟,没有花哨的东西或疯狂的值(我在这里使用技术术语......)所以欧拉积分器工作得很好,因为它不使用先前的位置来计算下一个它是完美地“远程传输”我的物体而不会失去速度、方向等。
只要记住加载积分器:
void function (define) {
'use strict';
define(
[
'physicsjs',
'physicsjs/behaviors/attractor',
'physicsjs/behaviors/body-collision-detection',
'physicsjs/behaviors/sweep-prune',
'physicsjs/bodies/circle',
'physicsjs/integrators/improved-euler'
],
physicsModule
);
//
function physicsModule(physics) {
return physics;
}
}(define);
并记住将积分器添加到模拟中:
void function (define) {
'use strict';
define(
[
'physics'
],
simulationModule
);
//
function simulationModule(physics) {
var simulation = physics();
simulation.add(physics.behavior('body-collision-detection'));
simulation.add(physics.behavior('sweep-prune'));
simulation.add(physics.integrator('improved-euler'));
return simulation;
}
}(define);