2016-11-06 57 views
1

我見過一對夫婦的線性插值功能,主要用於lerping載體,他們似乎是這樣的:爲什麼這樣寫一個lerp函數:(1-bias)* start + bias * end;

vector lerp(float bias, vector start, vector end) 
{ return (1-bias) * start + bias * end; } 

而我做的簡單的方式將是:

vector lerp(float bias, vector start, vector end) 
{ return (end - start) * bias + start; 

我以下顯示了兩種方法的擊穿:簡化

two float by vector multiplications | one vector addition       | one float subtraction | 
one float by vector multiplication | one vector addition and one vector subtraction | 

,這意味着:

6 float multiplications | 3 additions | one float subtraction 
3 float multiplications | 6 additions | 

我混在一起了,得到了錯誤的想法,這些是相等的嗎?我有時會用簡單的數學概念來掙扎。

編輯:我剛纔意識到,在我的情況下,我需要一箇中途lerp,這通過獲得兩個向量的平均分量來做到更便宜。對每個軸X,Y,Z來說,這只是一個加法和一個乘法。我想我會這麼做的。

+0

它是開始點和結束點之間的簡單線性插值。看起來漂亮。 – duffymo

回答

1

這是一個傳統,來自數學,並與親緣關係轉換,一種轉換,這種轉換以線性方式映射向量中的向量,而不必將原點映射到自身。

線性變換滿足

f(a1*v1 + ... + an*vn) = a1*f(v1) + ... + an*f(vn) 

仿射變換滿足相同的前提是

a1 + a2 + ... + an = 1. 

爲什麼?因爲仿射變換碰巧是f() + c的形式,對於一些線性變換f()和一些常數c

仿射組合形式

a1*v1 + ... + an*vn 

其中ai的總和爲1的表達。它們是班輪組合的特例。

現在,如果您只有兩點AB無論在任何維度(1,2,3等))由AB定義的直線可以看作是所有仿射組合住的地方:

s*A + t*B (s + t = 1) 

在只有兩個點的這種特殊情況下,也可以只用一個參數表達出來

(1 - t)*A + t*B. 

t = 0你在點A,當t=0.5你是正確的ABt=1之間的中間,你是在B

所以,你能想到的t的時間,並認爲你是從A前往Bt去從01。參數t的負值對應於線上的點,但不在線段中,同樣適用於t > 1

換句話說,除(1-t)*A + t*B使其明顯表示與仿射幾何體的鏈接外,使用(B - A)*t + A(它同樣適用於任何維度)完全可以。

+0

謝謝。我並不十分欣賞你所說的早些時候的東西,但從這個公式的角度來看,我可以想象它。我把它描繪爲增加一個矢量的t%和另一個矢量的1-t,他們似乎總是(視覺上)指向線。 – Zebrafish

+0

這很好。只要意識到你所描繪的對應於一個更一般的數學概念,這就是爲什麼有些人試圖使關係明確。 –

0

有一個在

(1-bias) * start + bias * end 

形式一定對稱優雅。這意味着startend都沒有特別的意義。

如果我們看看操作的速度,乘法並不比加法慢得多。 (例如參見Does each Floating point operation take the same time?)如果我們將每個操作視爲同一時間,那麼對於第一個近似,兩種方法都有相同的操作計數。

我還沒有遇到過這樣的情況:lerp代碼被證明是代碼中的一個重要瓶頸,所以這裏存在一個過早優化的情況。