约 22 分钟技术学习游戏引擎

Games104学习笔记(11)

GAMES104:高级动画技术——动画树、IK 和表情动画

第 9 讲|主题:Animation System — Advanced Animation Technology
视频时长:约 1 小时 46 分 54 秒
说明:本文根据本地视频课件与讲解脉络整理,不是逐字稿;内容承接第 8 讲的骨骼动画基础。

一句话理解

基础骨骼动画回答“如何播放一个动作片段”,高级动画系统则回答“如何让角色在任意游戏状态下看起来仍然合理”。动画混合与动画树将多个 Clip 组合成连续动作;IK 在基础姿态之上满足脚踩地、手触物等空间目标;面部动画和动作重定向分别增强角色的情感表达与资产复用。它们共同把离线制作的动作资产转化为能响应游戏状态的最终 Pose。

本讲学习目标

  • 理解动画混合、交叉淡入淡出、混合空间与叠加混合各自在解决什么问题。
  • 区分动画状态机、分层状态机、动画树与动画蓝图的职责。
  • 掌握两骨骼 IK 的几何直觉,以及多关节 IK 的主要难点。
  • 了解 CCD、FABRIK、雅可比矩阵等多关节 IK 求解思路。
  • 理解 IK 约束、可达性、非唯一解、碰撞与自然性为何必须一起考虑。
  • 认识表情动画的精度需求、动作单元、Morph Target 与肌肉模型。
  • 理解动画重定向如何复用动作,以及它仍无法自动解决的接触与比例问题。

1. 从单一 Clip 到游戏中的复杂动作

上一讲的运行时管线可以从 Animation Clip 中按时间采样局部 Pose,再经过前向运动学与蒙皮得到角色网格。但真实游戏角色并不会始终播放单一 Clip:

  • 速度连续变化,需要在走、跑、冲刺之间平滑过渡。
  • 角色可能一边移动,一边瞄准、挥手、装填或受击。
  • 动作切换需要考虑起落脚、身体重心与片段相位。
  • 手和脚需要根据环境位置做最后修正。

因此,高级动画的基本策略不是试图预制每一种最终姿态,而是分层处理:先由动作片段和游戏参数构造合理的基础 Pose,再用约束、IK 和局部表现系统进行修正。

可以把本讲的总流程理解为:

游戏状态与控制参数 → 动画状态机/混合树 → 基础 Local Pose → IK 与后处理 → Model Pose → 蒙皮与渲染

2. 动画混合:多个动作共同贡献最终姿态

2.1 什么是 Animation Blending

动画混合(Animation Blending)指让多个 Animation Clip 同时对角色最终 Pose 产生贡献,而不是在两个动作之间硬切换。若角色速度从步行速度逐渐增大到跑步速度,直接把“走路”替换为“跑步”会造成姿态和节奏突变;混合则让两段动作在一段过渡区间内按权重共同生成姿态。

对同一关节的平移、缩放,可使用线性插值:

$p = (1-\alpha)p_A + \alpha p_B$

对旋转,通常采用 NLERP 或 SLERP 等四元数插值方式。这里的 (α ∈ [0, 1]) 是混合权重:0 表示完全采用 A,1 表示完全采用 B。

动画混合的关键不是“把两帧图像叠起来”,而是针对骨架的每个关节通道混合局部变换,再通过前向运动学恢复完整骨架姿态。

2.2 Clip 相位对齐

两个动作片段在混合前必须考虑动作事件的对应关系。例如走路和跑步都有左右脚落地阶段;若把“左脚支撑”的姿态与“右脚支撑”的姿态直接混合,角色可能出现脚滑、双脚不合理漂浮或重心混乱。

因此,混合常需要对齐关键相位:

  • 起步、落脚、腾空等关键时刻应具有对应关系。
  • 循环动作的起点与终点应尽量连续。
  • 片段播放速率可随角色速度调整,但不能破坏重要事件的相对节奏。

这说明动画混合既是数值插值问题,也是动作语义问题。权重正确并不足以保证观感正确。

2.3 Cross Fade

交叉淡入淡出(Cross Fade)是最常见的过渡方式:在一段过渡时长内,源 Clip 权重从 1 降到 0,目标 Clip 权重从 0 升到 1。

权重曲线不一定是线性的。不同曲线会产生不同观感:

  • 线性曲线易理解,但加速度变化可能明显。
  • 缓入缓出曲线让切换开头和结尾更柔和。
  • 对打断性强的受击、闪避等动作,可能需要更短、更陡的过渡。

Cross Fade 能解决“从 A 到 B 的一段过渡”,但无法独立管理复杂的状态逻辑、并行身体区域和多维参数组合。

3. Blend Space:由参数连续选择动作

3.1 一维混合空间

一维混合空间(1D Blend Space)以单个连续参数控制多个 Clip 的权重。典型参数是角色速度:

Idle — Walk — Run — Sprint

当输入速度位于相邻样本之间时,系统在对应动画间插值。例如,速度接近 Walk 与 Run 的中间值时,最终 Pose 同时吸收两者的贡献。

1D Blend Space 的价值是将“速度是多少”直接映射为“动作应是什么样”,避免人工为每一个速度区间建立大量离散状态。

3.2 二维混合空间

二维混合空间(2D Blend Space)使用两个参数,例如移动速度与移动方向,或局部 (x/z) 方向速度。样本 Clip 被布置在参数平面上:

  • 前进、后退、向左、向右等方向动作对应不同位置。
  • 当前输入点落在样本之间时,系统选择邻近样本进行加权。
  • 三角剖分或类似的局部组合方式可保证参数平面中的连续过渡。

它特别适合方向性移动、瞄准移动和多方向步态。其难点是样本必须风格一致、相位合理,且参数空间中不能留下过大的空洞;否则输入从一个区域跨到另一个区域时,姿态可能产生意外变化。

3.3 混合权重与 Blend Mask

混合可以对整副骨架使用一个统一权重,也可以为不同关节或身体区域分配不同权重。后者常被概括为 Blend Mask:

  • 下半身主要采用移动动作。
  • 上半身可以叠加瞄准、开火或持枪姿态。
  • 头部和颈部可进一步朝向目标。

每个关节的混合比例由掩码控制,能够让角色“边跑边开火”而不是在两种全身动作之间互相覆盖。分层混合要求掩码边界设计得当,否则躯干、肩膀或骨盆附近容易出现不连续。

3.4 Additive Blending

叠加混合(Additive Blending)不是把两个完整动作按绝对姿态平均,而是把一个“相对参考姿态的差值”加到基础动作上:

$\operatorname{Pose}{\mathrm{final}} = \operatorname{Pose}{\mathrm{base}} \oplus w,\Delta\operatorname{Pose}_{\mathrm{additive}}$

其中 ⊕ 表示按平移、旋转等通道组合。叠加动作很适合表达幅度较小、可与基础动作共存的变化,例如呼吸、后坐力、轻微受击、瞄准偏移或情绪性姿态。

它的前提是差分 Clip 的参考姿态定义一致。若参考姿态不一致,叠加结果会带入不期望的整体偏移。

4. 动画状态机、动画树与控制参数

4.1 Animation State Machine

动画状态机(Animation State Machine, ASM)用状态和转换描述离散动作逻辑:

  • 状态通常对应 Idle、Walk、Run、Jump、Fall、Attack 等动作或子图。
  • 转换由条件触发,如速度阈值、是否落地、是否按下攻击键。
  • 转换可定义混合时长、触发条件与可否被中断。

状态机的强项是表达清晰的行为逻辑,特别适合跳跃、受击、死亡等具有明确进入/退出条件的动作。但当状态数量随武器、姿态、移动方式和上半身行为组合增长时,单一平面状态图容易膨胀。

4.2 分层状态机与动画树

分层状态机把复杂问题拆到不同身体区域或子状态机中。动画树(Animation Blend Tree)进一步将 Clip、混合节点、状态节点、掩码与后处理节点组合成有向图:

  • 叶节点提供原始 Clip 或参数化动作。
  • 中间节点做 LERP、Additive、Blend Space、缓存或掩码混合。
  • 输出节点给出当前 Local Pose。

动画树是比单一状态机更通用的表达:状态机负责“当前逻辑处于什么阶段”,混合树负责“这一阶段内的 Pose 怎样由多个输入计算出来”。二者通常会结合使用。

4.3 Control Parameters:Gameplay 与动画系统的接口

动画图不应自行猜测游戏世界,而应由 Gameplay 层提供稳定的控制参数,例如:

  • 速度、局部移动方向、是否在地面。
  • 瞄准方向、武器状态、受击强度。
  • 跳跃阶段、是否攀爬、是否被控制。
  • 目标位置、脚底高度或手部交互点。

这些参数驱动状态转换与混合节点。课件以 Unreal Animation Blueprint 为例展示了图形化控制方式:外部逻辑更新参数,动画图根据参数产出 Pose。这样可以避免把游戏规则直接硬编码进某个动画 Clip。

4.4 动画图的调试重点

当动作异常时,应区分问题发生的位置:

  1. 控制参数是否正确且稳定?
  2. 状态机是否进入了预期状态?
  3. Blend Space 是否选择了正确样本和权重?
  4. 过渡曲线、片段相位和掩码是否合理?
  5. IK 或后处理是否在基础 Pose 之后破坏了结果?

这种按数据流定位的方法,比直接查看最终网格更容易找到根因。

5. IK:由目标反推关节姿态

5.1 Forward Kinematics 与 Inverse Kinematics

前向运动学(FK)从关节局部变换出发,沿层级计算末端位置;反向运动学(Inverse Kinematics, IK)则给定末端目标,反过来求一组关节姿态,使末端尽量到达目标。

IK 的典型用途包括:

  • 让双脚贴合不同高度和坡度的地面。
  • 让手准确握住武器、门把手或攀爬点。
  • 让头部、眼睛或上半身朝向某个目标。
  • 根据实时地形和交互修正预制动画。

IK 通常不是替代整段动作,而是叠加在动画混合后的基础 Pose 上,解决那些无法在离线资产中穷举的实时空间约束。

5.2 Two-Bone IK 的几何直觉

对上臂—前臂—手或大腿—小腿—脚这类两段骨骼链,若已知两段长度 (a)、(b),根部到目标的距离为 (c),可以由余弦定理得到关节弯曲角:

$\cos\theta = \frac{a^2+b^2-c^2}{2ab}$

可达性首先受距离限制:

$|a-b| \le c \le a+b$

若目标太远,末端无法完全抵达,只能向目标方向伸直或采取近似;若目标过近,也可能需要折叠到极限。即使距离可达,肘部/膝盖仍可位于一整圈可能位置上,因此需要 Pole Vector、弯曲平面或动画给定的偏好方向来选择符合角色意图的解。

5.3 IK 不是唯一答案

对于多关节链,同一个末端目标往往存在多组姿态:肘部可以向不同方向弯曲,脊柱与肩膀也可共同分担手部位移。IK 系统需要额外目标来选解:

  • 关节角度范围与铰链方向。
  • 偏好的肘/膝朝向。
  • 尽量接近原始动画 Pose。
  • 平衡、碰撞、身体朝向等高层约束。

没有这些约束,数学上满足末端位置的解仍可能看起来像“骨骼折断”。

6. 多关节 IK 的常见求解方法

6.1 CCD:循环坐标下降

CCD(Cyclic Coordinate Descent)从末端附近关节开始,逐个旋转关节,使末端朝目标方向靠近;随后向根部推进,并重复迭代。

优点:

  • 思路直观,实现相对简单。
  • 可以自然加入每个关节的旋转限制。
  • 对短链、实时近似问题通常足够实用。

局限:

  • 通常需要多轮迭代,收敛速度依赖初始姿态。
  • 可能陷入局部不理想姿态或产生抖动。
  • 若不做约束和阻尼,动作容易显得机械。

课件还展示了优化 CCD 的思路:在满足末端接近目标的同时,利用关节约束和更合适的旋转分配改善最终形状。

6.2 FABRIK:前向与后向可达迭代

FABRIK(Forward And Backward Reaching Inverse Kinematics)主要在关节位置层面迭代:

  1. Backward Reaching:固定末端到目标位置,沿链向根部调整各关节位置,并保持骨段长度。
  2. Forward Reaching:固定根部位置,沿链向末端调整各关节位置,同样保持长度。
  3. 重复上述过程,直到末端误差足够小或达到迭代上限。

它避免直接在角度空间中做复杂更新,几何直觉清晰,并能较快得到位置可达的链形。之后仍需从关节位置恢复旋转,并结合关节限制与姿态偏好。

6.3 Jacobian 方法

雅可比矩阵方法将末端位置对各关节自由度的局部变化率组织为矩阵:

$\Delta x \approx J,\Delta\theta$

其中 (Δx) 是末端期望位移,(Δθ) 是各关节角度的小改变量,(J) 描述“每个关节稍微旋转会让末端朝哪些方向移动”。通过求解或近似求解这个线性系统,可以得到一次迭代的关节更新方向。

它的优势是能自然扩展到多末端、位置加朝向、多目标加权等问题;代价是矩阵构造、求逆或伪逆、数值稳定性和约束处理更复杂。接近奇异姿态时,通常需要阻尼或其他稳定化策略。

6.4 方法选择不是只看公式

方法 主要空间 优势 主要挑战
Two-Bone IK 几何闭式解 快、稳定、适合手臂和腿 只适合两段链,需指定弯曲方向
CCD 关节旋转 易实现、便于施加角度限制 需要迭代,可能抖动或局部收敛
FABRIK 关节位置 几何直观、保持骨段长度 需恢复旋转并处理复杂约束
Jacobian 微分/线性系统 可处理多目标与高自由度 实现和数值稳定性要求高

实际引擎常根据身体部位和预算混用方法:腿部用 Two-Bone IK,手臂或脊柱用受限迭代,复杂全身交互再交给更高层的姿态优化系统。

7. IK 的工程约束与局限

7.1 关节限制

人体与机械结构的关节并非可任意旋转。IK 每轮更新后都应检查:

  • 旋转轴与可动范围。
  • 铰链关节的单轴或有限自由度。
  • 关节软限制与接近极限时的平滑行为。

这些限制不仅防止视觉穿帮,也能缩小解空间、改善求解稳定性。

7.2 碰撞、自穿插与可见性

骨架通常被视为无体积的线段,IK 只保证末端或关节位置,却不天然保证网格不穿插。手臂可能穿过胸口,脚可能插入台阶,衣物和装备也可能与身体相撞。

把完整碰撞约束纳入 IK 会显著增加复杂度。因此,游戏常使用分层手段:限制目标范围、使用简化碰撞体、在关键姿态制作专门动画,或通过后续物理/布料系统缓解问题。

7.3 自然运动不能只由“到达目标”决定

如果 IK 每帧只追求最小末端误差,角色会出现突然拉伸、关节翻转或缺少预备动作的问题。观感还依赖:

  • 与上一帧姿态的连续性。
  • 对基础动画 Pose 的保留程度。
  • 身体重心、步态相位与根节点移动。
  • 目标的速度、预测和遮挡变化。

因此,IK 是动画管线中的一个受约束修正器,而不是一个脱离上下文的万能姿态生成器。

8. 在管线中组合混合与 IK

课件给出的更新管线体现了两者的顺序关系:

Clip + Time → Local Pose 采样 → Blend → Local/Model Pose → IK → Post-process → Skinning Matrix Palette → GPU Skinning

其中:

  • 混合主要产生满足 Gameplay 意图的基础局部姿态。
  • 前向运动学把它展开为可用于空间约束的模型空间骨架。
  • IK 根据目标位置修改相关关节。
  • 后处理可执行脚底修正、姿态限制、局部补偿等步骤。
  • 最终才生成蒙皮调色板并变形网格。

若过早对每个 Clip 单独做 IK,再进入混合,混合过程可能重新破坏末端约束;因此通常先得到基础混合 Pose,再在更靠后的阶段处理 IK。

9. 面部动画:高敏感度的局部表达

9.1 为什么脸部要求更高精度

人类对面部微小变化极为敏感。眉毛、眼睑、嘴角和下颌的很小偏差,都可能让角色显得僵硬、情绪错误或落入“恐怖谷”。

相比身体远处的轻微误差,面部动画往往需要:

  • 更高的网格和控制器精度。
  • 更密集或更精细的动画数据。
  • 对左右不对称、视线、眨眼和语音口型的专门处理。
  • 与镜头距离相关的质量策略。

这与上一讲的压缩原则一致:数据精度应分配给视觉最敏感的区域,而不是平均分配。

9.2 Facial Action Units

课件将面部动作拆分为一组核心 Action Units(动作单元):例如眉部、眼部、面颊、嘴唇与下颌的局部收缩、抬升或拉伸。复杂表情不必被视为一个不可拆分的“开心”或“愤怒” Clip,而可以组合多个局部单元的强度。

这种分解的好处是:

  • 表情可参数化,方便与对白、情绪或 Gameplay 状态联动。
  • 多个基础单元可组合出更丰富、细微的变化。
  • 左右脸可使用不同权重,避免过度机械的完全对称。

动作单元本身不是最终渲染技术,而是一种把表情语义映射到可控局部形变的组织方式。

9.3 Morph Target Animation

Morph Target(也称 Blend Shape)预先保存若干目标网格形状,例如张嘴、皱眉、抬眉或鼓腮。运行时按权重混合基础网格和这些目标形状:

$v_{\mathrm{final}} = v_{\mathrm{base}} + \sum_i w_i\left(v_{\mathrm{target},i}-v_{\mathrm{base}}\right)$

优点是形状结果可由美术精确控制,适合面部等局部细节丰富的区域。代价是每个目标都需要额外的顶点差分数据;目标数量过多时,内存、带宽与运行时计算都会增加。

Morph Target 可以与骨骼动画结合:骨架处理大尺度头部、下颌和眼球运动,Blend Shape 处理皮肤、嘴唇与表情细节。

9.4 肌肉模型动画

课件还介绍了以骨骼、肌肉与皮肤分层的肌肉模型思路。相比直接插值目标网格,它试图让肌肉收缩、皮肤响应与关节运动建立更强的物理或结构联系。

这种方法有潜力产生更自然的局部体积变化,但建模、参数调校和运行时成本更高。不同项目会在完全手工形状、骨骼辅助形变、肌肉近似和高成本模拟之间选择合适层级。

10. Animation Retargeting:让动作跨角色复用

10.1 为什么需要重定向

为每种角色体型重新制作所有动作成本很高。动画重定向(Retargeting)试图将源角色的动作映射到目标角色的骨架上,从而复用走、跑、跳、攻击等动作资产。

它通常需要:

  1. 建立源骨架与目标骨架的关节对应关系。
  2. 对齐或比较两者的绑定参考姿态。
  3. 将源关节的旋转、位移或相对运动转换到目标骨架。
  4. 根据骨段长度、骨盆高度或根节点移动调整整体尺度与位移。

10.2 保持朝向与骨盆高度

源、目标角色即使拓扑相似,绑定姿态也可能不同。如果不先处理关节朝向和参考姿态,动作会产生扭转或手脚方向错误。

此外,体型差异会导致同样的根节点位移在目标角色上看起来过大或过小。课件以骨盆高度和位移调整为例说明:重定向不仅是复制关节角度,还要让角色整体移动尺度与身体比例相协调。

10.3 自动重定向解决不了什么

即使骨架映射正确,以下问题仍常需额外处理:

  • 宽肩角色与窄肩角色可能发生自穿插。
  • 手的动作在不同手臂长度下无法准确握住同一物体。
  • 脚底接触点与地面步幅可能不匹配。
  • 衣物、盔甲、尾巴等附属结构在目标角色上没有等价控制关系。

这就是重定向常与 IK、姿态修正和专用动画配合的原因:重定向负责最大化资产复用,IK 与后处理负责恢复具体角色和具体环境中的接触可信度。

11. 关键概念对照

概念 主要职责 常见误解
Cross Fade 在两段动作间按时间平滑过渡 只调权重不能自动解决落脚相位问题
Blend Space 用连续参数在多段动作间插值 需要一致的样本布局和动作语义
Additive Blend 把相对姿态差值叠加到基础 Pose 参考姿态不一致会产生整体偏移
Animation State Machine 管理离散动作状态与转换条件 不等于完整的动画混合计算图
Animation Blend Tree 组合 Clip、混合、掩码和后处理节点 仍需由外部 Gameplay 参数驱动
FK 从关节变换推导末端位置 不处理“末端必须到哪里”的问题
IK 根据目标反推关节姿态 到达目标不等于姿态自然或无碰撞
Morph Target 按权重混合目标网格形状 不必替代骨骼动画,常与其组合
Retargeting 将动作映射到另一角色骨架 不能自动保证接触、比例和网格不穿插

12. 本讲的工程主线

高级动画系统可以用三层职责概括:

  1. 动作选择与组合层:状态机、Blend Space、交叉淡入淡出与叠加混合,根据 Gameplay 参数构造基础动作。
  2. 空间约束与修正层:IK、关节限制、接触修正和姿态后处理,让基础动作适应实时场景。
  3. 表现与复用层:表情控制、Morph Target、肌肉近似和重定向,使角色既有局部细节,也能高效共享动画资产。

它们并非互相替代。一个可靠的角色动画结果通常是:动画师提供的基础动作保持整体风格,混合系统保证状态连续,IK 满足实时交互,表情系统传达情绪,重定向与压缩使资产在项目规模下可复用、可运行。

小结

  • 动画混合让多个 Clip 共同贡献最终 Pose,是连续移动与动作切换的基础。
  • Blend Space 用一维或二维参数驱动动作组合;Blend Mask 和 Additive Blend 支持不同身体区域的并行表现。
  • 状态机管理逻辑状态,动画树管理更通用的 Pose 计算;二者通过 Gameplay 控制参数连接。
  • IK 根据末端目标修正关节姿态。Two-Bone IK 高效实用,多关节问题则需 CCD、FABRIK、雅可比等迭代或优化方法。
  • IK 必须同时处理可达性、关节限制、姿态连续性、碰撞与动作自然性。
  • 表情动画常结合动作单元、Morph Target 与骨骼/肌肉控制,并对精度有更高要求。
  • 重定向能复用动作资产,但仍需处理比例、接触和自穿插等角色特定问题。

参考资料