动画混合
Animation Blending
动画混合把两个或多个输入姿势合成一个输出姿势。基本工具是对每个关节的局部 SRT 分别做 lerp(旋转用 nlerp 或 slerp);在此之上有时间插值、交叉淡入淡出、方向移动、一维/二维混合空间、部分骨骼混合和叠加混合(差分片段)。前几种都是加权平均,叠加混合则是"加上一段变化"(GEA4 卷 II 13.6)。
线性插值混合
对两个骨骼姿势 ,逐关节插值(卷 II 13.6.1,式 13.5–13.11):
称为混合百分比或混合因子。矩阵不能直接插值(见 旋转表示的比较),这正是局部姿势用 SRT 存储的原因之一:
- 平移:向量 lerp;缩放:标量或向量 lerp。
- 旋转(GEA 的式 13.8–13.9 没写,但实现时必须做:若 先把 取反,否则会绕远路; 时 slerp 退化为 nlerp,见 四元数):(nlerp),或 ,见 四元数。
混合应在局部姿势(父关节空间)上做;直接混合模型空间的全局姿势,结果在生物力学上往往不合理。由于各关节的插值互相独立,lerp 混合可以完全并行(卷 II 13.6.1)。
同一时刻混合两个片段时,片段需要相位匹配,例如受伤走和正常走都要从同一只脚着地开始(卷 II 13.6)。
时间插值
游戏几乎从不在整数帧上采样(帧率可变、压缩后关键帧间隔不均),所以用 lerp 求两个样本之间的姿势(卷 II 13.6.2.1,式 13.12–13.14):
运动连续性与交叉淡入淡出
- 游戏动画里绝大多数"跳变 (pop)"发生在片段切换处。关节轨迹无跳跃为 连续,速度连续为 ,加速度连续为 。严格的 以上通常做不到,lerp 混合能给出 ,并较好地近似 ;但也会带来滑步 (sliding feet)(卷 II 13.6.2.2)。
- 交叉淡入淡出 (cross-fade):两个片段时间线重叠一段, 在 内从 0 升到 1,这段时长叫混合时间。
| 类型 | 做法 | 适用 |
|---|---|---|
| 平滑过渡 (smooth) | A、B 同时播放 | 两者都是循环动画且时间线已同步(手脚位置大致对应) |
| 冻结过渡 (frozen) | B 开始时冻结 A 的局部时钟 | 两段动作无关、无法同步 |
- 不必线性变化。用一维三次贝塞尔得到缓出/缓入 (ease-out / ease-in) 曲线,令切线等于端点混合因子(见 贝塞尔曲线),,:
展开后 ,即 ,就是常见的 smoothstep:两端斜率为 0,中点处 恰好过半。
- 核心姿势 (core pose):不混合也能连续。动画师约定站立、蹲下、趴下等核心姿势,每个片段都从某个核心姿势开始、回到核心姿势结束,就能保证 ;把一段平滑动画切成几段则能得到更高阶连续(卷 II 13.6.2.2)。
方向移动
- 目标式移动 (targeted):朝向固定,向任意方向移动(横移 strafe)。前进、左横移、右横移三个循环片段放在半圆的 0°、90°、−90°,取相邻两个按角度 lerp。不把后退纳入同一个整圆,是因为横移片段为了与前进混合,交叉腿的方式与后退冲突,直接混合会腿穿腿;可做前后两个半圆,跨半圆时播放显式过渡动画(卷 II 13.6.2.3)。
- 转身式移动 (pivotal):播放前进循环并绕竖轴旋转整个角色。整体倾斜会让内侧脚陷地、外侧脚离地,更自然的做法是做直行、极左转、极右转三个变体,按需 lerp 出倾斜角。
复杂 lerp 混合
| 方法 | 做法 |
|---|---|
| 一维 lerp | 任意多个片段放在参数 的数轴上,取相邻两个,(式 13.15);目标式移动就是以方向角为 的特例 |
| 简单二维 | 四个片段在正方形四角:先用 做上、下两次一维混合,再用 混合两个结果 |
| 三角形二维 | 三个片段构成三角形,用点 的重心坐标 作权重:;重心 得到均匀混合 |
| 通用二维 | 对任意分布的片段做 Delaunay 三角剖分,找到包含 的三角形再做三片段混合;EA 温哥华在 FIFA 的 "ANT" 框架中使用(三角剖分见 多边形三角化) |
(卷 II 13.6.3)lerp 本质上是加权平均,所以可以有任意多个输入,权重之和为 1。
部分骨骼混合
让混合百分比逐关节变化, 称为混合遮罩 (blend mask)。例:右臂关节 、其余为 0,把 Wave 叠到 Walk/Run/Stand 上就能边走边挥手(卷 II 13.6.4)。缺点:
- 遮罩突变处身体看起来"断开",可让遮罩渐变缓解(如右肩 0.9、上脊柱 0.5、颈和中脊柱 0.2)。
- 真人动作从不完全独立:跑步时挥手应更颠簸,而部分混合下右臂动作与身体其余部分无关。这个问题部分混合很难解决,于是很多团队转向叠加混合。
叠加混合与差分片段
差分片段 (difference clip),业界多称叠加动画 (additive):(源片段减参考片段)。 还原 ;更妙的是 可以加到无关的目标片段 上,例如"疲惫跑 − 正常跑"得到的"疲惫"加到走路上,角色就疲惫地走(卷 II 13.6.5)。
关节姿势是矩阵,"减"就是乘逆(式 13.18):
- 差分片段可以像普通片段一样做时间插值;只有 、 时长相同才有定义。
- 只加一部分效果:(式 13.19),同样要拆成 S、Q、T 三个插值。例:让头右转 80° 的差分片段加 50%,头右转 40°。
- 与部分混合相比,叠加是在原动画上增加运动(可能遍及全身),不是替换一部分关节,所以少了"断开感"。
- 局限:容易过度旋转,尤其同时叠加多个差分片段时(目标片段肘部已弯 90°,再叠加 90° 就会让前臂穿进上臂)。经验法则:参考片段的髋部旋转尽量小;肩肘在参考片段中保持中性;每个核心姿势(站、蹲、趴)各做一套差分动画。GEA 坦言掌握叠加混合主要靠试错和向有经验的人学习(卷 II 13.6.5.3)。
叠加混合的应用
| 应用 | 做法 |
|---|---|
| 姿态变化 (stance variation) | 每种姿态一个单帧差分片段,叠加后整体姿态大变,基础动作照常 |
| 移动噪声 (locomotion noise) | 在重复的移动/待机循环上叠加随机性或对干扰的反应 |
| 瞄准与注视 (aim / look-at) | 以直视前方的动作为基础,做极右、极左、极上、极下四个差分片段,按混合因子组合出任意方向(50% 左 = 最左角度的一半) |
| 复用时间轴 | 时间轴不必表示时间:三帧片段放左、中、右三个瞄准姿势,把局部时钟固定在第 3 帧就向右瞄,2.5 帧就是向前与向右各半 |
(卷 II 13.6.6)
与 UE5 的对应
UE5 的混合空间默认用三角剖分在样本间插值,对应上面的通用二维 lerp;瞄准偏移 (Aim Offset) 的样本是网格空间叠加动画,对应"瞄准与注视"(Blend Spaces)。详见 动画蓝图与动画系统。差别在于 GEA 讲的差分是在局部空间定义的 ,而 UE5 的 Aim Offset 文档强调的是网格空间叠加;两者的叠加空间不同。
GEA 原书中的问题
- 13.6.3.1 图 13.36 中标注的 与正文式 13.15 的 分母符号相反,按图中写法 会变成负数;以正文公式为准(按 PDF 文本读出)。
- 13.6.2.3 图 13.35 的图注说"混合四个主方向的循环片段",正文和图中却只有前进、左横移、右横移三个,并专门解释了为什么不纳入后退;图注与正文不一致。
- 13.6.3.3 正文说"顶点为 的三角形",紧接着的式 13.17 和后文都用 ;下标前后不一。
- 13.6.5.1 写"Equation (11.16) must be broken down into…",实际指的是刚给出的式 13.19,章号是旧版遗留的交叉引用错误。
出处
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 13 章 13.6 节
- Blend Spaces