Lerp 函数本质理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37608784/article/details/84861336

今天写了两个知识点,发现 CSDN 上都是抄过来抄过去,虽然看看别人写的能解决自己一大部分困惑,然而深入以后还是有不能理解透彻的地方。所以自己把自己理解的加在后面,如有不对,望指教。

Unity 中好几个 Lerp 函数,而对于 Lerp 函数的本质,我以前只知道个大概,参考了别人写的,觉得还是不够清晰,截图加上自己的详细理解如下:

参考资料:http://www.manew.com/blog-42778-2524.html

上面是阅读量最高的解释。不过我还是有不理解的地方。下面是我自己的理解:

Vector3.Lerp

  v = Vector3.Lerp(Vector3 from , Vector3 to, float t)等价于 
  v = from + (to - from) * t     这个是它的数学计算公式

  t∈[0,1]。t = 0 时,v = from; t = 1 时,v = to;   

  注意:t 的范围限制在[0,1],这个很重要。

应用:

  上面给出了三个应用案例

  1.transform.position = Vector3.Lerp(start,to,0.5f)   

t 为固定值 0.5,即每一帧移动到 当前 的 (to- start)*0.5 的位置。明白不了就是上面画的第二个线段图那种移动方式。永远是一半的位置,无限接近 to,但是到达不了 to位置

   2.transform.position = Vector3.Lerp(start,to,Time.time)   

t  为 Time.time,这个值是游戏开始到现在经过了多少秒,这个数值是一直增加的。但限于 t 的范围只能是 [0,1],所以 Time.time 只有增加到 1 的时候,即游戏开始到现在 1 秒之前这段时间才有意义。

还是理解不了,为什么说这样的写法是 1 秒时间从 from 位置到 to 位置?(官方案例解释)。

正面想不通,从反面想,Time.time 是随着时间增加的,如果他在这个函数中增加到大于 1,而此时 tranform.position 还没有到达 to 位置,而根据数学公式计算  transform.position = from + ( to - from) * t,此时 t = Time.time 大于 1 ,那意味着这一帧 transform.position 要移动的距离要超过当前 to - from 的距离,就是超过了 to ,这显然是错误的。所以 t  = Time.time =1 的时候,transform.position 在最后一次移动的时候位置变化就是 transform.position = from + (to - from) *1,即到达了 to 位置,这个函数的意义就完成了,而 Time.time 再增加,就毫无意义。所以,就是上面官方案例的解释:这样的写法是 1 秒时间从 from 位置到 to 位置。

3. transform.position = Vector3.Lerp(start,to,smoothing*Time.deltaTime) ; float smoothing =5f;

弹簧一样跟随物体。此时,t = smoothing* Time.deltaTime, smoothing 是一个固定值,Time.deltaTime 是执行上一帧所用的时间,会根据电脑性能不同, FPS 变换,每秒执行的整数不固定,每帧执行的时间不同,即 Time.deltaTime 不同。所以 smoothing*Time.deltaTime 是一个动态变化的值,但是也要保证  t 的范围在 [0,1] 之间,超过 1 也就没有意义。假设 FPS 稳定, 60 FPS,则 Time.deltaTime 就是一个固定值 0.02f, t 的值也固定就是 0.1,就和案例 1 一样 t 是一个固定值,永远会无限接近 to ,但到达不了 to 。而实际 FPS  会波动,所以 t 就会波动,就会模拟出弹性跟随的效果。

这种效果就通常用于游戏中摄像机的弹性跟随。

猜你喜欢

转载自blog.csdn.net/weixin_37608784/article/details/84861336