数学:尽管帧速率平稳减速弹丸

时间:2015-09-17 12:43:20

标签: c++ math

我有一个正在旅行的球:

ball.x += travelDirection.x * timeDelta * ballSpeed;
ball.y += travelDirection.y * timeDelta * ballSpeed;

现在,当球到达一定距离时,它开始变慢,我使用

来做到这一点
BallSpeed *= 0.93458; 

在每个帧的更新函数中,直到ballSpeed小于1,此时我们认为球已停止。

我的问题是,如果帧速率比正常速度快,这意味着它的速度会比我想要的速度慢。我希望我需要在上面的计算中使用timeDelta,但我无法弄清楚具体如何。我希望它是一些非常简单的数学,我不知道。我已经进行了搜索,但无法找到我正在寻找的内容。

如果有人可以提供帮助,或指出我的解决方案,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

要实现平稳移动(包括放慢速度),您必须考虑帧速率。可以通过简单地将对象的速度乘以增量时间来完成。

在你的情况下,我会推荐这样的东西:

BallSpeed -= CHANGE_PER_SECOND * delta;

要了解有关时间步的更多信息,请转到here

答案 1 :(得分:1)

通过将球速度乘以每一步的常数,这些值形成几何序列。然后球位置是几何序列的总和,也称为几何序列。 Geometric Sequences and Series都有简单的公式来计算任意项。他们是:

几何序列:a_n = a_1 * r ^(n-1)

几何级数:s_n = a_1 *(1 - r ^ n)/(1 - r)

请注意,由于浮点舍入,使用这些公式计算值可能会产生与每帧增量值计算值不同的结果。我用两种方法组合测试。它显示了输出的最后一个小数位的一些细微差别。根据您的申请,这可能很重要。

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    const float slowRate = 0.93458;
    const float dt = 1.0/60.0;
    const float ballSpeed = 100.0;
    float numSteps;
    float curBallSpeed = ballSpeed;
    float ballPosition;

    ballPosition = 0.0;
    for (float f = 0.0; f < 2.0; f += dt) {
        cout << ballPosition << " " << curBallSpeed << endl;
        ballPosition += curBallSpeed;
        curBallSpeed *= slowRate;
    }
    cout << endl;

    ballPosition = 0.0;
    // Since we are calculating directly, let's only do every second step
    for (float f = 0.0; f < 2.0; f += dt * 2) {
        numSteps = f / dt;
        ballPosition = ballSpeed * ((1.0 - pow(slowRate, numSteps)) / (1 - slowRate));
        curBallSpeed = ballSpeed * pow(slowRate, numSteps);
        cout << ballPosition << " " << curBallSpeed << endl;
    }
    cout << endl;

    return 0;
}

请注意,通过将球的速度与非固定时间增量相乘来更新球的位置会产生不同的结果,因为这并不能说明球在该时间增量上减速。