角色动画原理
1.精灵动画
精灵动画(Sprite Animation)是一种电子版的序列帧动画,它的诞生起源于最早期的卡通动画,既快速的连续的播放不同的画面,来产生角色的动态效果,就像电影胶片一般,通过快速切换来产生动画效果。
所谓精灵,就是一张张大小相同的位图。通常我们使用带有透明通道的图片格式保存,每一个区域都代表这个精灵在某一静止时刻的动作体现。下图展示了一个精灵动画的图像:
图 1 精灵动画位图
通常这组序列帧被设计为可重复循环播放,用来模拟一个运动周期,比如人物的行走奔跑等循环性的动作。
获取精灵动画的位图资源之后,在程序中只需将资源按单个动作图像大小进行切割,并存于数组中,在程序循环中根据时间的改变,顺序的循环显示不同的精灵动作,就可以实现出角色的动画效果。
这种动画技术的优点是通俗易懂,使用简单。缺点是一套动作通常需要很多动作片段组成,占用磁盘空间大,完全没有可扩展性。虽然它有如此多的缺点,但时至今日,在许多游戏中,仍然能看到它的身影。在某些特殊情况下,精灵动画的方案仍是首要选则。
2.刚性阶层动画
随着三维技术的出现,精灵动画已经不能满足高仿真角色动画的实现需求了,无论从开发的效率上,还是所呈现的效果的角度,需要一种新的技术来解决这些问题,这种新技术就叫做刚性阶层动画(Rigid hierarchical animation)。
在此方法中,一个完整的角色由多个刚性部分组合而成,比如人形角色一般会拆分成左右上手臂、左右下手臂、躯干,头部、左右大腿,左右小腿等部位。这些部位通过层级的形式互相约束,类似于人体的骨骼,是互相关联的,这样能产生比较真实的角色动画效果,下图是人类足部动画的示例图片:
图 2 刚性阶层动画
通过设定不同时刻,某一骨骼的旋转数据,可以快速的模拟出简单的人类角色动画。这种技术的优点是它减少了美术人员的工作量,也给程序层面提供了更多的可扩展性。
该技术最大的问题则是,角色的身体关节位置会出现明显的“裂缝”,如下图所示:
图 3 关节裂缝
对机器人等角色来说,这也许不是问题,但是对有血有肉的生物来说,这样就会很别扭。
3.目标变形动画
为了解决刚性阶层动画所出现的“裂缝”问题,出现了目标变形动画(Morph target animation),简单的讲,这种技术就是三维版本的精灵动画。此技术通过设置关键帧来存储不同时刻,某一三维角色在当前状态的顶点列表,即其当前时刻的动作表现。通过在不同的关键帧内进行插值操作,可以得到平滑的变换效果。下图是一个目标变形动画的例子:
图 4 目标变形动画
可以看到,通过在不同时刻,修改模型网格的位置变换,可以产生栩栩如生的人物面部表情。这种技术,通常用于人物得到面部动画,因为人物的面部具有非常复杂的解剖结构,动画师可以用目标变形动画来轻松的模拟人物的面部表情。
这种动画方式的优点是动画效果细腻逼真,而缺点与精灵动画相同,都需要大量的本地数据存储空间。
4.蒙皮动画
蒙皮动画(Skinned Animation)则是以上诸如关节裂缝等小问题的最佳解决方案。此技术融合了目标变形动画与刚性阶层动画的优点,允许三角网格进行形变,也允许角色有与阶层动画相同的层级关系。使得蒙皮动画同时拥有了高性能与高表现力。
在蒙皮动画中,角色的形变由其骨骼(Skeleton)表示,骨骼是有刚性的骨头(Bone)所组成的,其原理和刚性阶层动画相同。然而这些刚性的部件不会在渲染时显示,而是作为预处理数据,输入给蒙皮计算函数。称为“皮肤”的三角形网格会通过一定的规则绑定在不同的骨头上,所有的顶点会追踪关节(Joint)的变换(旋转,平移,缩放)。每个顶点可以以不同的权重绑定至多个关节,因此不会出现刚性阶层动画的“裂缝”问题,下图展示了一个成年男性的蒙皮动画模型:
图 5 角色蒙皮