《3D数学基础:图形与游戏开发》
预期结果1,什么是欧拉⾓?
2,万向锁是⼀种什么现象?
3,游戏动画中遇到万向锁时会发⽣什么?
4,怎样解决万向锁这个问题?inspired
⼀,什么是欧拉⾓?
母语英文
⽤⼀句话说,欧拉⾓就是物体绕坐标系三个坐标轴(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°(即绕第⼆个轴的旋转),就会出现万向锁现象。
为了对这⼀现象有⼀个感性的认识,请拿起⾃⼰的⼿机(没有?不会吧)和⼀⽀笔(⽤作旋转轴),亲⼿做如下的⼏个旋转。
新标准日语初级单词⾸先确定⼿机的物体坐标系朝向,为了⽅便记忆,我们假设z轴与⼿机屏幕垂直(⼿机平放于桌⾯)指向上⽅,⼿机较短的⼀条边为x轴,较长的⼀条边为y轴(⽅向由⼿机尾部指向头部),物体坐标系的原点是⼿机左下⾓的顶点。(注意旋转顺序为zyx)
托福词汇红宝书绕z轴旋转任意⾓度(注意x和y轴也跟着⼀起旋转),再绕y轴旋转90°,再绕x轴旋转任意⾓度。通过多次尝试,你会发现⼀个共同点:z 轴永远是⽔平的,通俗的说,⼿机永远也不会⽴起来!本来我们以为⼿机会指向任何⽅向,但实际上⼿机好像是被锁在桌⾯上,只能指向⽔平的某个⽅向,这个现象就称为万向锁。
⽽如果绕y轴旋转不等于90°(1°也好89°也好),只要选择适当的绕x和z的⾓度,就可以让⼿机指向三维空间中的任何⼀个⽅向,⼿机是⾃由的,也就不会遇到万向锁现象。
三,游戏动画中遇到万向锁时会发⽣什么?
加拿大维多利亚大学之所以会出现万向锁现象,本质原因是,当第⼆次旋转⾓度为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
dictatorial
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数学基础:图形与游戏开发》中提到的“路径偏移”和“摄像机抖动”。
总结:如果动画师在某个关键帧处指定了会引发万向锁的⽅位,则下⼀个关键帧的⽅位⼀旦超出了万向锁的约束范围,则这两个关键帧之间的路径就会发⽣偏移,反映在⾓⾊动画上是旋转偏移,反映在镜头控制上就是镜头抖动。
nikki reed
要获得路径偏移的感性认识,可以参考这个视频:这个视频和我的描述有些不同,该视频使⽤⼀个称为万向节的奇怪装置解释的,⽽我是直接⽤的物体坐标系但路径偏移都是⼀样的。
四,怎样解决万向锁这个问题?
出现这个问题的根本原因是在万向锁情况下对欧拉⾓的插值不是线性的,因此旋转路径发⽣偏移。
解决⽅法是:
将欧拉⾓转换为四元数,对四元数进⾏slerp即球⾯线性插值,再将这⼀系列四元数转换为对应的欧拉⾓,⽽后作⽤于⾓⾊。缺点是耗费⼀定的内存,但⾓⾊可以任意旋转,灵活度⾼。