Lerp 函數本質理解

今天寫了兩個知識點,發現 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 就會波動,就會模擬出彈性跟隨的效果。

這種效果就通常用於遊戲中攝像機的彈性跟隨。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章