一、《游戏引擎架构》动画系统
-
动画的几种分类
《游戏引擎架构》中简单介绍了几种动画种类、用途以及优劣,在《计算机动画算法与技术》中详细介绍了各种动画的算法原理;
-
精灵动画
-
Spine动画
针对游戏开发的2D骨骼动画,其蒙皮由网格变为sprite;
-
刚性层阶式动画
-
变形目标动画
存储好关键帧数据,根据插值得到动画
-
蒙皮骨骼动画
逐帧动画与关键帧动画
-
逐帧动画
主要是精灵动画,需要准备好每一帧的资源
-
关键帧动画
源于原画绘制时,主动画师只绘制关键帧,中间帧由学徒绘制,又称中割;
降低了美术成本,程序拥有了更强的扩展性;
-
相关术语
-
蒙皮,每个顶点都会保存其蒙皮信息,即绑定的骨骼及其相应的权重;
-
骨架与关节 其在内存中的数据结构
整个骨架的结构是一个树结构,每个关节都有一个唯一的父节点,所以只要每个关节存储父节点的索引就可以表达整个结构;最终一个关节的数据一般包括,关节名称,关节索引,关节的SQT局部姿势数据;
Pelvis(骨盘)索引一般为0,
Max中通常由两种骨骼,bip和bone;
-
姿势
骨架是关节的集合,骨架的姿势为其所有关节的姿势的集合,而姿势的数据结构通常简单地以SQT数组表示(Q为四元数表示的角度),那么绑定姿势的数据结构为所有关节姿势组成的SQT数组;
-
动画片段,用于表现角色的个别动作(粒度较小),使用关键帧技术对姿势进行插值计算,每个关键帧所保存的数据就是每个关节在该时间点的姿势数据;
-
动画系统架构
-
动画管道
共享资源数据:明确各资源数据结构之间的关系,骨架是统合各方的元素,蒙皮绑定至骨骼,动画驱动骨骼,但蒙皮和动画片段没有直接关系;
-
动画状态机
-
动画控制器
-
二、骨骼动画原理
三维模型/网格数据
-
三维模型通常在DCC工具如Max、Maya中制作,必须编写相应的导出器Exporter获取数据并存储为引擎可读的格式才行;DCC软件会提供一些标准或半标准的导出格式,比如导出为FBX格式,但是这些格式基本上都不完全适合游戏使用(要明白游戏运行的CPU以及内存资源都是很宝贵的),所以往往要建立自定义格式以及编写专门的导出器,或者在资源导入时创建专门的导入器(Importer),如Unity会为所有支持的资源编写导入器(如Unity的Texture Importer、Model Importer等),
-
骨架与关节 其在内存中的数据结构
整个骨架的结构是一个树结构,每个关节都有一个唯一的父节点,所以只要每个关节存储父节点的索引就可以表达整个结构;最终一个关节的数据一般包括,关节名称,关节索引,关节的SQT局部姿势数据;
Pelvis(骨盘)索引一般为0,
Max中通常由两种骨骼,bip和bone
-
骨骼动画数据
骨骼网格是一种特殊网格,为关节动画而绑定到骨骼层次结构上(因为关节动画驱动骨骼运动,骨骼驱动所绑定的的网格运动)。骨骼网格在看不见的骨骼上形成皮肤,因此,骨骼网格又称皮肤,网格顶点绑定到骨骼的操作也称为蒙皮,骨骼网格每个顶点都会包含其蒙皮信息,即一组关节索引和权重信息;
游戏引擎需要三种数据渲染骨骼动画
-
网格本身,网格的位置信息、蒙皮信息等等,Unity中一个顶点最多允许绑定4个骨骼,其BoneWeight结构体也正是对应了四个关节索引和权重值;
-
骨架结构,包含关节的名字、父子关系、网格绑定到骨骼时的姿势,也就是标准姿势T-Pose,一般使用全局姿势,Unity的Mesh类中会有一个BindPose变量,它是一个Matrix4x4[]数组,大小为关节数量;
-
一个至多个动画片段,指定关节如何随时间而动;
-
-
蒙皮信息计算
关节的姿势以及网格的顶点都是在同一坐标系下的,最终无论保存的是局部姿势还是全局姿势,都是要根据全局姿势来计算,因为只有全局姿势才是和网格顶点在同一坐标系下,才能够进行计算;顶点绑定到关节,意味着关节和顶点的相对位置是不变的,所以我们只需要将顶点从模型坐标系下转换到关节坐标系下,然后通过当前的姿势矩阵变换关节的位置,最后再将顶点转换回模型坐标系下即可;从上可知,我们进行动画的计算需要知道的信息有,模型的顶点信息(模型坐标系),骨架中各关节的标准姿势,当前帧的骨架关节的姿势;这些信息,也就是一个游戏引擎需要读入的所有信息;
三、动画混合