《游戏引擎架构》 笔记(二) 动画系统

每顶点动画技术:存储随时间改变的顶点位置和法线
变形目标动画: 移动网格顶点,仅制作相对少量的固定极端姿势,然后运行时混合姿势,线性差值(LERP),常用于面部动画。
蒙皮动画

游戏引擎会限制每个顶点能绑定的关节数目,典型的限制为每顶点4个关节。
原因如下:首先,4个8位关节索引能方便地包裹为一个32位字,此外,每顶点使用2个、3个及4个关节所产生的质量很容易区分,但大多数人并不能分辨出每个顶点4个关节以上的质量差别。

典型的蒙皮顶点数据结构

蒙皮网格的顶点会追随其绑定的关节而移动。
我们需要求一个矩阵,该矩阵把网格顶点从原来的位置(绑定姿势)变换至骨骼的当前姿势,我们称此矩阵为蒙皮矩阵。
该矩阵把绑定姿势的模型空间变换至当前姿势的模型空间。

蒙皮矩阵
K = 绑定姿势矩阵的逆矩阵 * 当前姿势矩阵

矩阵调色板(Matrix palette)
我们须计算一组蒙皮矩阵Kj,当中每个矩阵对应第j个关节。此数组称为矩阵调色板。
当要渲染一个蒙皮网格时,矩阵调色板便要传送至渲染引擎。渲染器会为每个顶点查找调色板中合适的关节蒙皮矩阵,并用该矩阵把顶点从绑定姿势变换至当前姿势。

假设角色的姿势随时间改变,其当前姿势矩阵便需要每帧更新。然而,绑定姿势逆矩阵在整个游戏中都是常量,因为骨骼的绑定姿势是模型创建时确定下来的。因此绑定姿势逆矩阵通常会缓存于骨骼,并不需要在运行时计算。

每个顶点最终会由模型空间变换至世界空间。因此有些引擎会把蒙皮矩阵调色板预先乘以物体的模型-世界变换。这是个很有用的优化。

动画混合(animation blending)
指能令一个以上的动画片段对角色最终姿势起作用的技术。
混合是把两个或更多的输入姿势结合,产生骨骼的输出姿势。

比如,通过混合负伤及无负伤的步行动画,我们可以生成二者之间不同负伤程度的步行动画。

动画混合可用于对面部表情、身体站姿、运动模式等的极端姿势之间插值。

动画混合也可以用于求出不同时间点的两个已知姿势之间的姿势。
通过在短时间段内把来源动画逐渐混合至目标动画,就能把某动画圆滑地过渡至另一动画。

四元数
线性插值 LERP
球面线性插值 SLERP
详见相关数学知识

为了在不同的动画片段之间平滑过渡:
1.位置连续 C0连续(continuity)
2.速度连续(位置的导数) C1连续,速度及动量的连续性
3.加速度连续(速度的导数)C2连续
若使用更高阶的连续性,角色的动作会显得更佳及更真实。
通常难以达到严格数学上的C1或以上的连续性。
通常使用线性插值(LERP)达到C0动作连续性就可以了。

两种常见的淡入淡出过渡方法
圆滑过渡(smooth transition)
冻结过渡(frozen transition)

β 线性差值中的混合因子
为达到圆滑的过渡,我们可以令β按时间的三次函数变化,例如用一维贝塞尔曲线。
当把这些曲线应用正在淡出的当前片段时,该曲线就称为缓出曲线(ease-out curve);当应用到正在淡入的新片段时,称为缓入曲线(ease-in curve)

无需混合就能产生连续动作的方法:
动画师确保其片段的最后姿势能匹配后续片段的首个姿势。
创作一段圆滑的动画,然后把它切为两个或两个以上的动画片段。

方向性运动
靶向移动 详见书482页,有助于理解unity中的混合树(Blend Tree)
轴转移动

技术清单:
Delaunay三角剖分(Delaunay triangulation)

骨骼分部混合
人可独立控制身体不同部位。例如,可以在步行时挥动右臂,并同时令左臂指着某物。在游戏中实现这种动作的方法之一是,使用名为骨骼分部混合(partial-skeleton blending)的技术。

混合遮罩(blend mask)
unity中也有相关概念,可结合理解。
可以把某些关节的混合百分比设为0,来掩盖那些关节。

现实中,在跑步中挥手时,挥手动作比站立时更“晃动”及不受控制,骨骼分部混合无法实现这样的真实性。另一种更自然的技术:加法混合。

加法混合(additive blending)
区别片段(difference clip)- 代表两段正常动画的区别。
考虑两个输入片段 来源片段(source clip S)、参考片段(reference clip R)
区别片段 D = S – R
若区别片段D加进原来的参考片段,我们就会得到来源片段。
只需要把某百分比的D加进R,我们也可以产生介于R和S之间的动画。就像线性插值。
加法混合技术之美在于:制作一个区别片段之后,可以把该片段加进其他不相关的片段,而不仅限于原来的参考片段。

加法混合相关的数学公式见书489页

动画后期处理(animation post-processing)

OGRE
Ogre::Entity
Ogre::AnimationStateSet
Ogre::AnimationState 对应一个动画片段

约束
注视(look-at):角色能注视环境中的兴趣点。角色可以仅用眼睛注视,又或者同时用眼和头,又或加入上半身的扭动。注视约束有时候是以IK或程序式关节偏移实现的,但更自然的观感可用加法混合实现。
掩护对准(cover registration):角色在掩护时要和掩护物完美对齐,这通常是用参考定位器技术来实现。

动画系统架构
动画管道 animation pipeline
动作状态机 action state machine, ASM
动画控制器 animation controller

发布者

yjwx0017

C++软件工程师