我正在写一个“物理模拟”(可以这么说),其中使用键盘箭头向球体施加力。在这个最新的迭代中,我添加了阻力,就像球体在空中一样。然后,对于某些值,阻力计算开始爆炸!数字变得太大,然后是 Infinity,然后是 NaN(Infinity / Infinity 除法的原因)。
你可以在这里看到它发生:http: //gool.jit.su/the-drag。打开控制台并开始向左或向右移动。几秒钟后它就坏了。您可以在控制台中看到正在记录的拖动值,直到它变为 NaN 之前。(我们有很大的力量和很小的质量)
我真的很想了解正在发生的事情以及发生的原因,但也许已经有关于类似问题的信息,因为我无法找到或某种最佳实践来控制数量......也许选择一个价值成为我的 MAX 并且每次都对其进行测试...
非常欢迎任何想法、帮助和建议。我想我即将学到一些重要的东西,但仍然需要朝着正确的方向努力。:)
更新 2:@Beta 的测试(排序)
在@Beta 发表评论后,我进行了这个测试,实际上他的计算似乎显示了我的模拟在哪里崩溃。(当测试返回真时控制台在 x 轴上记录速度,否则为假)
更新 1:一些代码
大多数“物理”发生在这里:
update: function update(k, dt) {
var up = k.UP,
right = k.RIGHT,
down = k.DOWN,
left = k.LEFT;
up = up && -this.output;
right = right && this.output;
down = down && this.output;
left = left && -this.output;
this.force.x = left + right;
this.force.y = up + down;
this.calculate_drag(this.velocity);
if (!isNaN(this.drag.x)) {
console.log(this.drag);
}
// this.net_force.x = this.force.x;
// this.net_force.y = this.force.y;
this.net_force.x = this.force.x + this.drag.x;
this.net_force.y = this.force.y + this.drag.y;
this.acceleration.x = this.net_force.x / this.mass;
this.acceleration.y = this.net_force.y / this.mass;
this.velocity.x += this.acceleration.x / (1000 / dt);
this.velocity.y += this.acceleration.y / (1000 / dt);
this.momentum.x = this.mass * this.velocity.x;
this.momentum.y = this.mass * this.velocity.y;
this.position.x += (this.velocity.x * global.METRE) / (1000 / dt);
this.position.y += (this.velocity.y * global.METRE) / (1000 / dt);
this.energy += (abs(this.net_force.x) + abs(this.net_force.y)) / (1000 / dt);
}
和这里:
calculate_drag: function calculate_drag() {
var c = 0.47,
a = PI * this.radius * this.radius,
rho = 1.22,
direction = function direction(velocity) {
if (velocity === 0) {
return 1;
}
return velocity / abs(velocity);
};
this.drag.x = -0.5 * c * a * rho * this.velocity.x * this.velocity.x * direction(this.velocity.x);
this.drag.y = -0.5 * c * a * rho * this.velocity.y * this.velocity.y * direction(this.velocity.y);
}
gee.js 中 gPrototype 的两种方法。