顶点动画
3D动画本质上是模型的顶点轨迹,因此要记录一段动画,最原始的办法就是记录动画过程中所有的顶点信息。但由于肉眼的识别速度和GPU的处理能力都有限,因此有了桢(frame)的概念,帧是模型特定姿态的一个快照。为了进一步减少动画桢的内存占用,我们可以从动画的轨迹中提出中关键帧,保存每一个关键帧的模型网格信息,由引擎来得到平滑的动画效果(关键帧过渡),在关键帧之间平滑过渡的帧叫过渡帧或插值桢。
骨骼动画
针对于人/动物等具备骨骼特征的模型动画的一种优化,由于人的皮肤相对于其所属骨骼的相对偏移固定不变,因此皮肤顶点的空间位置可由其骨骼位置加上其相对偏移得到,所以我们无需记录皮肤上每个顶点信息,而记录对应的骨骼信息,这样我们实际得到的是一段简化版的”线段动画”,谓之骨骼动画。
由于骨骼与骨骼通常只有相对角度,没有相对位移,比如手掌不会脱离肘,因此我们无需单独记录每个骨骼的位置信息,只需记录骨骼与其父关节的相对角度,比如手掌的父骨骼为肘,肘的父关节为臂等,这样,我们需要为模型指定一个根骨骼(比如人体的脊椎),根据根骨骼的位置即可以推算出所有骨骼的位置,以完成正确渲染,为模型顶点绑定其内在骨骼的过程叫做蒙皮(skining),有些顶点可能需要绑定在多个骨骼上,比如关节处的皮肤。
骨骼动画为动画插值运算,逆向运动学得提供了可行性基础。
关于骨骼动画更多参考:http://www.cnblogs.com/kex1n/archive/2011/10/11/2207546.html
动画过渡
在给定的时间内,从一个动画平滑过渡到另一个动画的过程,叫做动画过渡,如在0.2s内,将动画从A切换到B,若动画A当前帧为FA1,动画B起始帧为FB1,我们用F1(W1)+F2(W2)表示一个插值桢,设过渡桢为10桢,那么这里有两种过渡方案:
首尾插值:动画引擎将随时间调整FA1,FB1的权重,对其插值融合,得到插值帧:FA1(1)+FB1(0), FA1(0.9)+FB1(0.1) … FA1(0)+FB1(1)。
交叉插值:动画一边过渡一边插值:FA1(1)+FB1(0), FA2(0.9)+FB2(0.1), … FA11(0)+FB11(1)
动画融合
在美术导入的资源中,只有每个模型的基本的动作,比如走,跑,跳等,而真正运动中需要的远不止这些,比如我们还需要快走,慢跑等,这些动画完全通过美术导出是不切实际的。现在的动画系统提供了一种动画融合机制,即由程序去控制多个动画的权重,插值合成新的动画。比如我们可以通过速度去控制走,跑动画的插值权重,得到我们想要的慢跑动画。另一个例子是CS中的持枪动作,美术可能导出了上下左右前后的持枪动作,对于任意角度,我们可能需要用到1-3个动画,对其进行融合得到对应角度的持枪动作,融合权重由当前角度而定,而如果这时候我们还希望模型能够保持慢跑动作,我们还需要合成下半身的动画,在融合时,模型慢跑动画的上半身动画权重为0,下半身动画权重为1,持枪动画权重相反,这样就得到一个灵活的模型,而美术只导入有限的基础动画即可。
动画过渡和动画融合本质上都用于生成平滑的动画,但前者用于两个动画的平滑切换,通过时间决定动画插值权重,而后者可用于多个动画(融合),并且动画插值权重由程序控制。
动画层
前面提到了CS人物模型的动画融合,它需要用到多个动画,对于慢跑动作,其上半身的融合权重通常为0,而对于持枪动作,其下半身的融合权重为0,但是动画系统仍然会去计算这一部分,造成了不必要的GPU/CPU浪费。如今一些动画系统提供了动画层的概念,可以在一个动画控制器里面存在多个动画状态机,并对它们自动融合。每个动画层可以有身体遮罩(Mask),亦即决定该动画运用于身体的那一部分,禁止哪一部分,被禁止的部分融合权重为0,并且不会参与运算。比如持枪动画层的身体遮罩应禁止下半身。
动画与模型变换
动画本身可由美术导入位移(Postion)和转向(Rotation)信息,这些变换是模型相对于自身坐标系的,要将这些变换运用于模型在世界坐标系的变换,有两种方式:由程序控制和由动画控制。由程序控制是指,程序控制模型的Transform,然后将Transform信息设置到动画系统,由动画系统去展现当前动作,比如走,跑等,这也是最早的动画交互方式。如此程序需要事先精确匹配动画的变换信息,否则可能出现滑步等现象。另外一种方式为了解决这类问题的:由动画控制模型变换,程序去动画系统拉取模型的变换信息,这虽然在表现层上体验更好,但也有一些问题:让渲染层决定了逻辑层,如果渲染帧卡了,会影响到逻辑帧处理。
Unity关于这方面有更灵活的控制,参见:http://blog.csdn.net/cubesky/article/details/39478207
逆向运动学
IK(Inverse Kinematic,逆向运动学,也称反向运动学)主要用于骨骼动画,前面提到,骨骼动画通过根骨骼(也叫模型的根节点)出发,根据其子节点的相对位置(角度)推算出子节点的绝对位置,从手臂到肘到手掌到手指,整个推算结构呈树形。而如果我们已知末节点的位置,逐步推算出所有其它节点的合理位置的过程即为IK。比如人物模型用手触碰一个固定物品,我们需要根据物品的位置,决定模型的动作。