【问题标题】:Bouncing ball stops bouncing?弹跳球停止弹跳?
【发布时间】:2013-05-23 02:29:04
【问题描述】:

我找不到如何提问,所以link 有一个演示。我很确定这是一个简单的问题,但我似乎找不到原因。

我的问题是:为什么球停止弹跳?是不是像乘法或除法中的舍入之类的东西……

   void move() {
        PVector v0 = v;
        PVector dv = PVector.mult(a, deltaT);
        v.add(dv);

        PVector d = PVector.add(
            PVector.mult(v0, deltaT),
            PVector.mult(dv, deltaT * 0.5));

        move(d.x, d.y);
    }


    void move(float dx, float dy) {
        p.x += dx;
        p.y += dy;

        if (p.x > width - r) {
            p.x = width - r;
            v.x = -v.x;
        }
        if (p.x < r) {
            p.x = r;
            v.x = -v.x;
        }
        if (p.y > height - r) {
            p.y = height - r;
            v.y = -v.y;
        }
        if (p.y < r) {
            p.y = r;
            v.y = -v.y;
        }
    }

【问题讨论】:

    标签: game-physics processing.js


    【解决方案1】:

    Ball 对象的每个Move 中都有一个PVector 重力 = new PVector(0, 0.0025);) 在设置()中

    ball.a = gravity;
    

    然后在每一个移动

     PVector dv = PVector.mult(a, deltaT);
    

    最终这会导致 PVector dv 值为零。

    如果你改变了

    PVector gravity = new PVector(0, 0.0025);
    

    到

    PVector gravity = new PVector(0, 0.025);
    

    你会看到更强烈的重力效应。

    【讨论】:

    • 0.0025 不是&lt; 0 和PVector.mult(a, deltaT) 在每一步中创建相同的dv 值,即&gt; 0。所以我不认为这是原因(或者我没有正确理解你:)。即使增加重力也会让同样的事情发生得更快。
    【解决方案2】:

    这部分代码有问题:

    if (p.y > height - r) {
       p.y = height - r;
       v.y = -v.y;
    }
    

    假设高度为 600,r 为 10。当球击中底部时 (py > (600 - 10)),它会重置为 (600-10)。但是球可能会撞到低于此的底部: p.y 可能高于高度,从而导致您遇到的问题。在这种情况下,正确的代码是:

    if (p.y > height - r) {
       p.y = (p.y - height) + (height - r);
       v.y = -v.y;
    }
    

    成为 (p.y - height) 每次球反弹时你会失去什么。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多