0

我正在写一个“物理模拟”(可以这么说),其中使用键盘箭头向球体施加力。在这个最新的迭代中,我添加了阻力,就像球体在空中一样。然后,对于某些值,阻力计算开始爆炸!数字变得太大,然后是 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 的两种方法。

4

1 回答 1

0

你有一个增加变量值的循环。值会增长得非常快。NaN 可能是某些浮点溢出的结果。

net_force += drag;
drag = velocity * velocity;
velocity += net_force;

所以你的“物理学”可能是不正确的。

于 2013-06-21T01:04:40.517 回答