欧拉角 思考

来源:互联网 发布:肯德基好吃的推荐 知乎 编辑:程序博客网 时间:2024/05/01 23:46

观看视频(视频在 /Users/yingfeng/Movies/math/欧拉角/欧拉旋转.zip),其实欧拉角  出现 万向锁 只在 动态 就是 绕物体坐标轴旋转时候才会出现,因为,坐标轴 旋转 顺序有关,比如 y x z , 旋转y 时候影响 x和z ,旋转 x 只影响 z

看视频 ,当y 轴旋转之后,x旋转 90 度,导致 z  和 y 重合 ,这样就出现 万向锁了。动画抖动也是来源于此。当进行两个旋转的插值的时候,出现万向锁时,就会出现 y 轴 和 z轴旋转在同一平面,出现不是预想的旋转 结果。如果要达到预想的结果必须旋转3个轴,视频出现了不合理的旋转曲线。







http://zh.wikipedia.org/wiki/欧拉角


其中 

动态的定义


的推导  可以 值得 学习

其实就是 关于 相机矩阵的推导 有关,但是角度不一样。


关于欧拉角 有几篇文章可以读一下

http://www.cnblogs.com/wonderKK/p/3970594.html

http://www.cnblogs.com/wonderKK/p/3969408.html

http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.html

http://www.cnblogs.com/yiyezhai/p/3176725.html

http://game.ceeger.com/Unity/Doc/2011/Gimbal_Lock.html

http://quaternions.blog.163.com/blog/static/20608214720134184924552/



----------------

http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.html


首先来看一下什么是欧拉角(Euler angles)?
构件在三维空间中的有限转动,可依次用三个相对转角表示,即进动角、章动角和自旋角,这三个转角统称为欧拉角。——引自百度百科
莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向。
对于任何一个参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定
换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。——引自wikipedia


http://blog.csdn.net/anluzsj/article/details/4585510
欧拉角的旋转都是基于local space的,在自己推导公式的时候有一点需要注意的是,欧拉角表示的旋转是针对“space”的,而对space的变换跟对point的变化恰好是一个逆过程,由于我们需要的
是一个对point的变换矩阵,所以可以在用公式推导时把角度取反,例如pitch (绕x轴旋转)30度,就可以按照-30度来推导公式。





http://blog.sina.com.cn/s/blog_557d254601018ddv.html


在刚体的问题上,xyz 坐标系是全局坐标系, XYZ 坐标系是局部坐标系。全局坐标系是不动的;而局部坐标系牢嵌于刚体内。称 xy-平面与 XY-平面的相交为交点线,用英文字母(N)代表。α 是 x轴与交点线的夹角,β 是 z-轴与Z轴的夹角,γ 是交点线与X轴的夹角。
欧拉角

 我们也可以给予欧拉角两种不同的动态定义。一种是绕着固定于刚体的坐标轴的三个旋转的复合;另外一种是绕着实验室参考轴的三个旋转的复合。
( 1 ) 绕着 XYZ 坐标轴旋转:最初,两个坐标系统xyz 与 XYZ 的坐标轴都是重叠的。开始先绕着 Z-轴旋转 α 角值。然后,绕着 X-轴旋转β 角值。最后,绕着 Z-轴作角值 γ 的旋转。
( 2 ) 绕着 xyz 坐标轴旋转:最初,两个坐标系统 xyz 与 XYZ 的坐标轴都是重叠的。开始先绕着 z-轴旋转 γ角值。然后,绕着 x-轴旋转β 角值。最后,绕着 z-轴作角值α的旋转。










http://www.cnblogs.com/tclikang/archive/2012/11/29/2794687.html

本文讲解的欧拉角旋转顺序为x,y,z。对应矩阵为[z][y][x]。当y为90°时会引起死锁。

欧拉角插值问题分析。

答:事实1 . 单个欧拉角能够正确表示旋转无论死锁还是不死锁。但是当两个欧拉角插值的时候,由于死锁的存在,导致插值后的欧拉角表示的旋转与原始的两个欧拉角表示的旋转差异很大。

         事实2. 一种旋转可以用多种欧拉角表示。例如,x角度为100,与x角度为460其实是一样的。X角度为-179其实和+179很接近。更有甚者,当出现死锁的时候,同一种旋转有无数种欧拉角表示。具体方法参照文章Computing Euler angles from a rotation matrix

         事实4. 当欧拉角接近死锁的时候会引起抖动。例如48.5557    82.8384       48.0888以及   141.922       81.0177             142.027.这两个欧拉角其实非常相近,但是除了y角之外其余两个坐标差异比较大。因为两个欧拉角的y旋转角度都接近90°了,越靠近90°,y轴的微小变动就对xz两个角度影响非常大,所以进行插值的时候直接进行插值会引起抖动。例如上面的插值结果可能为5.23894            90.9103       5.05811,这个结果与上面两个原始角度所表达的方向都不一样。

欧拉角插值解决方法

答:1. 将需要插值的两个欧拉角转化成矩阵,再通过矩阵分解出所有可能的欧拉角,找出两个比较相近的欧拉角进行插值。用此种方法可能引起抖动,如事实4中所示,当y轴的角度靠近90°的时候,就算使用矩阵分解找出两个最为相近的欧拉角,这两个找出来的欧拉角还是会差异很大。因为y轴的小变化就会引起xz角度的大幅变化。

2.真正的解决方法

设有两个欧拉角A,B进行插值。A,B两角表示的旋转是非常相似的,但是其角度数值差异比较大。其中A.y以及B.y接近90°。

步骤一:将A,B做同一个旋转,例如将A,B都绕Y轴正方向旋转45°。务必将旋转后A.y和B.y的角度保持在70°以内

步骤二:将旋转后的A,B转换成旋转矩阵。

步骤三:将矩阵A和矩阵B分解出各种可能的欧拉角。

步骤四:找出A矩阵和B矩阵分解出来的所有的欧拉角中最为相近的两个欧拉角。

步骤五:对这两个欧拉角进行插值得到欧拉角C。

步骤六:将C绕y轴正方向旋转-45°。









http://blog.csdn.net/huazai434/article/details/6458257


一,什么是欧拉角?

    用一句话说,欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度。

在这里,坐标系可以是世界坐标系,也可以是物体坐标系,旋转顺序也是任意的,可以是xyz,xzy,yxz,zxy,yzx,zyx中的任何一种,甚至可以是xyx,xyy,xzz,zxz等等等等。。。。。。所以说欧拉角多种多样。欧拉角可分为两种情况:

   1,静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

  2,动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

对于分别绕三个坐标轴旋转的情况,下述定理成立:

物体的任何一种旋转都可分解为分别绕三个轴的旋转,但分解方式不唯一。如:

假设绕y轴旋转为heading,绕x轴旋转为pitch,绕z轴旋转为bank,则先heading45°再pitch90°等价于先pitch90°再bank45°。

二,万向锁是一种什么现象?

    对于动态欧拉角,即绕物体坐标系旋转。(静态不存在万向锁的问题)无论heading和bank为多少度,只要pitch为±90°(即绕第二个轴的旋转),就会出现万向锁现象。

三,游戏动画中遇到万向锁时会发生什么?

    之所以会出现万向锁现象,本质原因是,当第二次旋转角度为90°时,第三个轴就被转到了与第一个轴相同的方向,因此手机缺失了一个自由度(竖直方向的自由度缺失),只剩下第一个轴和第二个轴的自由度。而只有两个自由度意味着手机的运动被限制在了二维空间中,因此手机永远立不起来。

      在游戏中,当角色旋转的动画触发时,角色就会做一系列连续的旋转变换,每一个变换都要用一组欧拉角来表示,但是不可能吧每一个方位的欧拉角都存储起来

因此动画师定义了一系列关键帧,指定关键帧处角色的方位(用一组欧拉角描述),然后计算机根据时间t对这几组欧拉角进行插值得到一系列欧拉角

      如果pitch不是±90°,就不会出现万向锁现象,插值后的一系列欧拉角完全可以刻画出我们所期望的角色旋转路径。

      如果某个关键帧的pitch即绕第二个轴的旋转为90°,就会遇到万向锁,这时手机只能在水平面内旋转,如果动画师指定下一个关键帧手机的方位不是立起来的,没有任何问题,但如果指定的下一个关键帧的方位是立起来的,会出现什么情况呢?

      为了能有一个感性的认识,还是以手机为例,下面我指定了四个关键帧,四个关键帧处手机的方位分别用R0,R1,R2,R3四组欧拉角表示(逆时针为正方向,右手法则):

(注意R0处的物体坐标系与世界坐标系的指向是相同的,我假定z轴向上,x轴向右,y轴指向自己的胸口)

                  绕z轴旋转角度       绕y轴旋转角度      绕x轴旋转角度

R0:                     0                              0                       0

 

R1:                    90                             0                       0

 

R2:                    90                            -90                      0

 

R3:                     0                              0                       90

请先分别对手机做这四个变换,然后记住手机的这四个方位,想象一下你“期望”的连续的动画应该是什么样子的。

   简单说明如下:初始时刻,手机位于桌面上,屏幕朝上,手机头部指向你的胸口,然后,手机在桌面内逆时针旋转90°,知道手机头部指向右侧,然后手机的右边开始高起来,直到与桌面垂直,此时手机头部仍然指向右侧,由于R2的第二次旋转是90°,因此手机进入万向锁模式。然后手机应该背对着你,垂直于桌面站立起来,直到手机是竖直的背对你。    

      但实际情况是否是这样的呢?

      你可以自己尝试对这个四个方位角插值,然后进行旋转,看看得到的路径是否和上述我们所期望的相同。

      以下是我的尝试:

      求出R0 到R1以及R1到R2的插值,然后旋转,完全符合上面的路径。但是再求出R2到R3的几个插值后,旋转得到的路径与期望不符。比如这两个插值:?????????

   z:60  y:60  x:30

   z:    45     y:45    x:45.

做这两个旋转,你会发现手机与桌面不垂直,也就是R2到R3的路径与期望的发生了偏移。这就是《3D数学基础:图形与游戏开发》中提到的“路径偏移”和“摄像机抖动”








http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.html

欧拉角与万向节死锁

首先来看一下什么是欧拉角(Euler angles)?
构件在三维空间中的有限转动,可依次用三个相对转角表示,即进动角、章动角和自旋角,这三个转角统称为欧拉角。——引自百度百科
莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向。对于任何一个参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。——引自wikipedia

好了,引完了,我来说一下我的理解吧,欧拉角是对旋转的一种刻画方式,就像其他刻画方式一样如旋转矩阵,四元数。欧拉角对应的旋转矩阵可以看作是三个绕轴旋转的旋转矩阵的复合。
问题来了,三个绕轴旋转的旋转矩阵绕的是什么坐标系下的轴?
对于坐标系E下的欧拉角(α,β,r)和以下哪个旋转矩阵是等价的
1.绕坐标系E下的x轴旋转α,绕坐标系E下的y轴旋转β,绕坐标系E下的z轴旋转r,三个矩阵的复合
2.绕坐标系E下的x轴旋转α,绕 坐标系E在绕x轴旋转α后的新系E'下的y轴旋转β,绕 坐标系E'在绕y轴旋转β后的新系E''下的z轴旋转r,三个矩阵的复合
通俗的讲,我们在旋转时,要不要把坐标系一起转动?
事实上两种理解都可以,当然,两种转法并不等价,下面我来解释这个问题,
当我们讲到坐标系E下的欧拉角(α,β,r)时,这句话是有歧义的,我们必须定义旋转顺序,因为旋转顺序会影响旋转结果。
如果假设旋转顺序是先绕x轴再y轴再z轴,x-y-z,那么这个欧拉角对应的旋转矩阵是指上述的2所表示的旋转矩阵。
如果假设旋转顺序是先绕z轴再y轴再x轴,z-y-x,那么这个欧拉角对应的旋转矩阵是指上述的1所表示的旋转矩阵,等等,你肯定会问,这难道不是把2中的先后顺序换一下就行了吗,"绕坐标系E下的z轴旋转r,绕 坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β,绕 坐标系E'在绕y轴旋转β后的新系E''下的x轴旋转α,三个矩阵的复合"难道不是这样吗?是的,当然也是这样。

下面我来证明两种复合方式是相等的,
为了方便证明我先定义一些记号,
记:
绕坐标系E下的x轴旋转α的旋转矩阵为Rx,
绕坐标系E下的y轴旋转β的旋转矩阵为Ry,
绕坐标系E下的z轴旋转r的旋转矩阵为Rz,

绕坐标系E下的z轴旋转r的旋转矩阵为Rr(Rr=Rz),
绕 坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β的旋转矩阵为Rb,
绕 坐标系E'在绕y轴旋转β后的新系E''下的x轴旋转α的旋转矩阵为Ra,

另外,将矩阵R的逆记作R~

求证:Rx*Ry*Rz = Rr*Rb*Ra

证明:
Rr = Rz  定义就是一样的,显然相等

Rb = Rr~*Ry*Rr 要得到绕 坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β的旋转矩阵为Rb,可以先应用Rr~这时可以视作在E下,然后使用E下的旋转Ry绕旧的y轴旋转,在应用Rr转回到E'

Ra = (Rr*Rb)~*Rx*(Rr*Rb) 理由同上

所以 右边=Rr*Rb * Ra
         =Rr*Rb * (Rr*Rb)~*Rx*(Rr*Rb)
         =(Rr*Rb)* (Rr*Rb)~*Rx*(Rr*Rb)
         =Rx*(Rr*Rb)
         =Rx*(Rr*Rr~*Ry*Rr)
         =Rx*Ry*Rz =左边 
#证毕

这与DirectX在文档中对D3DXMatrixRotationYawPitchRoll的描述是一致的



D3DXMATRIX * D3DXMatrixRotationYawPitchRoll(
  D3DXMATRIX *pOut,
  FLOAT Yaw,     //绕y轴的转动角
  FLOAT Pitch,   //绕x轴的转动角
  FLOAT Roll     //绕z轴的转动角
);

The order of transformations is roll first, then pitch, then yaw. Relative to the object's local coordinate axis, this is equivalent to rotation around the z-axis, followed by rotation around the x-axis, followed by rotation around the y-axis.


关于欧拉角讲到这里就差不多了,下面来探讨一个和欧拉角有关的概念万向节死锁。

讲到欧拉角一般都会提到万向节死锁,什么是万向节死锁(Gimbal Lock)呢?
万向节死锁有时又被简称为万向节锁或者万向锁,是指当三个万向节其中两个的轴发生重合时,会失去一个自由度的情形。
下面的视频很好的说明了这一点。

正因万向节死锁的存在,使用欧拉角是无法实现球面平滑插值的,
如上图,此时如果下一帧要让箭头指向右侧后方,那么绿色和蓝色对应的旋转角必定要发生突变,因为目前如果想朝着垂直红色圈的方向旋转箭头就像被卡住一样,我想这就是叫它死锁的原因吧
总之万向节死锁会导致位置上连续变化 在数值表示上确是非连续的。给定的两个关键帧之间无法平滑过渡。顺便提一下解决方法,可以使用四元数球面线性插值(Slerp) 
您好!请问,四元数转欧拉角出现的奇点问题跟这个万向锁是一个问题吗?四元数到欧拉角也会有跳变,但不知道是不是跟这个问题是一个问题





0 0