【问题标题】:Lerp with Time.deltaTimeLerp 与 Time.deltaTime
【发布时间】:2017-09-28 23:03:40
【问题描述】:

我有一个关于 Lerp 的问题。所以我知道 lerp 可以帮助您移动对象,例如:

void update(){
transform.position = vector3.lerp(start.position,end.position, (Time.time / 1000));
}

这将使您的对象到达您的终点。 但是如果你有这个代码:

void Update(){

    transform.position = Vector3.Lerp(transform.position,
                                      destination.position,
                                      speed * 3.0f * Time.deltaTime);
}

你的物体怎么可能到达你的目的地,lerp 的第三个参数必须慢慢地达到 1,这样你的物体才能到达你的目的地。但是 "speed" , "3.0" , "Time.deltaTime" 总是一样的,那么你的对象怎么可能到达你的目的地呢?

所以最大的问题是:是否可以对一些变量进行 lerp,这些变量始终具有相同的值并且使用 Time.deltaTime?

现在,由于不同的 cmets 等。我不知道 lerp 究竟是如何工作的,我有可能:

1.) 首先我认为它是这样工作的:

Vector3.lerp(a,b,c) c 值必须改变每一帧才能移动对象。如果 c 值为 0.2,您的对象将移动 20%,如果 c 值不改变,则对象将始终移动 20%。因此,要流畅地移动对象,您的 c 值必须在每一帧中稍微更改一下,这样您的 c 值将从 0 变为 1,您的对象从起点到终点也是如此。

还是这样

2.) 由于有几个 cmets,我认为 lerp 是这样工作的

就像 cmets 说的,c 值不必改变值,因为如果你有 c = 0.2,你将通过 20% 的方式和下一帧,如果 c 仍然是 0.2,你将通过 20%剩下的路等等。

那么 lerp 是像 1 一样工作(你必须更改 c)还是像 2 一样工作(你不必更改 c)

【问题讨论】:

  • 请确保您的代码格式正确,突出显示并按下{ } 按钮,我已经为您修复了。
  • 另外,您可能对Zeno's dichotomy paradox感兴趣
  • 抱歉代码问题。我知道我可以如何使用 lerp,但我想知道我是否可以使用变量,这些变量总是具有相同的值和 Time.deltaTime,如果可以,如何使用?
  • 这并不是说它有帮助,而是你所处的情况。假设speed * 3.0f * Time.deltaTime 评估为0.75,这意味着你将在每一帧中走完 75% 的路。第一帧你走 75%,下一帧你走剩下的 75%,下一帧你走剩下的 75%(这是芝诺悖论,你永远不会到达那里,你只走 75%方式),这会不断重复,直到 75% 的增幅小于 float 可以改变的最小变化。

标签: unity3d time lerp


【解决方案1】:

变换位置和目标之间的距离呈指数衰减。距离每帧缩小(1 - 速度)(假设速度小于 1)。假设您的游戏应该以 60FPS 运行。如果出于某种原因帧速率下降到 30FPS,则 deltaTime 将是原来的两倍,并且您应该执行 Lerp 2 次。在这种情况下,距离将收缩 (1 - speed) 然后 (1 - speed) 再次产生 (1 - speed)^2 收缩的结果。由此,您可以概括距离的收缩量是 (1 - speed) ^ (deltaTime / baseDeltaTime),其中 baseDeltaTime 是游戏应该运行的 deltaTime,即 1/60(对于 60FPS)。 输入代码:

transform.position = Vector3.Lerp(transform.position, destination.position, 1 - Mathf.Pow(1 - speed * 3.0f, Time.deltaTime * 60));

【讨论】:

    【解决方案2】:

    对象到达目标是因为你的起始位置是当前位置,并且在 lerp 之后,你将对象的位置设置为 Lerp 的结果位置。如果您将起始位置更改为正常的 Vector3,它将 Lerp 变为“speed * Time.deltaTime * 3f”

    【讨论】:

    • 另外请注意,以这种方式使用 Lerp 所产生的运动是非线性的。它类似于 Exponential Ease Out 以及关于 Achilles 的 Zeno's Paradox 的计算机化版本还有乌龟。
    • @Draco18s 它是二分法悖论的第二种形式,而不是阿喀琉斯和乌龟,因为目标没有移动。
    • 啊,是的。谢谢。
    【解决方案3】:

    我猜你不明白 lerp 是如何统一工作的。我会向你推荐 Robbert 的这篇文章How to Lerp like a pro

    我经常看到这种事情:

    transform.position = Vector3.Lerp(startPos, endPos, Time.deltaTime);

    发布它的人通常确信 Vector3.Lerp 是 “坏了”,但真正的问题是他们没有正确使用它。

    Lerp,“线性插值”的缩写,做了一件非常简单的事情: 给定两个值 x 和 y,它返回一个 t 百分比的值 它们之间。如果您期望输出发生变化,则您的论点 传递需要反映这一点!

    在上面的例子中,直接传入是没有意义的 Time.deltaTime,因为那只是在 最近的帧。如果你的游戏以恒定的 50fps 运行,那就是 总是 0.02。

    【讨论】:

    • 是的,我认为它的工作方式有点不同,但如果第三个值为 0.02,那么我将通过 2% 的路径,下一帧将通过剩余路径的 2%,依此类推,所以目标会慢慢达到,这样对吗?
    • 是的,应该是这样的。您提供的金额越少,它的运行速度就越慢
    • Okei,所以第三个值不必改变,它总是可以是相同的值,lerp 会起作用吗?
    • 没有 3 值可以改变,它也可以工作。无论它保持不变还是经常更改,它都会起作用。但是如果你经常改变 3 的值,那么它不应该是平滑的
    • 你可以自己测试,拿到立方体并使用公共变量应用它
    【解决方案4】:
    myLocation = Mathf.Lerp(myLocation, myDestination, 0.02)
    

    如果您将Lerp 函数的返回值存储到一个变量中,然后还使用相同的变量作为相同Lerp 函数中的最小值,那么每次函数的最小值都会越来越大调用。

    因此,即使您没有更改 T,但您正在更改起始值,因此存储的值越来越接近最大值。

    它最初会非常快地加速,然后在接近最大值时减速。此外,最大值永远不会达到或需要很长时间。

    【讨论】:

      【解决方案5】:

      (见https://gamedev.stackexchange.com/questions/149103/why-use-time-deltatime-in-lerping-functions

      Lerp有两种常用的使用方式:

      1.开始和结束之间的线性混合

      progress = Mathf.Clamp01(progress + speedPerTick);
      current = Mathf.Lerp(start, end, progress);
      

      2。朝向目标的指数级轻松度

      current = Mathf.Lerp(current, target, sharpnessPerTick);
      

      请注意,在此版本中,current 值同时显示为输出 输入。它取代了start 变量,所以我们总是从上次更新时移动到的地方开始。这就是为这个版本的Lerp 提供从一帧到下一帧的内存的原因。然后,我们从这个移动的起点向target 移动一小部分距离,该距离由sharpness 参数指定。

      这个参数不再是一个“速度”,因为我们以Zeno-like 方式接近目标。如果sharpnessPerTick0.5,那么在第一次更新时,我们的目标就已经完成了一半。然后在下一次更新中,我们将移动剩余距离的一半(即初始距离的四分之一)。然后在下一个我们会再次移动一半......

      这给出了一个“指数缓动”,当远离目标时移动很快,随着渐近接近而逐渐减慢(尽管对于无限精度的数字,它永远不会在任何有限数量的更新中达到它 - 因为我们的目的已经足够接近了)。它非常适合追踪移动的目标值,或者使用“exponential moving average”平滑噪声输入,通常使用非常小的sharpnessPerTick 参数,例如0.1 或更小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多