欧拉角

在我们的3D数学中,如果使用矩阵来旋转的话就会显得十分的复杂和笨拙。计算中使用最为广泛的旋转方式为欧拉角。
  欧拉角用三个旋转角表示3D空间中的方位和旋转(角位移),这三个旋转角都是绕着三个相互垂直的坐标轴旋转(可以是世界坐标系也可以是局部坐标系)同时也是计算机最能理解和高效的旋转方式。

欧拉角_第1张图片
Paste_Image.png

  heading-pitch-bank分别对应着三个相互垂直的轴向。

欧拉角_第2张图片
Paste_Image.png
  • heading:垂直向上的是heading角(yaw)(笛卡尔的y轴),控制3D中的左右旋转。

  • pitch角:绕x轴旋转时pitch角,控制着物体在3D中的上下旋转。

欧拉角_第3张图片
Paste_Image.png
  • bank(roll):z轴。
欧拉角_第4张图片
Paste_Image.png
欧拉角_第5张图片
Paste_Image.png

3D中的经过旋转变换,就会旋转到一个新的方位,旋转前后所形成的夹角称为旋转角(也叫角位移)从上图可以看出使用欧拉角可以轻松的控制物体的旋转,无论物体在哪只需要控制它三个轴的旋转角就可以完成旋转。

相较于旋转矩阵的复杂变换,欧拉角轻巧明了。但是欧拉角也有需要缺点比如:无法使用欧拉角进行插值运算(如果你想进行插值需要先将欧拉角转换为矩阵或者四元数),还有万向锁现象。

万向锁:

万向锁是欧拉角最大的缺点,欧拉角在插值过程中很容易碰见万向锁现象。为什么会出现万向锁现象呢?
  万向锁:因为我们的欧拉角旋转是通过3个旋转角来控制的,但是这些旋转并不是同时进行的。它们是具有先后的顺序的。
比如我们来看看unity中的欧拉角旋转顺序:

欧拉角_第6张图片
Paste_Image.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)来表示由于它是绕着三个相互垂直的轴向进行旋转,所以在旋转变换的时候,需要考虑将物体坐标系到世界坐标系的转化过程:

欧拉角_第7张图片
Paste_Image.png
  • 3x3的旋转矩阵:
欧拉角_第8张图片
Paste_Image.png

你可能感兴趣的:(欧拉角)