三维旋转表示方法(欧拉角与旋转矩阵相互转化推导)
欧拉角
欧拉角一般用来形容飞机或者车船这些物体,一般以绕车头或机头方向旋转的角度叫做横滚角 roll, 绕着飞机顶部向上的轴旋转的角度叫做偏航角 yaw, 绕着飞机机身横向轴旋转的叫做俯仰角 pitch,这种方式的好处是理解起来比较直观,这里需要注意的是,欧拉角并不是和xyz轴固定绑定的,是人为规定的,后面我们只说绕 xyz 轴旋转多少角度,不再说横滚角、偏航角、俯仰角这些名词了。
内旋与外旋
首先,介绍两个概念:
内旋:以上次旋转后的坐标为参考系继续旋转。
外旋:始终以世界坐标为参考系进行旋转。
再介绍一个规律:
内旋以 x-y-z 顺序绕轴旋转的结果,等于 外旋以 z-y-x 的顺序绕轴旋转,下边是一个例子,两个旋转的结果一致。
- 内旋,绕 X 轴旋转 30 度,旋转后以当前坐标为参考系绕 Y 轴旋转了 45 度,之后又同样的绕 Z 轴旋转 60 度。
- 外旋,绕 Z 轴旋转 60 度, 再绕世界坐标系的 Y 轴旋转 45 度,再绕世界坐标系的 X 轴旋转 30 度。
所以,当我们想以内旋方式,描述一个物体的旋转时,可以通过计算相反顺序的外旋来表示。
旋转公式推导
通过一个例子来说明推导过程,将一个点 X0 = (x0, y0, z0) 以内旋的方式,按照 z-y-x 的顺序分别旋转 w, v, u 度数。
因为内旋的结果与外旋相反顺序的旋转结果一致,所以我们可以按照外旋的计算方法,以 x-y-z 的顺序进行计算。
首先,绕 x 轴旋转 u 度,得到旋转后的点 X1 = (x1, y1, z1), 按照二维旋转的推导方式,可以得到下边的公式。
下面是推导过程,忘记的可以参看上次发的二维旋转的推导文章
然后,绕 y 轴旋转 v 度,得到旋转后的点 X2 = (x2, y2, z2)。
下边是推导过程
最后,绕 z 轴旋转 w 度,得到旋转后的点 X3 = (x3, y3, z3)。
欧拉角度推导旋转矩阵
将上边的三次旋转分别写成矩阵形式。
绕 x 轴旋转 u 度的矩阵:
绕 y 轴旋转 v 度的矩阵:
绕 z 轴旋转 w 度的矩阵:
将三个矩阵乘在一起,可以得到一个最终的旋转矩阵,其中c()代表cos(),s()代表sin():
旋转矩阵推导欧拉角
通过旋转矩阵对应元素的意义,可以推导出相应的欧拉角。
其中,矩阵元素对应关系如下:
万向节锁 Gimbal Lock
当 v 为 +90 度或 -90 度的时候,cos(v) 为 0,r11,r21,r32,r33 都是 0,因为 0 不可以做分母,所以上边从矩阵推导欧拉角的时候就会出现问题。
因此在从矩阵推导欧拉角的时候,我们需要判断 v 是否是 +90 / -90 度:
如果 v 是 -90 度,r31 是 1, u + w = tan-1(-r12 / -r13);
如果 v 是 +90 度,r31 是 -1, u - w = tan-1(r12 / r13)。
其中令 u 或者 w 为 0, 就可以求出另一个角度。
参考
- GAMES101-现代计算机图形学入门-闫令琪 Lecture 04 Transformation Cont.
- https://danceswithcode.net/engineeringnotes/rotations_in_3d/rotations_in_3d_part1.html