Mathf.SmoothDamp() 是如何工作的?它是什么算法?

inh*_*nal 4 c++ algorithm smoothing unity-game-engine

我想知道如何SmoothDamp统一工作。我正在尝试在统一之外重新创建该函数,但问题是我不知道它是如何工作的。

0xB*_*1A8 6

来自Unity3d C#参考源代码

// Gradually changes a value towards a desired goal over time.
        public static float SmoothDamp(float current, float target, ref float currentVelocity, float smoothTime, [uei.DefaultValue("Mathf.Infinity")]  float maxSpeed, [uei.DefaultValue("Time.deltaTime")]  float deltaTime)
        {
            // Based on Game Programming Gems 4 Chapter 1.10
            smoothTime = Mathf.Max(0.0001F, smoothTime);
            float omega = 2F / smoothTime;

            float x = omega * deltaTime;
            float exp = 1F / (1F + x + 0.48F * x * x + 0.235F * x * x * x);
            float change = current - target;
            float originalTo = target;

            // Clamp maximum speed
            float maxChange = maxSpeed * smoothTime;
            change = Mathf.Clamp(change, -maxChange, maxChange);
            target = current - change;

            float temp = (currentVelocity + omega * change) * deltaTime;
            currentVelocity = (currentVelocity - omega * temp) * exp;
            float output = target + (change + temp) * exp;

            // Prevent overshooting
            if (originalTo - current > 0.0F == output > originalTo)
            {
                output = originalTo;
                currentVelocity = (output - originalTo) / deltaTime;
            }

            return output;
        }
Run Code Online (Sandbox Code Playgroud)

  • 该代码实现了临界阻尼谐振子。请注意,从数学上讲,它实际上从未达到目标。它只是渐进地接近它作为极限。实际上,32 位浮点值的精度将很快达到目标。 (2认同)