游戏引擎架构----动画

来源:互联网 发布:js字符串转unicode 编辑:程序博客网 时间:2024/05/25 23:57
1.角色动画类型
  赛璐璐动画(cel animation):基于帧的,电子版本为精灵动画(sprite animation),可以设计成循环动画(looping animation) 
  刚性层阶式动画(rigid hierarchical animation):可能在关节处产生裂缝
  每顶点动画(per-vertex animation):网格添加动画,数据密集
  变形目标动画(morph target animation):极端的网格姿势+混合
  蒙皮动画(skinned animation):骨骼+皮肤

2.骨骼
刚性关节(joint)的树形层级结构构成。骨骼只是关节间的空位,关节是动画师控制的
内存中存储:关节名字,父关节索引,关节绑定姿势的逆变换矩阵(蒙皮绑定时关节的姿势)

3. 姿势
关节相对模型参考系的位置、定向和缩放。用矩阵或者SQT数据结构表示(缩放scale、四元数旋转quaternion、平移translation)
绑定姿势:参考姿势、放松姿势、T姿势
局部姿势:相对父关节的姿势,SQT表示。每个关节定义了一个坐标空间。把关节姿势变换Pj施于关节j坐标系表示的点时,得到的是父关节空间表示该点。即从子关节空间变换到父关节空间。Pj=P(j->parent(j))
全局姿势:在模型空间的姿势。从关节到根关节,乘以局部姿势得到。P2->m = P2->1*P1->0*P0->m

4. 动画片段(animation clip)
互动:动画
非互动:游戏内置电影(in-game cinematics IGC)、非交互连续镜头(non interactive sequence NIS)、全动视频(full motion video FMV)
半互动:快速反应事件(quick time event QTE)
动画片段的采样定义了连续函数。动画片段是 SQT组成的通道函数(channel funciton),通道函数是连续的。游戏引擎使用分段线性逼近的方法插值。
4.1 局部时间线:
时间:0-T
关键姿势(key pose)、关键帧+插值。t是实数,不一定是整数
时间比例(time scale):负值则动画倒转
帧:有时指一段时间,有时指一个时间点
采样(sample):代表时间点,那相应的时间可以指帧了。非循环动画:N帧有N+1个采样、循环动画:N帧有N个采样
相位(phase):归一化的时间,0表示开始,1表示结束
4.2 全局时间线
播放动画:局部时间映射到全局时间。循环就使用模除。起始时间、播放速率/时间比例、循环次数、持续时间
同步动画时,由于通信系统的时间延迟,造成动画不同步。使用全局时钟可以同步动画,将动画的全局开始时间匹配即可。
4.3 动画重订目标(retarget):
动画通常只兼容特定骨骼,此技术可以让动画适用于不同骨骼
4.4 元通道(metachannel):
非关节通道,如事件触发器通道,定位器通道。
定位器用于记录游戏中物体的位置和方向,也是一个仿射变换。可以设置摄像机的位置和角度

5. 蒙皮
网格每个顶点可以绑定至一个或者多个关节,再加权平均
蒙皮矩阵(skinning matrix):把网格顶点从绑定姿势的位置变换至骨骼的当前姿势的位置。蒙皮顶点的位置在模型空间定义的,所以变换前后的位置都在模型空间。
     顶点在绑定至关节的位置时,在关节空间是不变的:顶点在模型空间的位置->顶点在关节空间的位置->关节变换->顶点回到模型空间
     假设只有一个关节:则绑定姿势的网格位置VmB, 关节在模型空间中的绑定姿势B,关节在模型空间中的当前姿势C可得到:VmB * B^-1 * C = VmC      ==>  蒙皮矩阵:B^-1 * C:绑定姿势的逆矩阵*目标姿势的变换矩阵 
矩阵调色板(matrix palette): 一系列矩阵,每个矩阵对应了关节j的蒙皮矩阵。将网格顶点关联的蒙皮矩阵取出,加权求和后,将顶点从绑定姿势位置变成目标姿势位置,由于C是每帧变化的,B^-1会缓存起来
将模型空间变化到世界空间:乘以矩阵Mm->w,可以预处理将B^-1*Mm->w缓存
动画实例(animation instancing):多个角色同时播放单个动画。此时不应该将B^-1*Mm->w缓存

6.动画混合(animation blending)
将多个动画片段混合,对角色最终姿势起作用
6.0 无需混合
核心姿势:站立、蹲下
确保每个动画片段都以某个核心姿势开始核心姿势结束,就无需混合
6.1 线性插值混合
linear interpolation(LERP),混合百分比、混合因子=[0,1]
姿势混合通常在局部进行
应用:
     时间混合
     动作连续性(淡入淡出):混合因子随时间按三次函数变化:缓出曲线(ease out curve)、缓入曲线(ease in curve)
          圆滑过渡:两个片段的混合因子都同时变换,同时播放
          冻结过渡:一个片段冻结,另一个片段一遍播放一遍增加混合因子
     方向性运动:
          轴转移动(pivotal movement):按轴旋转
          靶向移动(targeted movement):面朝着一个方向,身体朝不同地方移动。制作三个基本动画:朝前、朝左、朝右做一个半圆,按照移动方向和靶向的角度选择混合因子
复杂的线性插值混合:
     一维线性插值混合:多个片段的一维混合
     二维线性插值混合:三个一维混合可得:x轴方向两个,求出中间姿势,y轴方向使用前面的两个中间结果得到。
     三角形的二维线性插值混合:a,b, 1-a-b的加权混合
     泛化的二维插值混合:利用Delaunay三角剖分求出一组三角形,再找到对应的姿势所在的三角形,最后用三角形的二维线插值混合得到结果
6.2 骨骼分部混合:
达到一只手做A一只手做B的效果
通过允许不同关节有不同的混合百分比实现。
混合因子为0,1时可以实现 混合遮罩(blend mask)
6.3 加法混合(additive blending):
区别片段(difference clip)
来源片段(source clip) + 区别片段 = 参考片段
目标片段 : 任何动画,+ 区别片段 = 其他片段,也是加法混合的意义
来源于矩阵的乘法,除法
加法混合的应用
     移动噪声
     瞄准及注释:对最左最上最右制作区别动画,混合至向前动画就可以得到其他的瞄准动画。(可以利用时间轴lerp)

7. 后期处理
布娃娃
逆运动学(inverse kinematics IK): 输入是全局姿势,称为末端受动器,根据误差最小化求出局部姿势
正向运动学(forward kinematics FK):输入是一组局部姿势,输出是一个全局姿势以及每个关节的蒙皮矩阵。

8. 压缩技术
通道省略:移除平移通道,减少存储姿势
量化:减少存储为数。浮点数转化为n整数表示
采样频率减少
选择性载入

9. 动画系统
9.1 动画系统架构
动画管道(animation pipeline):动画片段和混合因子作为输入局部骨骼姿势作为输出
动作状态机(action state machine ASM)
动画控制器(animation controller):每个控制器通常父子一个类型的角色行为,如掩护、跑步。能提供高层次的动画管理接口
9.2 动画管道
片段解压以及姿势提取->姿势混合->全局姿势生成->后期处理->重新计算全局姿势->矩阵调色板生成
数据结构:
     共享资源数据(shared resource data):骨骼、蒙皮网格、动画片段。骨骼是中心,蒙皮绑定至骨骼,动画应用于骨骼
     每实体状态信息(per-instance data structure):动画片段的状态(局部时钟、播放速率)、混合方法、混合权重、局部姿势、全局姿势、矩阵调色板
混合方法:
     加权平均法
     混合树:将6变成树的结构,就是加法混和必须为一个叶子节点,而其他的混合可以而且是叶子节点和内节点。
淡入淡出:
     加权平均法:调整片段权重、将片段逻辑分组,调节组权重
     混合树:加入一个二叉混合节点,混合原来的树和新的树
9.3 动作状态机
每个状态对应一个任意复杂的动画片段集合,在混合树架构中状态对应一棵树、加权平均法中状态对应一系列权重何一组片段
过渡:定义状态间的过渡矩阵
过渡方法:跳转、淡入淡出(引入过渡状态节点 transitional state)
状态层
     预备动作(anticipation):由一个部位引领其他部位的动作,即要独立操控不同部位,同时有多个状态出现
     引入状态层:每层在某一刻只有一个状态,不同层之间状态是独立的
9.4 约束
依附:依附点/定位器(locator):特殊的关节,仅仅为依附中的父子关系加入额外的变换
对准:多个角色参与一个动画
           利用定位器,使多个角色的动画中的定位器在世界空间内重合
解决滑步的方法:
  1. 动作提取:从动画中提取出每帧角色重心到局部空间原点的距离(利用元通道),作为速度参数来移动角色。同时将局部空间原点移动到此帧的角色重心处
     2. 脚步IK:脚接触地面时,记下其在世界空间的位置,我们用IK去调整腿的姿势,令脚能固定于正确位置
注视
掩护对准





原创粉丝点击