2

我有以下函数循环运行。这是一个基本的弹跳球。我的问题是球 dy 每次反弹都会增加。我将如何使它每次反弹到相同的高度?

function ballUpdate(elapsed)
{
    var timeModifier = elapsed;
    ball.x += (ball.dx*timeModifier);
    ball.y += (ball.dy*timeModifier);
    if(ball.y <= 0)
    {
        ball.dy *= -1;
        ball.y = 0;
    }
    else if(ball.y > 0)
    {
        ball.dy += -.5*timeModifier;
    }
}

function draw()
{
    ball.update();
}

function main(elapsed)
{
    keyinput(elapsed);
    ballUpdate(elapsed);
}

animLoop(main,draw,15);
4

1 回答 1

1
  1. 第一个明显的错误是你试图将速度乘以经过的时间......它不起作用。您要做的是在每次迭代时将速度 (dx,dy) 添加到 (x,y) ......所以忘记这个elapsed

  2. 加速度将始终存在......你不需要它if(ball.y > 0)

  3. 由于调整ball.y = 0,当小球触及极限(地板)时,反转速度不够。当球真正触及极限时,你必须考虑球的确切速度。为了做到这一点,你必须在这里使用势能 + kinect 能量概念(如果你想知道方程的细节,谷歌一下)。


基本上这就是你想要的。

function ballUpdate(elapsed)
{   
    var acceleration = -0.5;

    ball.x += ball.dx;
    ball.y += ball.dy;

    if ( ball.y <= 0 )
    {
        ball.dy = Math.sqrt( -2 * acceleration * ( ball.y - ball.dy ) + ball.dy * ball.dy );
        ball.y = 0;
    }

    ball.dy += acceleration;
}

复制和粘贴。它应该工作。我在这里所做的是测量球的总能量作为它达到极限之前的势能加上球在它达到极限之前的动能。在那之后,我把这些能量完全转换回了kinect能量,所以它给了我一个新的速度,那就是球碰到极限时的速度。(如地板或其他任何东西)。

于 2013-05-13T08:21:33.367 回答