在我们的3D数学中,如果使用矩阵来旋转的话就会显得十分的复杂和笨拙。计算中使用最为广泛的旋转方式为欧拉角。
欧拉角用三个旋转角表示3D空间中的方位和旋转(角位移),这三个旋转角都是绕着三个相互垂直的坐标轴旋转(可以是世界坐标系也可以是局部坐标系)同时也是计算机最能理解和高效的旋转方式。
![](https://img.haomeiwen.com/i3600976/a831ce522516d651.png)
heading-pitch-bank分别对应着三个相互垂直的轴向。
![](https://img.haomeiwen.com/i3600976/daf686eaff793b09.png)
-
heading:垂直向上的是heading角(yaw)(笛卡尔的y轴),控制3D中的左右旋转。
-
pitch角:绕x轴旋转时pitch角,控制着物体在3D中的上下旋转。
![](https://img.haomeiwen.com/i3600976/545f0bb74c7e0e29.png)
- bank(roll):z轴。
![](https://img.haomeiwen.com/i3600976/051b30ab32021848.png)
![](https://img.haomeiwen.com/i3600976/7818469e4aff30ec.png)
3D中的经过旋转变换,就会旋转到一个新的方位,旋转前后所形成的夹角称为旋转角(也叫角位移)从上图可以看出使用欧拉角可以轻松的控制物体的旋转,无论物体在哪只需要控制它三个轴的旋转角就可以完成旋转。
相较于旋转矩阵的复杂变换,欧拉角轻巧明了。但是欧拉角也有需要缺点比如:无法使用欧拉角进行插值运算(如果你想进行插值需要先将欧拉角转换为矩阵或者四元数),还有万向锁现象。
万向锁:
万向锁是欧拉角最大的缺点,欧拉角在插值过程中很容易碰见万向锁现象。为什么会出现万向锁现象呢?
万向锁:因为我们的欧拉角旋转是通过3个旋转角来控制的,但是这些旋转并不是同时进行的。它们是具有先后的顺序的。
比如我们来看看unity中的欧拉角旋转顺序:
![](https://img.haomeiwen.com/i3600976/b447af1ea1c4b7fa.png)
我们可以看出unity中的欧拉角是按照先旋转z轴,在旋转x轴,最后旋转y轴的顺序来进行的,所以它们是具有旋转顺序的,而这个顺序也是非常重要的。
当我们旋转,由于旋转是有先后顺序,它们的三个轴向就存在着父子级关系。(如z轴为父级,那z轴旋转时会带动x轴,x轴旋转时则不会影响z轴),此时问题就发生了,如果x轴旋转了正负90度,那它很有可能就和z轴重合了。z轴在进行旋转时,就会带动x轴也旋转,这时就产生了万向锁现象。
老外讲解万向锁的视频:讲得十分的棒!。
http://v.youku.com/v_show/id_XNjk1MTkzMTM2.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0
万向锁的解决方案:
- 使用欧拉角转化为四元数进行插值。
- 改变三个轴的旋转次序(我目前就只能理解这个解决方案)
程序中的欧拉角使用3x3的旋转矩阵(RotationMatrix)来表示由于它是绕着三个相互垂直的轴向进行旋转,所以在旋转变换的时候,需要考虑将物体坐标系到世界坐标系的转化过程:
![](https://img.haomeiwen.com/i3600976/111b0f4c99e557dd.png)
- 3x3的旋转矩阵:
![](https://img.haomeiwen.com/i3600976/a8a2a90dc37af39c.png)
网友评论