欧拉角与旋转

转载 2015年11月20日 21:09:39

原文地址:http://blog.csdn.net/mysniper11/article/details/8766574


欧拉角是一种常用的描述方位的方法。这项技术是著名数学家Leonhard Euler(1707~1783)的名字命名的,他证明了角位移序列等价于单个角位移。想详细了解的请点击维基百科:http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E8%A7%92#.E5.88.A5.E7.A8.AE.E9.A0.86.E5.BA.8F

1,什么是欧拉角

      欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。这听起来复杂,其实它是非常直观的。之所以有“角位移”的说法正是因为欧拉角能用来描述任意旋转,但最有意义的是使用笛卡尔坐标系并按照一定顺序所组成的旋转序列。最常用的约定,即所谓“heading-pitch-bank”约定。在这个系统中,一个方位被定义为一个heading角,一个pitch角,和一个bank角。它的基本思想就是让物体开始于“标准”方位——就是物体坐标轴和惯性坐标轴对齐。在标准方位上,让物体作heading,pitch,bank旋转,最后物体到达我们想要描述的方位。

     在精确定义术语“heading”“pitch”“bank”前,先让我们简要回顾本书中使用的坐标空间约定。我们使用左手坐标系,+x向右,+y向上,+z向前。

     heading为绕y轴的旋转量,向右旋转为正,旋转正方向是顺时针方向,经过heading旋转之后,pitch为绕x轴的旋转量,注意是物体坐标系的x轴,不是原惯性坐标系的x轴,依然遵守左手法则,向下旋转为正。最后,经过了heading,pitch后,bank为绕z轴的旋转量,依然是物体坐标系的z轴。

     当我们说到旋转的顺序是heading-pitch-bank时,是指从惯性坐标系到物体坐标系,如果从物体坐标系到惯性坐标系则相反。

2,关于欧拉角的其他约定

     前面曾提到过,heading-pitch-bank系统不是惟一的欧拉角系统,绕任意三个互相垂直轴的任意旋转序列都能定义一个方位。所以,多种选择导致了欧拉角约定的多样性:

     1)heading-pitch-bank系统有两个名称,当然,不同的名字并不代表不同的约定,这其实并不重要,一组常用的术语是roll-pitch-yaw,其中的roll对应与bank,yaw对应于heading,它定义了从物体坐标系到惯性坐标系的旋转顺序

     2)任意三个轴都能作为旋转轴,不一定必须是笛卡尔轴,但是用笛卡尔轴最有意义

     3)也可以选用右手坐标规则

     4)旋转可以以不同的顺序进行

3,优点:1)容易使用;2)表达简洁;3)任意三个角都是合法的

4,缺点:1)给定方位的表达方式不唯一;2)两个角度间求插值非常困难

采用限制欧拉角的方法来避免以上问题的出现:heading限制在+-180,pitch为+-90。

    以上为欧拉角的定义。旋转的方法如下:

从欧拉角矢量转换很容易,困难的部分是转换回来。XNA提供了一个方法可以创建旋转矩阵,但它并没有提供转换回来的方法,因此我们将不得不自己实现。

首先,我们转换为旋转矩阵,Matrix.CreateFromYawPitchRoll()方法可以做到这一点。如果这里使用欧拉角,我们需要以以下顺序提供坐标:

  • Yaw(偏航):欧拉角向量的y轴
  • Pitch(俯仰):欧拉角向量的x轴
  • Roll(翻滚): 欧拉角向量的z轴
想象一下飞机,yaw指水平方向的机头指向,它绕y轴旋转。Pitch指与水平方向的夹角,绕x轴旋转。Roll指飞机的翻滚,绕z轴旋转。下面的代码演示了这一过程:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">// Converts a rotation vector into a rotation matrix  
  2. Matrix Vector3ToMatrix(Vector3 Rotation)  
  3. {  
  4.     return Matrix.CreateFromYawPitchRoll(Rotation.Y, Rotation.X, Rotation.Z);  
  5. }</span>  

这种方法可以提供一个表示旋转的矩阵。下面是最难的部分:将矩阵转换为欧拉角。

这个过程是将矩阵拆散:一个表示位置的Vecto3,另一个表示缩放,而四元数表示旋转。然后,我们必须将这个四元数转换为一个欧拉角矢量。我不打算详细讨论代码背后的数学原理,但如果你有兴趣,可以到前面链接中的网址上去看看。

下面是将旋转矩阵转换为欧拉角的代码。

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">// Returns Euler angles that point from one point to another  
  2. Vector3 AngleTo(Vector3 from, Vector3 location)  
  3. {  
  4.     Vector3 angle = new Vector3();   
  5.     Vector3 v3 = Vector3.Normalize(location - from);   
  6.   
  7.     angle.X = (float)Math.Asin(v3.Y);  
  8.     angle.Y = (float)Math.Atan2((double)-v3.X, (double)-v3.Z);  
  9.   
  10.     return angle;  
  11. }  
  12.   
  13. // Converts a Quaternion to Euler angles (X = Yaw, Y = Pitch, Z = Roll)  
  14. Vector3 QuaternionToEulerAngleVector3(Quaternion rotation)  
  15. {  
  16.     Vector3 rotationaxes = new Vector3();  
  17.     Vector3 forward = Vector3.Transform(Vector3.Forward, rotation);  
  18.     Vector3 up = Vector3.Transform(Vector3.Up, rotation);  
  19.   
  20.     rotationaxes = AngleTo(new Vector3(), forward);  
  21.   
  22.     if (rotationaxes.X == MathHelper.PiOver2)  
  23.     {  
  24.         rotationaxes.Y = (float)Math.Atan2((double)up.X, (double)up.Z);  
  25.         rotationaxes.Z = 0;  
  26.     }  
  27.     else if (rotationaxes.X == -MathHelper.PiOver2)  
  28.     {  
  29.         rotationaxes.Y = (float)Math.Atan2((double)-up.X, (double)-up.Z);  
  30.         rotationaxes.Z = 0;  
  31.     }  
  32.     else  
  33.     {  
  34.         up = Vector3.Transform(up, Matrix.CreateRotationY(-rotationaxes.Y));  
  35.         up = Vector3.Transform(up, Matrix.CreateRotationX(-rotationaxes.X));  
  36.   
  37.         rotationaxes.Z = (float)Math.Atan2((double)-up.Z, (double)up.Y);  
  38.     }   
  39.   
  40.     return rotationaxes;  
  41. }  
  42.   
  43. // Converts a Rotation Matrix to a quaternion, then into a Vector3 containing  
  44. // Euler angles (X: Pitch, Y: Yaw, Z: Roll)  
  45. Vector3 MatrixToEulerAngleVector3(Matrix Rotation)  
  46. {  
  47.     Vector3 translation, scale;  
  48.     Quaternion rotation;  
  49.   
  50.     Rotation.Decompose(out scale, out rotation, out translation);  
  51.   
  52.     Vector3 eulerVec = QuaternionToEulerAngleVector3(rotation);  
  53.   
  54.     return eulerVec;  
  55. }</span>  

同时,欧拉角的顺序规定一共有12种,在转化的时候一定要弄清楚规定是怎样的。

相关文章推荐

OpenGL学习脚印: 欧拉角实现第一人称相机(FPS camera with Euler angle)

写在前面 上一节视变换(view transformation) ,介绍了相机的设置参数,并建立了圆形坐标系和球形坐标系下的相机位置随着时间改变的绘制立方体程序。程序中用户无法通过键盘和鼠标来...

OpenGL - 运动轨迹-欧拉角(姿态角)-万向锁

坐标系 要了解飞机姿态,需要首先知道什么是地面坐标系和机体坐标系。 ■地面坐标系(earth-surface inertial reference frame)Sg--------Oxgygzg ...
  • jscese
  • jscese
  • 2016年09月29日 17:10
  • 2632

欧拉角(Euler angles)

维基百科-欧拉角 欧拉角   欧拉角是由Lenhard Euler引入的,用于描述刚体方向的三个角,在3维欧几里得空间中描述这样一个方向,需要三个参数。它们(这种方向)可以多种形式给出, 欧拉角...

四元数 旋转 旋转矩阵 欧拉角互相转换

四元数的作用 表达旋转。 旋转的表达方式有很多种,有欧拉角,旋转矩阵,轴角,四元数(unit quaternion),unit quaternion是一种表达旋转的方式。 不同的旋转表达方式概览 ...

四元数、欧拉角及方向余弦矩阵的相互转换公式

四元数、欧拉角及方向余弦矩阵的相互转换公式

旋转:矩阵,四元数和欧拉角向量(2)

3D引擎中最常见坐标变换是旋转。有几种方式可以实现旋转:矩阵,四元数和角度向量(角度或弧度)。最精确和限制最小的方式是将他们存储在矩阵中。矩阵是一个数学概念,它是一个以行和列形式组织的矩形数学块。当这...

unity3d中的欧拉角

1.欧拉角Vector3(x,y,z)代表的是旋转物体(标准旋转坐标轴x,y,z若旋转物体则取反),且是将物体从物体坐标系旋转到惯性坐标系,旋转顺序为 z, y, x也就是roll pitch yaw...

欧拉角、内部旋转、外部旋转

从一个坐标系到另一个坐标系的转换前面谈到有多种转换方法:欧拉角法、方向余弦矩阵法、四元数法等。 其中欧拉角法的核心思想是:一个坐标系可以用另一个参考坐标系的三次空间旋转来表达。旋转坐标系的方法又有两...

四元数、欧拉角和旋转矩阵

四元数、欧拉角和旋转矩阵四元数、欧拉角和旋转矩阵都可以描述三维空间中的旋转,三者可以相互转化。这里四元数指的都是单位四元数,不改变向量的模,和旋转矩阵是正交的一个道理。欧拉角的转动顺序为Z→Y→XZ\...

旋转变换(二)欧拉角

本文主要描述了关于三维旋转的一种描述方式--欧拉角的概念以及应用以及使用它的一些缺陷...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:欧拉角与旋转
举报原因:
原因补充:

(最多只允许输入30个字)