Spherical Linear Interpolation

Harrison Chen
Akatsuki Taiwan Technology
5 min readApr 14, 2020

球面線性內插簡介與證明

接續前一篇文章的基本旋轉與四元數使用,這篇文章會介紹球面內插Slerp的數學表示與上次旋轉攝影機操作的範例,要如何透過球型插值優化運鏡效果。

四元數的插值運算 — “球面內插 Spherical Linear Interpolation”

球面線性內插 Spherical Linear Interpolation,簡稱slerp,是對於四元數之間平滑插值的運算,slerp迴避了歐拉角之間插值所會遇到的問題:例如旋轉週期性以及萬向鎖的問題,如果有興趣,可以點上面連結中有較為詳細的解釋。

萬向鎖問題(圖:wikipedia)

Slerp是一種三元運算,包含兩個要拿來變化的四元數,以及將兩者插值的變化值t,就如同一般線性內插的形式。

Linear Interpolation

同理,將公式代入到四元數之中,我們可以得到:

Spherical Linear Interpolation in theory

這樣理論上的線性插值就完成了,然而實務演算上,這樣的做法並不夠有效率。

我們在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公式:

另外在做球形差值時,會有兩點需要考慮:

  1. 四元數Q與-Q是代表相同的Orientation,但是作為Slerp的參數時會導致不同的結果,解法是調整Q1, Q2的符號Q1 ˙ Q2 > 0
  2. 如果Q1, Q2的結果太接近,sin值會非常小,此時除法可能會出現問題,所以當sin值小於一個程度時直接使用簡單線性插值。

C#中的實作與應用

將Slerp實作後,應用於前篇文章的攝影機轉動腳本。

原本轉動範例

使用Slerp後,在旋轉的最後會有緩慢減速的效果,如下圖範例:

攝影機轉動範例 with Slerp

可以感受到球型內插後的旋轉有比較好的速度曲線,能夠製作較好的Pan效果。

程式碼如下:

C#實作slerp且使用於前篇文章的攝影機轉動

--

--