前置阅读:三维图形基本几何变换的矩阵推导
对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。(三个欧拉角变换可以描述当前物体的姿态)
俯仰(绕 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° 相同。也就是产生万向锁时,空间中物体可通过多种不同的旋转方式转变为某一个特定姿态,即变换与其结果并非一一对应,而这在工程上的体现便是动画插帧会变得极其诡异。