【Maya】详解三维旋转动画的技术运用--上篇(概念介绍)

标签:
杂谈 |
分类: Animation |
我习惯于使用maya英文版,maya2012中文版的一些翻译或许会和我的理解有差异,但这里我不会进行特别提示,中文界面用户请自行对照翻译。有关旋转动画在实际中的运用技巧,将在下一篇中提到,此篇仅解释现象。
【欧拉旋转和万向节锁】
很多动画新手,对于万向节这个概念可能会很陌生。但如果你是从事于3D动画制作,尤其是和旋转有关的动画(角色骨骼动画),稍微深入的了解这个工业术语将对你有很大的帮助。
Gimbal:万向节,又称常平架或平衡环,常用于镜头的调整装置,如监视器,支架望远镜。这里讨论的万向节是三维动画中的旋转轴系统,不是汽车的部件Universal Joint(也叫万向节),也不是航行的船只或飞机上使罗盘等仪器保持水平位置的圆环支架。虽然原理上是差不多的,但现实仪器和计算机函数各自所受到的限制是不同的。
EulerRotaion:欧拉旋转。万向节的运动就是具有层级顺序的旋转轴运动,在3D软件中,表现为欧拉XYZ轴向旋转。每个物体都具有自身的欧拉旋转轴,且旋转轴之间的先后顺序可有六种不同的组合,以适应各类旋转动画的需要。
Maya中有两种欧拉旋转方式(位于GraphEditor中的Curves->ChangeRotationInterp)
:Independent(独立)和Synchronized(同步)。前者在调整关键帧的时候是将每个旋转轴向单独处理,后者则会强制同步三轴向的关键帧在时间线上的位置,这在使用GraphEditor的时候可看到效果。默认是Independent的方式。
欧拉旋转会引起的问题:
1.GimbalLock:万向节锁,也称为常平架锁定。在3D软件中,当旋转轴彼此重叠于平面上(旋转90°),在进行动画时,此重叠旋转轴将产生同样的效果(如XY轴重叠,此时无论转动X轴向还是Y轴向,物体都指向同样的位置)。这时方向轴失去了旋转自主性(旋转轴丢失),使用默认的欧拉旋转手柄,单轴向旋转物体的时候,会引起互补轴产生不必要的旋转,这说明已经发生了万向节锁。
2.GimbalFlipping:万向节翻转。当旋转关键帧之间的同轴差值大于180度,物体将在动画过程中发生突然翻转的现象。
3.旋转动画的路线“绕远”。调节旋转动画的动画师会经常遇到这样的现象,就是在某些方向上进行旋转动画的时候,物体不是进行最短距离的旋转,而是绕了个大弧线。
GimbalLock会造成旋转轴的丢失,那为什么我们在软件中操作的时候没有看到这个变化?这是因为软件为了操作的直观,固定着旋转手柄的外观,但背后其实是在进行着欧拉角计算,这点可以从通道栏中多组数值的变化看出。如果需要显示欧拉旋转的效果,可以双击Maya左侧工具盒的旋转工具图标,然后在工具设置窗口中选择Gimbal(或者直接点击右侧通道栏的Rotate文字,场景中的旋转手柄会快速切换为万向节模式)。使用Gimbal可以让我们很清楚的看到旋转轴发生的变化,但你也会发现在进行动画调节时会十分的别扭。
以下两图的比较,说明了GimbalLock发生时,旋转动画的异常结果:改变RotateX和RotateZ的数值,得到的是相同的结果。
GimbalLock造成万向节系统失去了某一方向的旋转轴,当我们使用物体的局部旋转操作手柄进行调节,看到的不仅仅是别扭的动画过程,还有就是通道栏数值的异常变化。
下图仅仅是改变了旋转控制手柄的Z旋转轴,就造成了所有旋转轴的数值变化。
解决万向节锁问题的思路在于更改旋转轴的层级,但是,旋转轴的层级关系恰恰就是万向节锁发生的原因。这里我精简的归纳为:除了层级最高的旋转轴,其他旋转轴只要发生90度以上的旋转,即产生万向节锁。所说的丢失轴向,表现为万向节翻转;万向节翻转的发生,正是由于万向节锁的存在。而只要发生了两个轴以上的旋转动画,旋转轴路线的绕远问题绝对会发生。
【旋转层级】
旋转层级,和maya中的RotateOrder(旋转顺序)有关。Maya默认的RotateOrder是xyz,意味着旋转顺序是x-y-z,旋转层级则是x<y<z(z层级最高,z包含y,y包含x)。
以下是层级对旋转动画的影响:
转动蓝色的z轴向,x和y轴向将随着改变;转动y轴向,x轴向将随着y轴而改变;旋转x轴,对任何轴向都没影响。
要按正确的旋转顺序进行,应该是:先调节x旋转轴,然后是y旋转轴,最后才是z旋转轴。
*根据经验,最高层级的旋转轴应该是动画中使用频率和数值范围变化最大的。Maya默认的xyz旋转顺序,对于常用的摄像机动画来说,并不是最佳的解决方案(下篇会详细说明)。
注意,改变物体的旋转顺序,只能在一定范围内适应动画的需要,并不能从根本上解决万向节锁的问题。虽然建立多个组来分离物体旋转轴是另一种避免万向节锁的方法,但是这并不是一种值得推广的技巧,因为有如下弊端:
1.需要在outliner中选择,调节数值不够方便;
2.动画路线不可预料,不能使用四元插值解决旋转路线的问题;
【四元插值】
解决翻转问题使用的是欧拉过滤(EulerFilter),解决绕远问题则是使用四元插值来计算动画曲线(四元插值也能同时解决万向节翻转的问题)。
对于从事CG制作而言,我们不需要去了解四元插值那个复杂的计算公式,但我们要知道这个概念的意义:获取球面旋转的最短路线(也可以反向求取最长路线)。例如制作人物肩膀部位手臂的旋转动画时,假如使用的是FK而不是IK,就很容易出现“绕远”的旋转路线甚至发生翻转动画;当引入四元插值计算,动画效果会更接近人物实际的行为。
欧拉旋转和四元插值的区别(摘自maya帮助文档)
*注意:无论对象旋转使用的是四元数还是 Euler 角度,“通道盒”(Channel Box)始终会显示 Euler 角度值。
【总结】
欧拉旋转会产生万向节锁,万向节锁会导致万向节翻转,可使用“欧拉过滤”解决;要减少万向节锁的发生几率,可以根据情况改变物体的旋转顺序;欧拉插值会产生旋转动画的路线不可预料,可使用“四元数”来纠正效果并同时解决万向节锁的问题。
【欧拉旋转和万向节锁】
很多动画新手,对于万向节这个概念可能会很陌生。但如果你是从事于3D动画制作,尤其是和旋转有关的动画(角色骨骼动画),稍微深入的了解这个工业术语将对你有很大的帮助。
Gimbal:万向节,又称常平架或平衡环,常用于镜头的调整装置,如监视器,支架望远镜。这里讨论的万向节是三维动画中的旋转轴系统,不是汽车的部件Universal Joint(也叫万向节),也不是航行的船只或飞机上使罗盘等仪器保持水平位置的圆环支架。虽然原理上是差不多的,但现实仪器和计算机函数各自所受到的限制是不同的。
EulerRotaion:欧拉旋转。万向节的运动就是具有层级顺序的旋转轴运动,在3D软件中,表现为欧拉XYZ轴向旋转。每个物体都具有自身的欧拉旋转轴,且旋转轴之间的先后顺序可有六种不同的组合,以适应各类旋转动画的需要。
:Independent(独立)和Synchronized(同步)。前者在调整关键帧的时候是将每个旋转轴向单独处理,后者则会强制同步三轴向的关键帧在时间线上的位置,这在使用GraphEditor的时候可看到效果。默认是Independent的方式。
欧拉旋转会引起的问题:
1.GimbalLock:万向节锁,也称为常平架锁定。在3D软件中,当旋转轴彼此重叠于平面上(旋转90°),在进行动画时,此重叠旋转轴将产生同样的效果(如XY轴重叠,此时无论转动X轴向还是Y轴向,物体都指向同样的位置)。这时方向轴失去了旋转自主性(旋转轴丢失),使用默认的欧拉旋转手柄,单轴向旋转物体的时候,会引起互补轴产生不必要的旋转,这说明已经发生了万向节锁。
2.GimbalFlipping:万向节翻转。当旋转关键帧之间的同轴差值大于180度,物体将在动画过程中发生突然翻转的现象。
3.旋转动画的路线“绕远”。调节旋转动画的动画师会经常遇到这样的现象,就是在某些方向上进行旋转动画的时候,物体不是进行最短距离的旋转,而是绕了个大弧线。
GimbalLock会造成旋转轴的丢失,那为什么我们在软件中操作的时候没有看到这个变化?这是因为软件为了操作的直观,固定着旋转手柄的外观,但背后其实是在进行着欧拉角计算,这点可以从通道栏中多组数值的变化看出。如果需要显示欧拉旋转的效果,可以双击Maya左侧工具盒的旋转工具图标,然后在工具设置窗口中选择Gimbal(或者直接点击右侧通道栏的Rotate文字,场景中的旋转手柄会快速切换为万向节模式)。使用Gimbal可以让我们很清楚的看到旋转轴发生的变化,但你也会发现在进行动画调节时会十分的别扭。
GimbalLock造成万向节系统失去了某一方向的旋转轴,当我们使用物体的局部旋转操作手柄进行调节,看到的不仅仅是别扭的动画过程,还有就是通道栏数值的异常变化。
下图仅仅是改变了旋转控制手柄的Z旋转轴,就造成了所有旋转轴的数值变化。
解决万向节锁问题的思路在于更改旋转轴的层级,但是,旋转轴的层级关系恰恰就是万向节锁发生的原因。这里我精简的归纳为:除了层级最高的旋转轴,其他旋转轴只要发生90度以上的旋转,即产生万向节锁。所说的丢失轴向,表现为万向节翻转;万向节翻转的发生,正是由于万向节锁的存在。而只要发生了两个轴以上的旋转动画,旋转轴路线的绕远问题绝对会发生。
【旋转层级】
旋转层级,和maya中的RotateOrder(旋转顺序)有关。Maya默认的RotateOrder是xyz,意味着旋转顺序是x-y-z,旋转层级则是x<y<z(z层级最高,z包含y,y包含x)。
以下是层级对旋转动画的影响:
要按正确的旋转顺序进行,应该是:先调节x旋转轴,然后是y旋转轴,最后才是z旋转轴。
*根据经验,最高层级的旋转轴应该是动画中使用频率和数值范围变化最大的。Maya默认的xyz旋转顺序,对于常用的摄像机动画来说,并不是最佳的解决方案(下篇会详细说明)。
注意,改变物体的旋转顺序,只能在一定范围内适应动画的需要,并不能从根本上解决万向节锁的问题。虽然建立多个组来分离物体旋转轴是另一种避免万向节锁的方法,但是这并不是一种值得推广的技巧,因为有如下弊端:
1.需要在outliner中选择,调节数值不够方便;
2.动画路线不可预料,不能使用四元插值解决旋转路线的问题;
【四元插值】
解决翻转问题使用的是欧拉过滤(EulerFilter),解决绕远问题则是使用四元插值来计算动画曲线(四元插值也能同时解决万向节翻转的问题)。
对于从事CG制作而言,我们不需要去了解四元插值那个复杂的计算公式,但我们要知道这个概念的意义:获取球面旋转的最短路线(也可以反向求取最长路线)。例如制作人物肩膀部位手臂的旋转动画时,假如使用的是FK而不是IK,就很容易出现“绕远”的旋转路线甚至发生翻转动画;当引入四元插值计算,动画效果会更接近人物实际的行为。
欧拉旋转和四元插值的区别(摘自maya帮助文档)
*注意:无论对象旋转使用的是四元数还是 Euler 角度,“通道盒”(Channel Box)始终会显示 Euler 角度值。
【总结】
欧拉旋转会产生万向节锁,万向节锁会导致万向节翻转,可使用“欧拉过滤”解决;要减少万向节锁的发生几率,可以根据情况改变物体的旋转顺序;欧拉插值会产生旋转动画的路线不可预料,可使用“四元数”来纠正效果并同时解决万向节锁的问题。