游戏引擎的动画系统及骨骼动画原理

一、《游戏引擎架构》动画系统

  • 动画的几种分类

    《游戏引擎架构》中简单介绍了几种动画种类、用途以及优劣,在《计算机动画算法与技术》中详细介绍了各种动画的算法原理;

    1. 精灵动画

    2. Spine动画

      针对游戏开发的2D骨骼动画,其蒙皮由网格变为sprite;

    3. 刚性层阶式动画

    4. 变形目标动画

      存储好关键帧数据,根据插值得到动画

    5. 蒙皮骨骼动画

     

    逐帧动画与关键帧动画

    1. 逐帧动画

      主要是精灵动画,需要准备好每一帧的资源

    2. 关键帧动画

      源于原画绘制时,主动画师只绘制关键帧,中间帧由学徒绘制,又称中割;

      降低了美术成本,程序拥有了更强的扩展性;

     

相关术语

  • 蒙皮,每个顶点都会保存其蒙皮信息,即绑定的骨骼及其相应的权重;

  • 骨架与关节 其在内存中的数据结构

    整个骨架的结构是一个树结构,每个关节都有一个唯一的父节点,所以只要每个关节存储父节点的索引就可以表达整个结构;最终一个关节的数据一般包括,关节名称,关节索引,关节的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[]数组,大小为关节数量;

    • 一个至多个动画片段,指定关节如何随时间而动;

  • 蒙皮信息计算

    关节的姿势以及网格的顶点都是在同一坐标系下的,最终无论保存的是局部姿势还是全局姿势,都是要根据全局姿势来计算,因为只有全局姿势才是和网格顶点在同一坐标系下,才能够进行计算;顶点绑定到关节,意味着关节和顶点的相对位置是不变的,所以我们只需要将顶点从模型坐标系下转换到关节坐标系下,然后通过当前的姿势矩阵变换关节的位置,最后再将顶点转换回模型坐标系下即可;从上可知,我们进行动画的计算需要知道的信息有,模型的顶点信息(模型坐标系),骨架中各关节的标准姿势,当前帧的骨架关节的姿势;这些信息,也就是一个游戏引擎需要读入的所有信息;

     三、动画混合

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值