預先閱讀:三維圖形基本幾何變換的矩陣推導
對於在三維空間中的一個參考系,任何坐標系的取向,都可以用三個歐拉角來表現。(三個歐拉角變換可以描述當前物體的姿態)
俯仰(繞 z 軸旋轉)、偏航(繞 y 軸旋轉)、滾動(繞 x 軸旋轉)了解下就行
由於線性變換不符合交換律,那麼旋轉順序的不同便會影響結果,下文以動態歐拉角(z-y-x)分析
動態歐拉角#
在 [三維圖形基本幾何變換的矩陣推導 ](https://github.com/IWSR/BLOG/issues/2 ) 中已經推導出了分別繞 X、Y、Z 軸旋轉的旋轉矩陣即
Copy R z γ = ( c o s γ − s i n γ 0 0 s i n γ c o s γ 0 0 0 0 1 0 0 0 0 1 ) R_{z}γ =
\begin{pmatrix}
cosγ & -sinγ & 0 & 0 \\
sinγ & cosγ & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix} R z γ = cos γ s inγ 0 0 − s inγ cos γ 0 0 0 0 1 0 0 0 0 1
Copy R y β = ( c o s β 0 s i n β 0 0 1 0 0 − s i n β 0 c o s β 0 0 0 0 1 ) R_{y}β =
\begin{pmatrix}
cosβ & 0 & sinβ & 0 \\
0 & 1 & 0 & 0 \\
-sinβ & 0 & cosβ & 0 \\
0 & 0 & 0 & 1
\end{pmatrix} R y β = cos β 0 − s in β 0 0 1 0 0 s in β 0 cos β 0 0 0 0 1
Copy R x α = ( 1 0 0 0 0 c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 ) R_{x}α =
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & cosα & -sinα & 0 \\
0 & sinα & cosα & 0 \\
0 & 0 & 0 & 1
\end{pmatrix} R x α = 1 0 0 0 0 cos α s in α 0 0 − s in α cos α 0 0 0 0 1
那麼如果按動態歐拉角的變換順序,我們將得到變換矩陣 R = R x α R y β R z γ R=R_{x}αR_{y}βR_{z}γ R = R x α R y β R z γ
Copy R = R x α R y β R z γ = ( cos β cos γ − cos α sin γ + sin α sin β cos γ sin α sin γ + cos α sin β cos γ 0 cos β sin γ cos α cos γ + sin α sin β sin γ − sin α cos γ + cos α sin β sin γ 0 − sin β sin α cos β cos α cos β 0 0 0 0 1 ) R= R_{x}αR_{y}βR_{z}γ =
\begin{pmatrix}
\cos β\cos γ & -\cos α\sin γ + \sin α\sin β\cos γ & \sin α \sin γ+ \cos α \sin β \cos γ & 0 \\
\cos β\sin γ & \cos α\cos γ + \sin α\sin β\sin γ & -\sin α \cos γ+ \cos α \sin β \sin γ & 0 \\
-\sin β & \sin α\cos β & \cos α\cos β & 0 \\
0 & 0 & 0 & 1
\end{pmatrix} R = R x α R y β R z γ = cos β cos γ cos β sin γ − sin β 0 − cos α sin γ + sin α sin β cos γ cos α cos γ + sin α sin β sin γ sin α cos β 0 sin α sin γ + cos α sin β cos γ − sin α cos γ + cos α sin β sin γ cos α cos β 0 0 0 0 1
萬向鎖#
一旦選擇 ±90° 作為 pitch 角,就會導致第一次旋轉和第三次旋轉等價,整個旋轉表示系統被限制在只能繞豎直軸旋轉,丟失了一個表示維度。
上面那段引言用人話說就是當 β 為 ±90° 時,繞 x 旋轉與繞 z 軸旋轉在結果上會等效。
萬向鎖這個問題如果直接使用變換矩陣 R 來解釋的話會很直觀,就如下面我們把 β = 90° 代入方程並化簡
Copy R = R x α R y 90 ° R z γ = ( 1 0 0 0 0 c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 ) ( 0 0 1 0 0 1 0 0 − 1 0 0 0 0 0 0 1 ) ( c o s γ − s i n γ 0 0 s i n γ c o s γ 0 0 0 0 1 0 0 0 0 1 ) = ( 0 0 1 0 s i n ( α + γ ) c o s ( α + γ ) 0 0 − c o s ( α + γ ) s i n ( α + γ ) 0 0 0 0 0 1 ) R = R_{x}αR_{y}90°R_{z}γ =
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & cosα & -sinα & 0 \\
0 & sinα & cosα & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
\begin{pmatrix}
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
-1 & 0 & 0 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
\begin{pmatrix}
cosγ & -sinγ & 0 & 0 \\
sinγ & cosγ & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
=
\begin{pmatrix}
0 & 0 & 1 & 0 \\
sin(α + γ) & cos(α + γ) & 0 & 0 \\
-cos(α + γ) & sin(α + γ) & 0 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix} R = R x α R y 90° R z γ = 1 0 0 0 0 cos α s in α 0 0 − s in α cos α 0 0 0 0 1 0 0 − 1 0 0 1 0 0 1 0 0 0 0 0 0 1 cos γ s inγ 0 0 − s inγ cos γ 0 0 0 0 1 0 0 0 0 1 = 0 s in ( α + γ ) − cos ( α + γ ) 0 0 cos ( α + γ ) s in ( α + γ ) 0 1 0 0 0 0 0 0 1
很容易發現影響變換矩陣 R 的變量為 α + γ,而在幾何上則體現為繞 x 軸的旋轉表現與繞 z 軸等效,舉例說明則是
Copy R x 30 ° R y 90 ° R z 50 ° = R x 0 ° R y 90 ° R z 80 ° R_{x}30°R_{y}90°R_{z}50° = R_{x}0°R_{y}90°R_{z}80° R x 30° R y 90° R z 50° = R x 0° R y 90° R z 80°
這裡需要強調一下,本文中的旋轉順序為 z-y-x,上面的例子可描述為物體繞 z 軸旋轉 80°、繞 y 軸旋轉 90°、繞 x 軸旋轉 0° 其姿態與繞 z 軸旋轉 80°、繞 y 軸旋轉 90°、繞 x 軸旋轉 0° 相同。也就是產生萬向鎖時,空間中物體可通過多種不同的旋轉方式轉變為某一個特定姿態,即變換與其結果並非一一對應,而這在工程上的體現便是動畫插幀會變得極其詭異。