欧拉角与万向锁
说明
原文发布于 Github
前置阅读:三维图形基本几何变换的矩阵推导
对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。(三个欧拉角变换可以描述当前物体的姿态)
俯仰(绕z轴旋转)、偏航(绕y轴旋转)、滚动(绕x轴旋转)了解下就行
由于线性变换不符合交换律,那么旋转顺序的不同便会影响结果,下文以动态欧拉角(z-y-x)分析
动态欧拉角
在 三维图形基本几何变换的矩阵推导 中已经推导出了分别绕 X、Y、Z轴旋转的旋转矩阵即
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 ⎠ ⎞
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 ⎠ ⎞
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 γ
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° 代入方程并化简
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 轴等效,举例说明则是
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°相同。也就是产生万向锁时,空间中物体可通过多种不同的旋转方式转变为某一个特定姿态,即变换与其结果并非一一对应,而这在工程上的体现便是动画插帧会变得极其诡异。