c++ - 插值位置动画随着距离变慢

标签 c++ animation interpolation

我正在渲染正在发牌的牌。玩家牌位于屏幕底部,庄家牌更多地位于屏幕顶部。卡片从顶部的“屏幕外”处理。因此起牌点到闲家手牌的距离大于起牌点到庄家手牌的距离。

我正在使用 interpolated_position 值计算卡片当前位置,该值介于 0.01.0 之间。由于距离不同,动画的动画速度也不同。

/// Updates the first animation in the queue then deletes it
void Update(float delta_time)
{
    if (pause == false && !animation_confs.empty())
    {
        interpolated_position += delta_time * (animation_confs[0].speed); // animation speed is 1.3 here
        if (interpolated_position >= 1.0f) // Finished animation reset values
        {
            interpolated_position = 0.0f;
            if (!animation_confs.empty())
            {
                animation_confs.erase(animation_confs.begin());
                return;
            }
        }
        InterpolateFrame();
    }
}

// Interpolates card position between two points based on interpolation factor
void InterpolateFrame()
{
    if (!animation_confs.empty())
    {
        float t = interpolated_position;

        float x1 = animation_confs[0].start.x;
        float x2 = animation_confs[0].goal.x;
        position.x = x1 + t * (x2 - x1);

        float y1 = animation_confs[0].start.y;
        float y2 = animation_confs[0].goal.y;
        position.y = y1 + t * (y2 - y1);
    }
}

这种行为的原因可能是什么?我认为将 delta_time 应用于插值会使速度保持恒定。

最佳答案

您希望我们提供一小段代码但没有提供足够的额外详细信息,从而创造奇迹。

  • 什么是 animation_confs[0].speed 并且它对所有卡片都是恒定的?
  • 什么是 delta_time,它是否取决于卡片要移动多远?

现在,据我了解,你想实现卡片恒速的效果,是吗?如果是这样,我会将速度作为 update 的参数传递,并检查卡是否已经达到了应有的距离。但是,让我们坚持使用在 0 和 1 之间变化的“插值”变量 t。(当然,通过 t 调用距离会造成混淆,请更改它)。您以卡片到屏幕顶部与其最终位置之间的距离为单位来测量到卡片的距离。这没关系,但可能会造成混淆。我想你不想为每个对象引入单独的时间,所以时间是通用的。如果您以与物体相关的单位测量距离并且时间是通用的,那么速度必须与物体相关。假设,您附近有两家商店,一家距离您 100 米,另一家距离您 1000 米。您以 1m/s 的速度行走。如果你的长度单位是 100 米,那么第一家商店距离你 1 个单位(就像你的 t)并且你的速度是每秒 0.01 个长度单位。走另一家店。现在长度单位是 1000 米,但你在这些新单位系统中的速度是每秒 0.001 个单位!名义上,慢十倍(但诀窍是现在我在两个不同的单位系统中描述相同的速度)。

你需要做的是要么放弃“插值距离”并以时间、长度和速度的自然单位工作,假设每个物体的速度是恒定的,要么坚持你的“插值距离”,但使速度与物体(卡片)在固定时间内必须移动的实际长度成反比。

换句话说,如果 r.h.s of

interpolated_position += delta_time * (animation_confs[0].speed);

是对象无关的,l.h.s 的累加值为 1。表示动画结束,您已经实现了每个对象的恒定动画时间,无论它们必须移动多远。

关于c++ - 插值位置动画随着距离变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65815522/

相关文章:

java - MATLAB的interp1函数在J2ME中的实现

c++ - 包访问级别

python - 在Python中插值网格时忽略NaN

c++ - C++ 程序的单个实例,使用 boost::interprocess

ios - UIViewControllerAnimatedTransitioning 与 UIStatusBarAnimation

animation - 如何在 SwiftUI 中停止动画 ().repeatForever

jquery - css 动画 onload jQuery 事件

scala - 使用 nth 的二维插值

c++ - 在 QtCharts 上显示文本

c++ - 寻找整数可以表示为唯一自然数的 n 次幂之和的方法。给出错误输出的代码