前往
大廳
主題

06. 旋轉與平移的線性內插

Lumi | 2023-08-12 00:00:04 | 巴幣 0 | 人氣 140

幾何代數系列文之六。本文需要讓巴哈姆特能顯示數學式子

本文介紹的內插公式只會使用rotor來推導,這是因為系列文到目前為止所介紹的性質都屬於Euclidean Geometric Algebra(EGA)的範圍。平移的運算屬於Plane-based Geometric Algebra(PGA),以後會撰文介紹PGA。
現在讀者只需要知道本篇介紹的公式可以用來計算平移與旋轉的內插,因為平移可看成是繞著無窮遠處的點旋轉。即便是平移運算子(translator)與旋轉運算子(rotor)的組合(稱作motor),也是用相同的內插公式。


傳統內插法

內插法被使用於平滑地旋轉或移動物體。處理動畫效果時,可用來計算物體在兩個key frame之間的位置與方向。常見的簡單線性內插公式為:
$$
\begin{aligned}
\mathbf{c}=\mathbf{a}+t(\mathbf{b-a}) = (1-t)\mathbf{a}+t \mathbf{b}
\end{aligned}
$$
上式中起點為向量$\mathbf{a}$,終點為向量$\mathbf{b}$,$\mathbf{c}$是內插結果,$t$為介於$0\sim1$之間的數值,$t=0$時可得到起點,$t=1$時得到終點。

矩陣無法直接套用此公式,需要從矩陣中拆解出移動與旋轉的資訊,個別計算內插後再組裝回矩陣。而幾何代數的rotor(或四元數)勉強可以套用,但需要額外的正規化:
$$
R_{c}=\dfrac{(1-t)R_{a}+tR_{b}}{\lVert (1-t)R_{a}+tR_{b} \rVert}
$$
此式不是直接對對角度做線性內插,因此旋轉結果不會是平滑的。


利用自然指數與對數

這裡會用到第一篇提到的尤拉公式,能撐到系列第六篇的讀者應該已經熟悉單位平面的平方等於$-1$,因此虛數可以用單位平面替換。設rotor $R$的旋轉單位平面為$\mathbf{I}$,能旋轉$\theta$度,rotor $R$可寫成尤拉公式的形式:
$$
R=\cos \frac{\theta}{2} - \sin \frac{\theta}{2}\mathbf{I}=e^{-\mathbf{I}\frac{\theta}{2}}
$$
指數部分剩下平面乘以角度,於是我們可以對它套用線性內插公式得到平滑的旋轉。因為指數的性質,內插會變成對起點乘一個自然指數,其指數部分是$t$乘以距離。設$\mathbf{A}=-\mathbf{I}\frac{\theta_a}{2}$,$\mathbf{B}=-\mathbf{I}\frac{\theta_b}{2}$:
$$
\begin{aligned}
e^{\mathbf{A}+t(\mathbf{B-A})} &= e^{\mathbf{t(B-A)}}e^{\mathbf{A}}
\end{aligned}
$$
要計算起點到終點的距離會變成終點除以起點,然後對其取自然對數$\ln$:
$$
\begin{aligned}
\ln \frac{e^{\mathbf{B}}}{e^{\mathbf{A}}}&= \ln e^{\mathbf{B}}e^{\mathbf{-A}}\\
&= \ln e^{\mathbf{B-A}}\\
&= \mathbf{B-A}
\end{aligned}
$$
我們來看上述原理用rotor替換後怎麼找出旋轉距離。設起點為$R_a$,終點為$R_b$,兩者距離為$\mathbf{D}$。記得$R_{a}^{-1}=\dfrac{\widetilde{R_a}}{\lVert R_a \rVert^{2}}=\widetilde{R_a}$:
$$
\begin{aligned}
e^{\mathbf{D}}R_{a}&=R_b\\
e^\mathbf{D}\cancel{R_{a}\widetilde{R_{a}}}&=R_b\widetilde{R_a}\\
e^\mathbf{D}&=R_b\widetilde{R_a}\\
\mathbf{D}&=\ln(R_b\widetilde{R_a})
\end{aligned}
$$
有了距離,加入$t$就能得到完整的線性旋轉(平移)內插公式:
$$
R_c=e^{t\ln(R_b\widetilde{R_a})}R_a
$$
若$R_a$代表旋轉0度,以$R_{a}=1$代入上式即可。


結語

幾何代數的函式庫應該都會支援指數與對數運算,因此實作時只需要上面這一條公式,不需要自己計算。記得可以把$\ln( \mathbf{R}_{b}\widetilde{\mathbf{R}}_{a})$暫存起來,因為這個值不會變動,在動畫結束前可以重複使用。

內插公式也能用於PGA的平移,因為平移也可以寫成自然指數形式(利用馬克勞林級數),因此原理大致上是一樣的。程式實作時不用管是旋轉或平移,總之將motor代入公式即可,比傳統解決方案更簡潔。下圖示範了同時對旋轉與平移作內插,三角形沿著line3方向一邊平移一邊旋轉:
在PGA中,使用line1與line2製造rotor,能讓幾何元素繞著兩線交點v1旋轉。即使不是繞著原點旋轉,仍然可以使用這個線性內插公式。

創作回應

相關創作

更多創作