欧拉角与万向锁

说明

前置阅读：三维图形基本几何变换的矩阵推导

对于在三维空间里的一个参考系，任何坐标系的取向，都可以用三个欧拉角来表现。（三个欧拉角变换可以描述当前物体的姿态）

俯仰（绕 z 轴旋转）、偏航（绕 y 轴旋转）、滚动（绕 x 轴旋转）了解下就行

由于线性变换不符合交换律，那么旋转顺序的不同便会影响结果，下文以动态欧拉角（z-y-x）分析

动态欧拉角

在 [三维图形基本几何变换的矩阵推导](https://github.com/IWSR/BLOG/issues/2) 中已经推导出了分别绕 X、Y、Z 轴旋转的旋转矩阵即

Copy Rz γ=(cosγ−sinγ00sinγcosγ0000100001)R_{z}γ = \begin{pmatrix} cosγ & -sinγ & 0 & 0 \\ sinγ & cosγ & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}Rz​γ= ​cosγsinγ00​−sinγcosγ00​0010​0001​ ​

Copy Ry β=(cosβ0sinβ00100−sinβ0cosβ00001)R_{y}β = \begin{pmatrix} cosβ & 0 & sinβ & 0 \\ 0 & 1 & 0 & 0 \\ -sinβ & 0 & cosβ & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}Ry​β= ​cosβ0−sinβ0​0100​sinβ0cosβ0​0001​ ​

Copy Rx α=(10000cosα−sinα00sinαcosα00001)R_{x}α = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & cosα & -sinα & 0 \\ 0 & sinα & cosα & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}Rx​α= ​1000​0cosαsinα0​0−sinαcosα0​0001​ ​

那么如果按动态欧拉角的变换顺序，我们将得到变换矩阵 R=Rx α Ry β Rz γ R=R_{x}αR_{y}βR_{z}γR=Rx​αRy​βRz​γ

Copy R=Rx α Ry β Rz γ=(cos⁡βcos⁡γ−cos⁡αsin⁡γ+sin⁡αsin⁡βcos⁡γsin⁡αsin⁡γ+cos⁡αsin⁡βcos⁡γ0cos⁡βsin⁡γcos⁡αcos⁡γ+sin⁡αsin⁡βsin⁡γ−sin⁡αcos⁡γ+cos⁡αsin⁡βsin⁡γ0−sin⁡βsin⁡αcos⁡βcos⁡αcos⁡β00001)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=Rx​αRy​βRz​γ= ​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​0001​ ​

万向锁

一旦选择 ±90° 作为 pitch 角，就会导致第一次旋转和第三次旋转等价，整个旋转表示系统被限制在只能绕竖直轴旋转，丢失了一个表示维度。

上面那段引言用人话说就是当 β 为 ±90° 时，绕 x 旋转与绕 z 轴旋转在结果上会等效。

万向锁这个问题如果直接使用变换矩阵 R 来解释的话会很直观，就如下面我们把 β = 90° 代入方程并化简

Copy R=Rx α Ry 90°Rz γ=(10000cosα−sinα00sinαcosα00001)(00100100−10000001)(cosγ−sinγ00sinγcosγ0000100001)=(0010sin(α+γ)cos(α+γ)00−cos(α+γ)sin(α+γ)000001)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=Rx​αRy​90°Rz​γ= ​1000​0cosαsinα0​0−sinαcosα0​0001​ ​ ​00−10​0100​1000​0001​ ​ ​cosγsinγ00​−sinγcosγ00​0010​0001​ ​= ​0sin(α+γ)−cos(α+γ)0​0cos(α+γ)sin(α+γ)0​1000​0001​ ​

很容易发现影响变换矩阵 R 的变量为 α + γ，而在几何上则体现为绕 x 轴的旋转表现与绕 z 轴等效，举例说明则是

Copy Rx 30°Ry 90°Rz 50°=Rx 0°Ry 90°Rz 80°R_{x}30°R_{y}90°R_{z}50° = R_{x}0°R_{y}90°R_{z}80°Rx​30°Ry​90°Rz​50°=Rx​0°Ry​90°Rz​80°

这里需要强调一下，本文中的旋转顺序为 z-y-x，上面的例子可描述为物体绕 z 轴旋转 80°、绕 y 轴旋转 90°、绕 x 轴旋转 0° 其姿态与绕 z 轴旋转 80°、绕 y 轴旋转 90°、绕 x 轴旋转 0° 相同。也就是产生万向锁时，空间中物体可通过多种不同的旋转方式转变为某一个特定姿态，即变换与其结果并非一一对应，而这在工程上的体现便是动画插帧会变得极其诡异。