中EN
概念页

动画混合

Animation Blending

动画混合把两个或多个输入姿势合成一个输出姿势。基本工具是对每个关节的局部 SRT 分别做 lerp(旋转用 nlerp 或 slerp);在此之上有时间插值、交叉淡入淡出、方向移动、一维/二维混合空间、部分骨骼混合和叠加混合(差分片段)。前几种都是加权平均,叠加混合则是"加上一段变化"(GEA4 卷 II 13.6)。

线性插值混合

对两个骨骼姿势 PA,PBP^A,P^B,逐关节插值(卷 II 13.6.1,式 13.5–13.11):

(Plerp)j=(1−β)(PA)j+β(PB)j(P_{lerp})_j=(1-\beta)(P_A)_j+\beta(P_B)_j

β\beta 称为混合百分比或混合因子。矩阵不能直接插值(见 旋转表示的比较),这正是局部姿势用 SRT 存储的原因之一:

  • 平移:向量 lerp;缩放:标量或向量 lerp。
  • 旋转(GEA 的式 13.8–13.9 没写,但实现时必须做:若 QA⋅QB<0Q_A\cdot Q_B<0 先把 QBQ_B 取反,否则会绕远路;θ→0\theta\to0 时 slerp 退化为 nlerp,见 四元数):normalize((1−β)QA+βQB)\mathrm{normalize}((1-\beta)Q_A+\beta Q_B)(nlerp),或 slerp(QA,QB,β)=sin⁡((1−β)θ)sin⁡θQA+sin⁡(βθ)sin⁡θQB\mathrm{slerp}(Q_A,Q_B,\beta)=\frac{\sin((1-\beta)\theta)}{\sin\theta}Q_A+\frac{\sin(\beta\theta)}{\sin\theta}Q_B,见 四元数。

混合应在局部姿势(父关节空间)上做;直接混合模型空间的全局姿势,结果在生物力学上往往不合理。由于各关节的插值互相独立,lerp 混合可以完全并行(卷 II 13.6.1)。

同一时刻混合两个片段时,片段需要相位匹配,例如受伤走和正常走都要从同一只脚着地开始(卷 II 13.6)。

时间插值

游戏几乎从不在整数帧上采样(帧率可变、压缩后关键帧间隔不均),所以用 lerp 求两个样本之间的姿势(卷 II 13.6.2.1,式 13.12–13.14):

Pj(t)=(1−β(t))Pj(t1)+β(t)Pj(t2),β(t)=t−t1t2−t1P_j(t)=(1-\beta(t))P_j(t_1)+\beta(t)P_j(t_2),\qquad \beta(t)=\frac{t-t_1}{t_2-t_1}

运动连续性与交叉淡入淡出

  • 游戏动画里绝大多数"跳变 (pop)"发生在片段切换处。关节轨迹无跳跃为 C0C^0 连续,速度连续为 C1C^1,加速度连续为 C2C^2。严格的 C1C^1 以上通常做不到,lerp 混合能给出 C0C^0,并较好地近似 C1C^1;但也会带来滑步 (sliding feet)(卷 II 13.6.2.2)。
  • 交叉淡入淡出 (cross-fade):两个片段时间线重叠一段,β\beta 在 [tstart,tend][t_{start},t_{end}] 内从 0 升到 1,这段时长叫混合时间。
类型做法适用
平滑过渡 (smooth)A、B 同时播放两者都是循环动画且时间线已同步(手脚位置大致对应)
冻结过渡 (frozen)B 开始时冻结 A 的局部时钟两段动作无关、无法同步
  • β\beta 不必线性变化。用一维三次贝塞尔得到缓出/缓入 (ease-out / ease-in) 曲线,令切线等于端点混合因子(见 贝塞尔曲线),u=t−tstarttend−tstartu=\frac{t-t_{start}}{t_{end}-t_{start}},v=1−uv=1-u:

β(t)=(v3+3v2u)βstart+(3vu2+u3)βend\beta(t)=(v^3+3v^2u)\beta_{start}+(3vu^2+u^3)\beta_{end}

展开后 v3+3v2u=1−3u2+2u3v^3+3v^2u=1-3u^2+2u^3,即 β=βstart+(βend−βstart)(3u2−2u3)\beta=\beta_{start}+(\beta_{end}-\beta_{start})(3u^2-2u^3),就是常见的 smoothstep:两端斜率为 0,中点处 β\beta 恰好过半。

  • 核心姿势 (core pose):不混合也能连续。动画师约定站立、蹲下、趴下等核心姿势,每个片段都从某个核心姿势开始、回到核心姿势结束,就能保证 C0C^0;把一段平滑动画切成几段则能得到更高阶连续(卷 II 13.6.2.2)。

方向移动

  • 目标式移动 (targeted):朝向固定,向任意方向移动(横移 strafe)。前进、左横移、右横移三个循环片段放在半圆的 0°、90°、−90°,取相邻两个按角度 lerp。不把后退纳入同一个整圆,是因为横移片段为了与前进混合,交叉腿的方式与后退冲突,直接混合会腿穿腿;可做前后两个半圆,跨半圆时播放显式过渡动画(卷 II 13.6.2.3)。
  • 转身式移动 (pivotal):播放前进循环并绕竖轴旋转整个角色。整体倾斜会让内侧脚陷地、外侧脚离地,更自然的做法是做直行、极左转、极右转三个变体,按需 lerp 出倾斜角。

复杂 lerp 混合

方法做法
一维 lerp任意多个片段放在参数 bb 的数轴上,取相邻两个,β=b−b1b2−b1\beta=\frac{b-b_1}{b_2-b_1}(式 13.15);目标式移动就是以方向角为 bb 的特例
简单二维四个片段在正方形四角:先用 bxb_x 做上、下两次一维混合,再用 byb_y 混合两个结果
三角形二维三个片段构成三角形,用点 bb 的重心坐标 (α,β,γ)(\alpha,\beta,\gamma) 作权重:Pj=αP0+βP1+γP2P_j=\alpha P_0+\beta P_1+\gamma P_2;重心 (13,13,13)(\frac13,\frac13,\frac13) 得到均匀混合
通用二维对任意分布的片段做 Delaunay 三角剖分,找到包含 bb 的三角形再做三片段混合;EA 温哥华在 FIFA 的 "ANT" 框架中使用(三角剖分见 多边形三角化)

(卷 II 13.6.3)lerp 本质上是加权平均,所以可以有任意多个输入,权重之和为 1。

部分骨骼混合

让混合百分比逐关节变化,{βj}\{\beta_j\} 称为混合遮罩 (blend mask)。例:右臂关节 βj=1\beta_j=1、其余为 0,把 Wave 叠到 Walk/Run/Stand 上就能边走边挥手(卷 II 13.6.4)。缺点:

  • 遮罩突变处身体看起来"断开",可让遮罩渐变缓解(如右肩 0.9、上脊柱 0.5、颈和中脊柱 0.2)。
  • 真人动作从不完全独立:跑步时挥手应更颠簸,而部分混合下右臂动作与身体其余部分无关。这个问题部分混合很难解决,于是很多团队转向叠加混合。

叠加混合与差分片段

差分片段 (difference clip),业界多称叠加动画 (additive):D=S−RD=S-R(源片段减参考片段)。D+RD+R 还原 SS;更妙的是 DD 可以加到无关的目标片段 TT 上,例如"疲惫跑 − 正常跑"得到的"疲惫"加到走路上,角色就疲惫地走(卷 II 13.6.5)。

关节姿势是矩阵,"减"就是乘逆(式 13.18):

Dj=SjRj−1,Aj=DjTj=SjRj−1Tj,DjRj=SjD_j=S_jR_j^{-1},\qquad A_j=D_jT_j=S_jR_j^{-1}T_j,\qquad D_jR_j=S_j

  • 差分片段可以像普通片段一样做时间插值;只有 SS、RR 时长相同才有定义。
  • 只加一部分效果:Aj=lerp(Tj,DjTj,β)A_j=\mathrm{lerp}(T_j,D_jT_j,\beta)(式 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 讲的差分是在局部空间定义的 SjRj−1S_jR_j^{-1},而 UE5 的 Aim Offset 文档强调的是网格空间叠加;两者的叠加空间不同。

GEA 原书中的问题

  • 13.6.3.1 图 13.36 中标注的 β=b−b1b1−b2\beta=\frac{b-b_1}{b_1-b_2} 与正文式 13.15 的 b−b1b2−b1\frac{b-b_1}{b_2-b_1} 分母符号相反,按图中写法 β\beta 会变成负数;以正文公式为准(按 PDF 文本读出)。
  • 13.6.2.3 图 13.35 的图注说"混合四个主方向的循环片段",正文和图中却只有前进、左横移、右横移三个,并专门解释了为什么不纳入后退;图注与正文不一致。
  • 13.6.3.3 正文说"顶点为 b1,b2,b3b_1,b_2,b_3 的三角形",紧接着的式 13.17 和后文都用 b0,b1,b2b_0,b_1,b_2;下标前后不一。
  • 13.6.5.1 写"Equation (11.16) must be broken down into…",实际指的是刚给出的式 13.19,章号是旧版遗留的交叉引用错误。
  1. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 13 章 13.6 节
  3. Blend Spaces

相关页面

游戏开发骨骼、姿势与动画片段Skeletons, Poses & Animation Clips角色动画系统的数据核心是三样东西:骨骼(关节层级)、姿势(每个关节的 SRT 变换)和动画片段(姿势随局部时间变化的采样)。GEA 把各种动画方法看成对"逐点控制表面"这一理想的不同压缩方式;骨骼蒙皮用少量关节驱动大量顶点,是今天最主流的方案(GEA4 卷 II 13.1–13.4)。游戏开发动画管线与动作状态机Animation Pipeline & Action State Machines低层动画管线把片段和混合规格变成局部姿势、全局姿势和蒙皮矩阵调色板;其上的动作状态机 (ASM) 给游戏代码提供"按状态驱动动画"的接口。每个状态是任意复杂的片段混合,跟踪当前所有片段的方式有扁平加权平均和混合树两种;过渡用数据驱动的过渡矩阵描述,控制参数通过节点搜索、命名变量或控制结构体暴露给代码(GEA4 卷 II 13.9–13.10)。游戏开发动画约束与后处理Animation Constraints & Post-Processing片段混合之后、渲染之前,动画系统常常还要修改姿势,这叫动画后处理:程序化动画、逆向运动学 (IK)、布娃娃。另一大类需求是约束:把武器挂在手上(挂接点)、让多个角色对齐演出(参考定位器)、手抓物体(手部 IK)、脚不滑步(根运动提取与脚部 IK),以及注视、掩体、穿越辅助等(GEA4 卷 II 13.7、13.11)。游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。游戏数学旋转表示的比较Comparison of Rotational Representations旋转可以用欧拉角、3×3 矩阵、轴角、四元数表示,再加上平移与缩放就有 4×4(或 4×3)矩阵与 SRT(SQT)变换;更进一步还有对偶四元数。没有一种在所有场合都最好。GEA 按大小、直观性、能否直接作用于向量、能否插值、有无万向节锁比较它们,并用「参数个数 − 约束个数 = 3 个自由度」统一解释为什么它们用的浮点数不同。游戏数学贝塞尔曲线Bézier Curves参数曲线 \mathbf{p}(t) 用参数 t 生成连续的点,实时图形中常用于让相机或物体沿预定路径移动(与帧率无关),也用于渲染头发和字体。贝塞尔曲线由反复线性插值(de Casteljau 算法)得到,等价于 Bernstein 多项式加权控制点;多段拼接时要关注 C^n / G^n 连续性。图形学多边形三角化Polygon Triangulation模型数据很少恰好是渲染需要的格式。图形 API 和硬件都针对三角形优化,所以复杂多边形要先剖分 (tessellation),最常见的是三角化 (triangulation)。本页讲三维数据的来源、三角化算法(耳切法、凸剖分、模板缓冲法)、四边形对角线选择与纹理扭曲,以及边缘裂缝和 T 型顶点。游戏开发 · UE5动画蓝图与动画系统Animation Blueprint & Animation SystemUE5 角色动画以动画蓝图 (Animation Blueprint) 为核心:它每帧为骨骼网格体 (Skeletal Mesh) 计算最终姿势。动画蓝图内部用状态机 (State Machine) 组织“何时播什么”,用混合空间 (Blend Space) 按速度、方向等参数连续混合,用蒙太奇 (Animation Montage) 在插槽 (Slot) 中插播攻击、交互等一次性动作,用 Control Rig 做程序化骨骼控制(如贴地)。算出的骨骼姿势最终交给蒙皮 (Skinning) 驱动顶点。游戏美术变形动画Morphing变形在两个模型之间插值,需要解决顶点对应和插值两个问题。顶点一一对应时可以逐顶点线性插值;更直观可控的形式是变形目标/混合形状:在中性模型上叠加加权的差分向量,常用于面部动画。过场中无法用这些方法表达的动画,可以用压缩后的几何缓存逐帧回放。游戏开发游戏音频功能与角色对话Game-Specific Audio Features & Character Dialog在 3D 音频渲染管线之上,游戏还要实现分屏、物理驱动音频、动态音乐、角色对话、声音合成和人群声音等专门功能。GEA 重点讲了分屏的多听者问题、顽皮狗《最后生还者》的角色对话系统(逻辑台词、随机不重复、优先级与打断、把对话作为一等实体、排他性、基于规则和事实字典的分支对话、按区域标签的情境台词、对话手势)以及音乐系统(播放列表、紧张度、插入乐、过渡)(GEA4 卷 II 15.6)。游戏美术游戏动画五大基本功Five Fundamentals of Game AnimationDisney 的「动画十二原则」面向线性媒介;游戏动画还必须在玩家每秒级输入下既好看又好控。Jonathan Cooper 在《GAME ANIM》第 2 版中提出与之互补的五大基本功:手感 (Feel)、流畅性 (Fluidity)、可读性 (Readability)、上下文 (Context)、优雅 (Elegance)——目标是角色不仅「看起来对」,还要「操控起来对」。游戏美术游戏动画技术基础Game Animation Technical Foundations《GAME ANIM》第 5 章按基础→中级→高级梳理游戏动画师必须掌握的引擎侧概念:三类动画形态(循环 / 线性 / 过渡)、骨骼导出与数值运算、样条与碰撞移动、FK/IK,以及状态机、参数化混合、局部动画、叠加层、布娃娃,再到全身 IK、Look-At、混合形状与程序化系统。本页只收录书中实际讲到的内容,并与引擎架构页互链。游戏美术玩法动画Gameplay Animation第 9 章从 Three Cs(角色 Character、相机 Camera、控制 Control)出发,系统讲地面移动(idle、循环、原地 vs 向前、 strafing、起停过渡)、跳跃与攀爬度量、以及攻击/受击的预备—响应—可读性与连招切割。这是五大基本功在「每帧可玩」场景下的落地清单。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原