【问题标题】:Interpolated position animation slows down with distance插值位置动画随距离变慢
【发布时间】:2021-01-20 18:32:05
【问题描述】:

我正在渲染正在处理的卡片。玩家卡位于屏幕底部,经销商卡位于顶部。卡片从顶部的“屏幕外”发牌。因此牌的起始位置和玩家手之间的距离大于起始位置和庄家手之间的距离。

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

/// 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 应用于插值会保持速度恒定。

【问题讨论】:

    标签: c++ animation interpolation


    【解决方案1】:

    您希望我们提供一个没有足够额外细节的小sn-p代码来创造奇迹。

    • animation_confs[0].speed 是什么?对于所有卡来说它是不变的吗?
    • 什么是delta_time?它是否取决于卡片要移动多远?

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2021-06-12
      • 2018-12-11
      • 2013-06-06
      • 2020-12-10
      • 1970-01-01
      相关资源
      最近更新 更多