欧拉角

来源:互联网 发布:mac虚拟机iso镜像文件 编辑:程序博客网 时间:2024/05/01 23:15

角位移

       角位移(Angular displacement)描述物体转动时位置变化的物理量。

       概念:构件内任意一线段(或平面)由原始位置到新位置转过的角度称为该线段(或平面)的角位移。

有限角位移

        有限角位移不是矢量,因为它不满足对易律。两个矢量相加,遵守平行四边形加法所遵守的对易律。即:A+B=B+A

        如果把一个长方体先绕z轴转90度,再绕y轴转90度,得到图1所示结果。


         若把它先绕y轴转动90度,再绕z轴转动90度,得到图2所示结果。

   两种情况都是绕两个轴各转了90度,只是转动的顺序不同,最终结果不同,因此不满足对易律。刚体做有限转动时,转动的顺序很重要。

无限小角位移

   无限小的角位移是矢量。

欧拉角

   欧拉角是yaw-pitch-roll次序;在Unity里,欧拉旋转的旋转顺序是ZXY

   水平坐标系(Local Level System ,LLS),亦称NED坐标系、地理坐标系或惯性直角坐标系,是一种站心直角坐标系,它的原点与载体坐标系的原点重合以消除坐标原点的漂移,X轴指向当地北子午线(North),Y轴与X轴垂直指向东(East),Z轴与X轴、Y轴垂直形成右手坐标系(Down)。

   在一种特殊的情况下,当载体沿向北的方向平稳运行时,其右向将恰指向东向,此时的载体坐标系与LLS坐标系重合。

   确定导弹(或飞机)在空间中的方向需要用三个角度,分别为偏航角、俯仰角和滚转角,这三个角度通常称为欧拉角,或弹体的姿态角。这三个角度是地面坐标系与弹体坐标系之间的角度关系,即地面坐标系经过三次旋转即可转到弹体坐标系。

偏航角

   偏航角定义为导弹oy在水平面上投影地面坐标系OY轴(在水平面上,指向目标为正)之间的夹角,由OY轴逆时针转至导弹导弹纵轴的投影线时,偏航角为正,反之为负。

俯仰角

机体坐标系x与水平面的夹角。当机体坐标系的x轴在惯性坐标系XOY平面上方时,俯仰角为正,否则为负。

滚转角

  滚转角定义为弹体的Oy轴与惯性坐标系的夹角。从弹体尾部沿纵轴往前看,若Oy轴位于铅垂平面的右侧,形成的滚转角为正(转动角速度方向与纵轴Ox轴的正向一致),反之为负。



注:机体坐标系和惯性坐标系都是采用右手坐标系。



欧拉角—万向锁

万向锁是一种什么现象?

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

        为了对这一现象有一个感性的认识,拿起手机做如下的几个旋转。

        首先确定手机的物体坐标系朝向,假设z轴与手机屏幕垂直(手机平放于桌面)指向上方,手机较短的一条边为x轴,较长的一条边为y轴(方向由手机尾部指向头部),物体坐标系的原点是手机左下角的顶点。(注意旋转顺序为zyx

        z轴旋转任意角度(注意xy轴也跟着一起旋转),再绕y轴旋转90°,再绕x轴旋转任意角度。通过多次尝试,会发现一个共同点:z轴永远是水平的, 通俗的说,手机永远也不会立起来!本来以为手机会指向任何方向,但实际上手机好像是被锁在桌面上,只能指向水平的某个方向,这个现象就称为万向锁。

        而如果绕y轴旋转不等于90°也好89°也好),只要选择适当的绕xz的角度,就可以让手机指向三维空间中的任何一个方向,手机是自由的,也就不会遇到万向锁现象。

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

 

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

        在游戏中,当角色旋转的动画触发时,角色就会做一系列连续的旋转变换,每一个变换都要用一组欧拉角来表示,但是不可能把每一个方位的欧拉角都存储起来,因此动画师定义了一系列关键帧,指定关键帧处角色的方位(用一组欧拉角描述),然后计算机根据时间t对这几组欧拉角进行插值,得到一系列欧拉角。

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

       总结:如果动画师在某个关键帧处指定了会引发万向锁的方位,则下一个关键帧的方位一旦超出了万向锁的约束范围,则这两个关键帧之间的路径就会发生偏移,反映在角色动画上是旋转偏移,反映在镜头控制上就是镜头抖动。

怎样解决万向锁问题?                                                                          

        出现这个问题的根本原因是在万向锁情况下对欧拉角的插值不是线性的,因此旋转路径发生偏移。

解决方法是:

        将欧拉角转换为四元数,对四元数进行slerp即球面线性插值,再将这一系列四元数转换为对应的欧拉角,而后作用于角色。缺点是耗费一定的内存,但角色可以任意旋转,灵活度高。


        xx:当旋转顺序一定时,只要绕第二个轴,旋转90度,那么后面设备的活动自由度就会大大折扣;如果第二个轴没有旋转90度,那么调整第一和第三个轴的转向,就可以转出好多个状态。


1 0
原创粉丝点击