【问题标题】:Unity3D C# Negative Lerp?Unity3D C#负Lerp?
【发布时间】:2015-12-19 20:46:18
【问题描述】:

我想要控制控制我的动画速度的变量,以便它在混合树中流畅地过渡。

 void Idle()
     {
         _agent.SetDestination(transform.position);
             //Something like the following line
         _speed = Mathf.Lerp(0.0f, _speed, -0.01f);
         _animationController._anim.SetFloat("Speed", _speed);
     }

我听说你不能容忍否定,那我该怎么做呢?

【问题讨论】:

    标签: c# unity3d lerp


    【解决方案1】:

    我认为你使用 Lerp 不好。

    如 Unity 文档 (http://docs.unity3d.com/ScriptReference/Mathf.Lerp.html) 中所述,您应该传递 3 个浮点数,最小值作为第一个参数,最大值作为第二个参数,时间作为第三个参数。

    这第三个应该在 0 和 1 之间。

    除此之外,您始终可以在 lerping 后将数字设为负数。

    一些例子:

    • 如果您希望从 -10 到 10,请从 0 到 20 进行 lerp,然后减去 10。

      浮点数 = Mathf.Lerp(0f, 20f, t);

      随便 -= 10f;

    • 如果您想要从 0 到 -50,请从 0 到 50 进行 lerp,然后将其设为负数。

      浮点数 = Mathf.Lerp(0f, 50f, t);

      随便=-随便;

    【讨论】:

      【解决方案2】:

      ab 之间的lerp 函数中的t 值通常需要在0-1 范围内。当t为0时,函数返回a,当t为1时,函数返回b。介于两者之间的所有t 值将作为线性函数返回ab 之间的值。这是一个简化的一维 lerp:

      return a + (b - a) * t;
      

      在这种情况下,t 的负值没有意义。例如,如果您的速度变量是4.0f,则lerp(0, 4, -0.01f) 的结果将是:

      0 + (4 - 0) * -0.01
      

      返回-0.04

      解决此问题的最简单方法是简单地翻转ab,而不是尝试使用否定的t

      _speed = Mathf.Lerp(_speed, 0.0f, 0.01f);
      

      另一个建议是使用Mathf.SmoothStep 并存储原始速度,而不是将函数应用于不断变化的_speed 以获得真正平滑的过渡。

      【讨论】:

        【解决方案3】:

        好吧,实际上你不能。

        Lerp 函数的伪代码实现如下所示:

        float Lerp(float begin, float end, float t)
        {
            t = Mathf.Clamp(t, 0, 1);
            return begin * (1 - t) + end * t;
        }
        

        因此,任何尝试给出 [0, 1] 之外的 t 值,即。外推尝试,将被限制在有效范围内。

        【讨论】:

          猜你喜欢
          • 2017-09-07
          • 1970-01-01
          • 2021-04-12
          • 1970-01-01
          • 2014-06-02
          • 2017-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多