浅谈欧拉角与万向节死锁
在正文前想说的话
欧拉角旋转与基础的沿单坐标轴逆时针旋转不同,欧拉角主要是解决有关物体朝向(Orientation)的问题,如果沿用传统的构造旋转矩阵的思路来理解欧拉角,会造成很大的困扰。
而我在阅读 Real Time Rendering 4th时不甚理解欧拉角的运作,后来参考了博主AndrewFan的两篇文章《【Unity编程】Unity中的欧拉旋转》和【Unity编程】欧拉角与万向节死锁(图文版),总算是弄明白了欧拉角到底是怎么一回事。
关于欧拉角的定义可以直接参考以上两篇文章,写得很好,这里就不再赘述了。这篇文章我想谈谈我自己对于欧拉角的定义以及欧拉角的万向节死锁的理解。
欧拉角与计算机图形学
在表示旋转与定向时,我们可能会问,为什么放着严谨简便的旋转矩阵不用,反而要去用欧拉角这种难以理解的方法呢?(这里避且不谈四元数)
我们可以想一下,如果用旋转矩阵表示一个朝向的话,我们首先要规定三个参考坐标轴的轴向和旋转顺序,然后是关于每个坐标轴的旋转尺度,最后将关于三个坐标轴的旋转矩阵乘起来,存储到一个容量为9的数组中。
而对于欧拉角而言,当规定好欧拉角的顺归与轴序之后,只需要三个旋转角就可以了,从物理空间上理解,显然欧拉角要比旋转矩阵方便得多。
虽然旋转矩阵很好理解,但是无论是欧拉角还是之后的四元数都比旋转矩阵表示旋转与定向要灵活且可操作性强。
关于欧拉角定义的浅见
欧拉角是经验角。真正想要理解欧拉角以及为什么欧拉角会自锁,就要充分理解平衡环架(Gimbal)或者陀螺仪的物理结构。
除此之外,我们也可以通过数学的方法理解欧拉角。(以下部分公式参考自Real Time Rendering 4th)
定义一个欧拉角:
E ( h , p , r ) = { e 00 e 01 e 02 e 10 e 11 e 12 e 20 e 21 e 22 } = R z ( r ) R x ( p ) R y ( h ) E(h,p,r)=\left\{\begin{matrix} e_{00}&e_{01}&e_{02}\\ e_{10}&e_{11}&e_{12}\\ e_{20}&e_{21}&e_{22}\end{matrix}\right\}=R_z(r)R_x(p)R_y(h) E(h,p,r)=⎩⎨⎧e00e10e20e01e11e<