在我们的3D数学中,如果使用矩阵来旋转的话就会显得十分的复杂和笨拙。计算中使用最为广泛的旋转方式为欧拉角。
欧拉角用三个旋转角表示3D空间中的方位和旋转(角位移),这三个旋转角都是绕着三个相互垂直的坐标轴旋转(可以是世界坐标系也可以是局部坐标系)同时也是计算机最能理解和高效的旋转方式。
heading-pitch-bank分别对应着三个相互垂直的轴向。
Paste_Image.png-
heading:垂直向上的是heading角(yaw)(笛卡尔的y轴),控制3D中的左右旋转。
-
pitch角:绕x轴旋转时pitch角,控制着物体在3D中的上下旋转。
- bank(roll):z轴。
3D中的经过旋转变换,就会旋转到一个新的方位,旋转前后所形成的夹角称为旋转角(也叫角位移)从上图可以看出使用欧拉角可以轻松的控制物体的旋转,无论物体在哪只需要控制它三个轴的旋转角就可以完成旋转。
相较于旋转矩阵的复杂变换,欧拉角轻巧明了。但是欧拉角也有需要缺点比如:无法使用欧拉角进行插值运算(如果你想进行插值需要先将欧拉角转换为矩阵或者四元数),还有万向锁现象。
万向锁:
万向锁是欧拉角最大的缺点,欧拉角在插值过程中很容易碰见万向锁现象。为什么会出现万向锁现象呢?
万向锁:因为我们的欧拉角旋转是通过3个旋转角来控制的,但是这些旋转并不是同时进行的。它们是具有先后的顺序的。
比如我们来看看unity中的欧拉角旋转顺序:
万向锁的解决方案:
- 使用欧拉角转化为四元数进行插值。
- 改变三个轴的旋转次序(我目前就只能理解这个解决方案)
程序中的欧拉角使用3x3的旋转矩阵(RotationMatrix)来表示由于它是绕着三个相互垂直的轴向进行旋转,所以在旋转变换的时候,需要考虑将物体坐标系到世界坐标系的转化过程:
Paste_Image.png- 3x3的旋转矩阵: