为体现游戏的真实性、艺术性,动画效果一般都是由专门的动画师利用特定的软件提前制作完成,在游戏运行阶段,由游戏引擎对这些动画按照游戏的逻辑、用户输入等条件进行控制,有效地播放出来。当然,也有一些动画效果是通过游戏引擎实时计算得到的,没有被预先保存。
我们要讨论额角色动画是针对三维模型进行变性得到的动画序列。目前三维模型主要有两种表示方法,一种是网格模型,另外一种是骨骼模型。相应的角色动画类型也分为两种:网格动画和骨骼动画。网格动画具有更长的历史,计算简单,但需要保存更多的数据,并且和游戏环境交互较少、难于控制。骨骼动画是现在的游戏引擎中常用的动画方式,利用骨骼这一特殊结构保存角色姿态,只需要很少的数据量就可以表示角色的动画,并且对其控制的灵活度较高,虽然计算复杂,但由于容易和环境交互,能够得到实时计算的姿态,这些优点都使得其在游戏中越来越多地被使用。
本文将分别介绍这两种主要的角色动画方式,之后将介绍和骨骼动画相关的动作捕捉技术以及游戏引擎中用于实时动画生成的方法——逆向运动学以及布娃娃系统。
【1】网格动画
一种传统的动画形式,也叫作顶点动画、关键帧动画,或者变形动画。动画中的每关键帧(Keyframe)都单独保存。播放动画时需要在关键帧之间进行插值才能得到任意时间点的姿态。每帧保存的是模型网格信息,其实就是网格顶点的坐标信息,其他类似纹理等信息保持不变,所以只需保存一次。
由于角色由统一的数据结构(顶点、三角形)构成,缺乏高层次的语义信息。换句话说,给定一个网格模型文件,很难从中判断哪些三角形和顶点组成头部,哪些组成手部。《Quake》的MD3网格动画模型把人体分割成几个部分,每个部分都有自己独立的动画,并且很容易标记为一定的语义。相比之下《古墓丽影(Tomb Rader)》更进一步,将角色按生理结构分为许多部分,每个部分都有自己的网格,再用数据结构把所有的部分合理地组成一个有层次的整体,比如上臂连着前臂,前臂连着手,使得角色对动态环境有良好的适应性。在原理上很接近骨骼动画,但是很容易被玩家观察到身体不同部位的分离现象。
【1.1】网格动画插值方法
一般网格动画都是通过三维模型制作软件制作的,如3ds max、Maya等。动画师通过调整关键帧中的网格模型,其余帧的顶点位置由这些关键帧计算得到。
和电影、动画片不同,游戏中的帧率并不是保持不变的,由于电脑配置、场景复杂度等各方面的原因,游戏进行时无法按照固定帧率来刷新。所以播放时是按照实际时间计算动画帧以及每帧的位置。带来的问题是动画播放不流畅。为此,需要做非关键帧计算,这就需要用到插值技术。
使用线性插值可以在较少的系统占用条件下得到平滑的动画,但会造成网格变形等缺陷。其他差值策略:Bézier,Hermite曲线插值等。
【1.2】动画标签
在占用较少存储空间的条件下,标签系统比传统网格动画提供了更加灵活的动画控制方法,但也有一些不足。不同角色之间不能复用动画;仍不能处理角色和游戏场景的交互;身体部分划分有一定限制,划分太多会造成动画总数增加,并且控制困难。
总的来说,标签动画可以提高关键帧动画的使用效率,一定程度上解决了关键帧动画占用存储量大的问题。但造成了控制困难。其实在一定程度上来说,标签动画是使用网格动画来模拟骨骼动画的一种方法,它面临的很多问题可以用骨骼动画来解决。
【2】骨骼动画
前面介绍的网格动画也叫显式动画,因为所有动画数据都直接保存于文件当中,播放时直接绘制每一帧的网格即可;而骨骼动画又叫隐式动画,因为其动画数据和模型网格数据是分离的,骨骼动画需要保存骨架结构以及骨骼和网格顶点的关系,另外,还要保存动画文件,动画文件保存的是每一帧骨架的姿态,而不是网格动画中的网格信息。
网格动画易于实现,而骨骼动画相比来说具有更多的优势:占用存储量较少;可以实现很多实时动画效果,比如物理正确的动画、环境适应的动画以及角色之间的交互等;还可以重用动画数据,比如游戏中有10个不同的角色,但他们都有一样的走路动作,则只需要存储唯一的走路动画信息即可。
骨骼动画最大的问题是编码困难并且计算量大,特别是其中涉及逆向运动学和物理运算的时候,所占用的系统资源不容忽视。
【2.1】骨架结构
骨骼动画特别适用于对人物和其他的脊椎动物进行动画模拟。一般被模拟的角色由两部分表示:一个部分是形成角色生理层次的一系列骨骼,称为骨架(skeleton);另一部分是和骨架有映射关系的网格,称为皮肤(skin)。
骨骼动画的原理:肌肉产生力量牵动骨骼运动(通常都是旋转运动),骨骼运动导致身体各部位发生相应运动,同时,肌肉产生变形。这里肌肉力量的控制决定了一切,以这种方式形成的动画被称作动力学方式(后面我们介绍的布娃娃系统在一定程度上模拟了这个动力学过程),但完全使用动力学的方式来控制动画过于复杂并且稳定性很差。对于数字游戏来说,我们只关注最后能产生高质量的动画效果,所以绝大多数游戏引擎采用的都是另外一种更简单的方法:运动学的方法。运动学方法通常能利用较少的动画提供更逼真的动画。
【2.2】正向运动学
【2.3】骨骼蒙皮
需要注意的是骨骼动画的这些好处并不是没有代价的。与较少的内存消耗对应的是更大的计算量。但由于现代CPU的强大计算能力,这似乎不是一个大问题。我们甚至可以把一部分计算转移到图形处理器(GPU)上去,以保留更多的计算能力给其他的模块。有些游戏引擎利用了针对GPU的编程技术,将骨骼动画的计算放入硬件中来完成,可以提高骨骼动画的计算速度。
【3】动作捕捉技术
Motion Capture,也称为MOCAP,是一个对真实对象的运动进行捕捉并将其映射到三维角色上的技术,一般通过骨骼动画的方式实现。相比于传统的利用三维动画制作工具生成的关键帧动画技术来说,实时可见性、高效性以及可以生成高质量是运动捕捉技术的巨大优势,于是运动捕捉成为游戏开发行业用来生成运动数据的主要工具。
【3.1】运动捕捉动画的应用
由于运动捕捉技术生成的运动数据规模庞大而且难以控制,所以充分利用这项技术还是比较困难的。另外我们不能考虑到并预先制作所有可能的动画。所以在进行运动捕捉的时候,要将角色的所有动作分解为一系列运动单元(比如走路、跳跃、打拳等),对这些运动单元分别进行捕捉。为了能够在游戏引擎中使用,得到的数据需要使用专门的软件(比如MotionBuilder)进行必要的后处理操作。得到的运动数据就构成了角色的运动库,游戏引擎按照游戏的情节需要实时调用对应的运动单元驱使角色运动。
现在有几种不同类型的Mocap系统,一般可将它们分为3类:光学类、电磁类、机械类。不管哪种类型,都需要购置较为昂贵的设备、需要很多的技术经验和很精确的校准,所以很多游戏公司需要和专门的运动捕捉公司合作来完成动画制作。
【4】逆向运动学
正向运动学是在骨骼链和它们的角度已知的条件下,求解末端骨骼的位置。其基本原理已在前面的骨骼动画中做了介绍。在骨骼上绑定物体的时候用正向运动学会比较方便,但是它依然没有解决一个极大的问题:游戏人物与周围环境的交互。如果只利用正向运动学,一个拾取物品的动画片段只能在获取特定高度的物品时给出令人信服的动作。另外人物行走的动作也需要根据不同的地形作出调整以防止动作和场地出现不协调的现象,比如人物的脚穿透了地面或是人物在地面上滑动。这些都是正向运动学不能解决的。
在这时,“逆向运动学”(IK,Inverse Kinematics)就能动态地提供合理的解决方案。其目标是计算骨骼链中每个骨骼的角度,使得末端骨骼可以达到一个特定的位置,它从终端节点(比如手部)开始运算,然后逐层往上计算其他祖先节点的信息,这样,IK允许将终端骨骼在空间中定位,然后计算各祖先骨骼节点的旋转。IK的缺陷是计算复杂度较高。
【4.1】求解IK问题
骨骼链也称为运动链,改变一个骨骼的朝向会影响到其子骨骼。解决逆向运动学问题,通常有不止一种解法,下图是二维的情况,给出了三种解法,在三维空间会有更多解法。在游戏引擎中,需要使用简化的方法来求解这个无解问题。
目前,解决IK问题主要有两种方法:分解法和数值法。前者直接求解公式,是解决IK问题的快速和首选方法。然而IK链中有许多骨骼,利用分解法很难求解。数值法可以求解得到近似的结果,它通过多次迭代使得结果趋近于真实值;或者将问题分解为多个子问题分别求解。数值法比分解法开销要大。有两种常用的求解IK问题的数值方法:循环坐标下降(Cyclic Coordinate Decent,简称CCD)和雅克比矩阵(Jacobian Matrix)。
CCD方法通过对每个链分别求解来简化IK问题,该方法从叶子节点开始,逐渐提升骨骼链,尽可能缩小终端点和目标的差距,该方法需要经过多次IK链过程才能得到可接受的结果;另外,由于考虑的第一个链接是叶子节点(比如手腕和脚踝),那么误差最小化首先发生在这个链接上,可能导致手部或者脚部扭曲。
而雅克比矩阵方法描述的是整个IK骨骼链,雅克比矩阵的每一列表示的是每个骨骼链旋转时终端节点的变化(近似于线性变化)。求解雅克比矩阵虽然速度比较缓慢,但一般可以得到比CCD方法更好的结果。
接下来介绍两种常用的IK计算,以此说明逆向运动学在游戏引擎中的应用。
【4.2】“看”动作求解
【4.3】“拾取物品”动作求解
【5】布娃娃系统
布娃娃系统是一种基于物理的过程动画,其角色自身不主动运动来改变状态,而由外力决定。这些动画效果通过游戏引擎的物理系统实时计算得到。
布娃娃系统通常把生物体视为一个纯粹的钢架结构来进行牛顿力学计算,根据已知信息得到每帧的身体各部分的旋转和位置信息,然后利用FK计算骨架信息。这种方法的一个问题是生物体并非纯粹的钢架结构,这样产生的动画会非常机械化;另外一个问题是计算费时,游戏效率会受影响。所以当前游戏引擎中使用的动力学动画在游戏中应用的范围很窄,一般只用在人物死去时的动作模拟。可以用PhysX物理引擎模拟布娃娃系统。
布娃娃系统的原理不是很复杂,角色的结构和骨骼动画所不同的是,为了计算方便,通常用包围盒或其他较简单的几何体来代替骨骼,之间采用“关节”结构连接,有一定的旋转约束。