前往
大廳
主題

Linear interpolation 線性插值

mike | 2021-02-08 19:58:07 | 巴幣 212 | 人氣 418

Linear interpolation 線性插值
其實他的意思就是在一個有AB兩點的線段理面,找線上的某一點

假設我有 A(X0,Y0),B(X1,Y1) 兩點怎麼求 (x,y) 這一點呢
我們利用斜率的公式

最後移項之後 公式就等於
白話講就是,當有兩點已知座標為 V0(2,3) V1(4,5) ,那某ㄧ點V3(3,y) 這個座標的y是多少

其實就是帶入公式
y = 2(原先的值) + 1(V3- V0 X的距離) * 5-3/4-2 (線的斜率)
y = 4

以上是線性插值的原理
-----------------------------------------------------------------------------------------------------------------------------------------------

Unity裡的Lerp 做法不太一樣,加入時間利用 t 做插值,圖學上常用的算法。
float lerp(float v0, float v1, float t) {  
return v0 + t * (v1 - v0);
}
或是把公式做移項的第二種算法也可以
v0 + v1*t - v0*t
=>  v0 - v0*t + v1*t
=>  v0*( 1 - t ) + v1*t

利用以上公式,把 t 限縮在區間[0,1]之間,
t = 0,代表等於 v0原點
t = 1,代表等於 v1終點
而 t 帶入0~1中的值,就會取到兩點間的任意值,不過直接呼叫的話也只是取到某一點而以。

所以 Unity中比較常用 Lerp 做平滑移動的效果,把算法放在Update中,t 帶入固定變化量(當然也是必須介於0~1)
這裡是帶 Time.deltime * veloicty 來當作t ,讓點可以無限逼近我們的終點。

逼近的概念就是當前frame learp取到的值,在下一個frame會再丟到v0裡當原點,
所以在畫面上你就看到點會移動到目的地了

Sample Code - 以 Vector2 Lerp為例
Time.deltime :是確保每台電腦的間隔時間是一樣的
veloicty : 來加強逼近的數值 //這個值越大他的t就越大 當然逼近的速度就越強


紀錄ㄧ下學習,有發現什麼我之後再補充.

Reference -

創作回應

樂小呈
Time.deltime 大多用途的確是確保每台電腦的間隔時間是一樣的,但實際意思是幀和幀的間隔時間(時長)
2021-02-09 19:30:16
mike
是啊 沒講的太詳細XD 很常用的好物
2021-02-09 19:52:48
シッコク
unity還有角度常用的球面線性內插slerp 有空可以了解一下
2021-02-09 19:33:45
mike
好低 改日來學習ㄧ下 感謝你~
2021-02-09 19:58:49

更多創作