Spherical Linear Interpolation
球面線性內插簡介與證明
接續前一篇文章的基本旋轉與四元數使用,這篇文章會介紹球面內插Slerp的數學表示與上次旋轉攝影機操作的範例,要如何透過球型插值優化運鏡效果。
四元數的插值運算 — “球面內插 Spherical Linear Interpolation”
球面線性內插 Spherical Linear Interpolation,簡稱slerp,是對於四元數之間平滑插值的運算,slerp迴避了歐拉角之間插值所會遇到的問題:例如旋轉週期性以及萬向鎖的問題,如果有興趣,可以點上面連結中有較為詳細的解釋。
Slerp是一種三元運算,包含兩個要拿來變化的四元數,以及將兩者插值的變化值t,就如同一般線性內插的形式。
同理,將公式代入到四元數之中,我們可以得到:
這樣理論上的線性插值就完成了,然而實務演算上,這樣的做法並不夠有效率。
我們在4D的歐幾里德空間中解釋兩個四元數的表示,因為代表旋轉的四元數一定是個單位四元數(由cos,sin組成),所以我們可以想像他們一定存在於一個4D的單位球面上。
Slerp的基本想法,就是將兩個四元數沿著球面的弧移動,這也是名稱 “球面內插 Spherical Linear Interpolation” 的由來。
我們可以在2D平面上想像,設兩個2維單位向量V1,V2,計算他們的內插結果Vt,ω是沿著V1到V2的弧所截的角度,vt就是V1照逆時鐘旋轉 tω 的結果。
我們可以簡單地推出Vt的形式
為了寫出線性插值的方程式,我們接下來要找到以V1,V2組成Vt的方程式,也就是Vt的線性組合。
從向量加法去分析,k1V1 ,k2V2的形式應該如下:
再利用相似三角形,我們可以得到其中的夾角
依照k2V2為斜邊的三角形,sin ω的定義為
此時我們看向V2邊:
同理,k1V1為斜邊的三角形可以解出k1
帶回原式,得到:
回推回去四元數的Slerp公式:
另外在做球形差值時,會有兩點需要考慮:
- 四元數Q與-Q是代表相同的Orientation,但是作為Slerp的參數時會導致不同的結果,解法是調整Q1, Q2的符號Q1 ˙ Q2 > 0
- 如果Q1, Q2的結果太接近,sin值會非常小,此時除法可能會出現問題,所以當sin值小於一個程度時直接使用簡單線性插值。
C#中的實作與應用
將Slerp實作後,應用於前篇文章的攝影機轉動腳本。
使用Slerp後,在旋轉的最後會有緩慢減速的效果,如下圖範例:
可以感受到球型內插後的旋轉有比較好的速度曲線,能夠製作較好的Pan效果。
程式碼如下: