【问题标题】:C++ - Smooth speedup and slowing of objectsC++ - 对象的平滑加速和减速
【发布时间】:2014-02-04 23:22:32
【问题描述】:

我正在处理 Cocos2dx 中的一些对象位置,但这个问题几乎适用于所有需要平滑启动和停止的情况。

这就是我要找的东西:

给定 x = 0 的原点位置和 x = 8 的最终位置,我想慢慢加速并从起点越远越远,然后在到达终点时减速。有没有一个平滑算法?

【问题讨论】:

  • 网站easings.net 是各种缓动功能的良好来源。您所描述的可能属于easeInOutQuart 或easeInOutExpo。虽然代码是用 JavaScript 编写的,但我发现移植到 C/C++ 非常简单。
  • @flashk 谢谢。我什至不知道这个词。

标签: c++ algorithm interpolation


【解决方案1】:

有很多算法可以解决这个问题。一种想法是设置线性插值:

x(t) = t * x0 + (1.0 - t) * x1;

如果您将 t 的值从 0.0 到 1.0 均匀分布,您将获得平滑的线性动画。

如果你想要慢启动和慢结束,你可以使用t = sin(theta)/2.0 + 1.0 for theta from -pi/2 to pi/2。

【讨论】:

  • 后者大概是我最先想到的解决方案。上次我这样做时,我还想要一条更漂亮的路径,所以用样条曲线结束。
  • 再想一想,我不确定正弦函数是否真的启动缓慢。但是某种样条曲线肯定可以解决问题。
  • 余弦会。 (X 轴,不是 Y 轴,投影。)
  • 这并不平滑:t=0 时的加速度是无限的,中间为零,而 t=1 时的加速度为负无限。你真的不能做得比这更糟。
【解决方案2】:

二阶平滑路径在前半部分具有恒定加速度,然后在第二部分具有恒定减速度。

这意味着您从x=0 加速到x=4。公式为x(t)=a*t*t,因此您选择的加速度a 直接影响所需时间。如果您将减速设置为相同的值,您将在 x=8 的两倍时间后到达。因此,第二部分的公式是x(t) = 16 - a*t*t。中途时间点为t=sqrt(4/a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多