插值位置动画随着距离变慢。

3

我正在渲染正在分发的卡片。玩家的卡片在屏幕底部,荷官的卡片在更上面。卡片从屏幕顶部的“看不见的地方”分发。因此,卡片起始位置与玩家手牌之间的距离比起始位置和荷官手牌之间的距离更远。

我正在使用介于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应用于插值应该可以保持速度恒定。
1个回答

0

你希望我们通过提供一个小代码片段来创造奇迹,但是缺乏足够的额外细节。

  • animation_confs [0] .speed 是什么,所有卡片的速度都是恒定的吗?
  • delta_time 是什么,它是否取决于要移动的卡片距离有多远?

现在,据我所了解,您想要实现卡片的恒定速度效果,是吗?如果是这样的话,我建议将速度作为update函数的参数传递,并检查卡片是否已经移动到了目标位置。但是让我们继续使用您提到的“插值”变量t,该变量的取值范围在0和1之间。(当然,用t来表示距离可能会引起混淆,请更改名称)。您将卡片到屏幕顶部和最终位置之间的距离以卡片自身距离单位进行测量,这样是可以的,但可能会引起混淆。我想您不想为每个对象引入单独的时间,因此时间是通用的。如果您按对象相关单位测量距离,而时间是通用的,则速度必须是对象相关的。假设您附近有两家商店,一家距离您100米,另一家距离您1000米。您步行速度为1米/秒。如果您的长度单位是100米,则第一家商店距离您1个单位(就像您的t一样),您的速度为每秒0.01个长度单位。考虑另一家商店。现在长度单位是1000米,但在这个新单位系统中,您的速度是每秒0.001个单位!名义上慢了十倍(但是诀窍在于现在我用两个不同的单位系统描述了相同的速度)。

你需要做的是要么放弃“插值距离”,使用时间、长度和速度的自然单位,假设每个物体的速度都是恒定的,要么坚持使用“插值距离”,但使速度与物体(卡片)在固定时间内实际行驶的长度成反比。
换句话说,如果右侧的
interpolated_position += delta_time * (animation_confs[0].speed);

是独立于对象的,并且左侧信号的累积值表示动画结束,这样你就可以实现每个对象恒定的动画时间,无论它们需要移动多远。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接