循环以插值

时间:2019-06-20 13:38:50

标签: c++ animation

我有一个游戏,我想为UI的某些对象设置动画,并且我想在动画中使用某种平滑的步骤。如何使用for循环或使用主要更新代码来做到这一点?

例如我有这个代码

void CGameClass::Update() {
   // doing game stuff here
}

在这部分代码中,我想将代码放入这些动画中,例如,将记分牌从X移到Y,并且我不希望这些代码是线性的,我想制作一个这两个值使步伐平稳。

编辑::我找到了一个可以做到这一点的函数,但是它是线性的

float LinearInterpolate(float v1, float v2, float a)
{
    return  v1*(1.0f - a) + v2*a;
}

如何旋转此代码使其成为正弦曲线?

1 个答案:

答案 0 :(得分:1)

三次贝塞尔曲线函数使用两个控制点P1和P2定义起点P0和终点P3之间的路径。在您链接的网站中,我们有:

  • P0 =(0,0)
  • P1 =(0.755,0.05)
  • P2 =(0.855,0.06)
  • P3 =(1,1)

给定时间t([0..1]),评估贝塞尔曲线会给您xP0之间的位置P3。 根据您的情况,您希望产生一个职位p,如下所示:

point p = X + (Y - X) * CubicBezier(point(0, 0), point(0.755, 0.05), point(0.855, 0.06), point(1, 1), t)
        = X + (Y - X) * (3 * pow(1-t, 2) * t * point(0.755, 0.05) 
            + 3 * pow(t, 2) * (1-t) * point(0.855, 0.06) + pow(t, 3) * point(1, 1)

在此代码中,X和Y是一些神奇的point类型的输入,支持加法,减法和标量乘法。 t是自动画开始以来的时间(根据一定比例)。 (例如,对于耗时5秒的动画,它可能是(now - start) / 5

如您所见,如果t = 0,则P = X,如果t = 1,则P =Y。确保t在[0..1]范围内是您的责任。