中EN
概念页

动画约束与后处理

Animation Constraints & Post-Processing

片段混合之后、渲染之前,动画系统常常还要修改姿势,这叫动画后处理:程序化动画、逆向运动学 (IK)、布娃娃。另一大类需求是约束:把武器挂在手上(挂接点)、让多个角色对齐演出(参考定位器)、手抓物体(手部 IK)、脚不滑步(根运动提取与脚部 IK),以及注视、掩体、穿越辅助等(GEA4 卷 II 13.7、13.11)。

程序化动画

运行时生成而非来自 DCC 的动画;可以作为后处理修改手 K 片段的姿势,也可以直接作为输入代替片段(卷 II 13.7.1)。

  • 载具:片段让车身在地形上颠簸;按当前转向角构造一个绕竖轴的四元数,乘到前轮关节的 Q 通道上;再绕转向柱轴构造四元数乘到方向盘关节上。这些修改作用于局部姿势,在全局姿势和调色板生成之前完成。
  • 植被:把树和灌木做成带简单骨骼的蒙皮网格,对关节旋转施加正弦或 Perlin 噪声让它随风摆动;角色穿过时把根关节四元数沿径向往外偏,像被推开。

逆向运动学

  • 正向运动学 (FK):输入局部关节姿势,输出全局姿势和蒙皮矩阵,普通片段就是 FK。IK 反过来:输入一个关节(末端执行器 end effector)期望的全局姿势,求其他关节的局部姿势(卷 II 13.7.2)。
  • 数学上是误差最小化问题,可能有一个、多个或没有解(够不到房间另一头的门把手)。把关节角组成构形空间 (configuration space),对每个点画出末端到目标的距离,IK 就是在这张曲面上找极小值;起始姿势离目标越近,越容易收敛到"最近"的解且越快。GEA 不展开求解方法,推荐 Jason Weber 的 "Constrained Inverse Kinematics"(Game Programming Gems 3)。

布娃娃

角色死亡或昏迷时身体瘫软,需要与环境做物理上可信的交互。布娃娃 (rag doll) 是一组受物理模拟的刚体,每个代表身体的一个半刚性部分(前臂、大腿等),在关节处互相约束。物理系统算出刚体的位置和朝向,再驱动骨骼中的关键关节,这一数据传递通常作为后处理完成(卷 II 13.7.3)。详细内容在第 14 章(14.4.8.7、14.5.3.8);UE5 中的物理见 Chaos 物理与碰撞。

挂接

  • 把对象 A 骨骼中的关节 JAJ_A 约束到对象 B 的关节 JBJ_B 上,通常是父子关系:父动子随,子动父不动(卷 II 13.11.1)。
  • 常需要偏移:把枪的 "Grip" 关节直接对到 "RightWrist" 往往对不正。给角色加一个 "RightGun" 子关节可以解决,但每个关节都有混合、调色板计算和存储关键帧的成本,所以加关节往往不可行。
  • 解法是挂接点 (attach point):动画混合管线忽略、但可用于挂接的特殊关节,相当于父子之间多一个变换。可以像普通关节或定位器一样在 Maya 里建,也可以在 ASM 文本或定制 GUI 里定义,让设计师和工程师掌控挂接,动画师只关心影响外观的关节。UE5 的插槽 (socket) 就是挂接点(卷 II 13.10.3.2)。

对象间配准

动画师在 Maya 里摆好两个角色握手、开门、一同穿过的场景,导出后变成三个对象上的三个独立片段,而角色此前可能处于 AI 或玩家控制下,怎样保证游戏里对齐(卷 II 13.11.2)?

  • 参考定位器 (reference locator):在场景中放一个打了标签的定位器,位置朝向无所谓。导出时把它在每个演员局部空间中的变换存进各自的片段;播放时变换三个对象的原点,使三个参考定位器在世界空间重合,于是演员按 Maya 中的方式对齐。它的作用类似挂接点,也可以实现为挂接点。
  • 世界空间位置由谁定:要么问固定在世界里的演员(门)取它片段中定位器的世界变换,再让两个角色相对它播放;要么在世界编辑器里单独放一个参考定位器 actor,所有动画都相对它播放(卷 II 13.11.2.2)。
Transform refLoc = getReferenceLocatorWs(door, "shake-hands-door");
playAnimation("shake-hands-door", door);                     // 门已经在正确位置
playAnimationRelativeToReference("shake-hands-character-a", characterA, refLoc);
playAnimationRelativeToReference("shake-hands-character-b", characterB, refLoc);

抓取与手部 IK

即使用了挂接,lerp 混合也不保证两个片段中各自对齐的关节在混合后仍然对齐(双手持步枪,左手在某些瞄准角度离开枪托)。办法是对一条短链(通常 2–4 个关节,从目标关节往上到父、祖父)做 IK(卷 II 13.11.3)。

  • API 通常是按末端关节名开启 / 关闭链:enableIkChain(actor, endEffectorJointName, targetLocationWs)、disableIkChain(...)。开关不频繁,但移动目标需每帧更新:可重复调用 enable 更新目标点,或把目标绑定到某个刚体对象的句柄或动画对象中的某个关节。
  • 计算由低层管线在合适时机执行:中间局部和全局姿势算完之后、最终调色板之前。
  • IK 适合误差已经较小时的微调,误差大时效果差;多数算法只解位置,朝向对齐要额外代码;还可能很贵,应谨慎使用。

根运动提取与脚部 IK

  • 运动提取 (motion extraction):动画师做的走路循环里,角色在 Maya 中离开原点向前走了一步,局部原点留在原地。直接循环会走一步弹回原处;把根关节的前向平移清零又会变成"太空步"。正确做法是先把根关节的运动存进专门的"提取运动"通道,再清零;游戏中每帧按该通道移动角色的局部原点。不能只用平均速度,因为走路时前进速度并不恒定(瘸腿时尤其明显)。动画 1 秒前进 4 英尺,要 2 英尺/秒就以 R=0.5R=0.5 播放(卷 II 13.11.4.1)。
  • 脚部 IK:运动提取只在角色沿动画师制作的路径移动时有效;转向和不平地面会再次滑步。做法是分析动画找出每只脚完全着地的时段,着地瞬间记下世界位置,之后在着地期间用 IK 把脚钉在该处。听着简单,调好很难;加大步幅带出转身这类动作光靠 IK 做不出来(卷 II 13.11.4.2)。
  • GEA 强调玩家角色"手感"比动画完美更重要:不要轻视脚部 IK 和运动提取,要预留大量试错时间并准备取舍。角色移动与根运动的引擎侧见 角色移动组件与 Mover。

其他约束

  • 注视 (look-at):只用眼、眼加头、或再加上半身扭转。可用 IK 或程序化关节偏移实现,但用叠加混合通常更自然(见 动画混合)。
  • 掩体配准:常用参考定位器实现;进出掩体用混合加定制的进入、离开动画。
  • 穿越辅助:翻越、钻过、绕过障碍,常用定制动画加参考定位器与障碍物配准(卷 II 13.11.5)。

与 UE5 的对照

UE5 在动画蓝图中用 Control Rig 节点做程序化玩法控制,官方举例就是贴地 (Ground Alignment) 和任意接触点(Control Rig & Control Rig in Animation Blueprints);全身 IK (FBIK) 节点基于位置型 IK,定位为程序化修正工具(贴地、伸手够物),并提供刚度、偏好角度、限制和迭代次数等调节(Control Rig Full-Body IK)。这对应 GEA 说的"在调色板生成前做 IK 后处理";GEA 提醒的"误差大时效果差、只解位置、可能很贵"与 UE5 文档里"迭代越多越收敛但越贵"的提醒一致。详见 动画蓝图与动画系统 与 IK Rig 与动画重定向。

GEA 第 14 章的补充:物理端的布娃娃与动力约束(卷 II 14.4.8.7–14.4.8.8、14.5.3.8)

  • 布娃娃由胶囊刚体加模仿人体关节的专用约束组成,物理模拟结果再写回骨骼关节,本质上是"由物理驱动的程序化动画"。骨骼关节一般比刚体多,需要一个映射系统,并为中间关节求出姿势(卷 II 14.4.8.7)。
  • 动力约束:把关节建模为旋转弹簧 N=−k(θ−θrest)N=-k(\theta-\theta_{rest}),让 θrest\theta_{rest} 跟随动画姿势。刚体平时完全跟随动画,受阻时逼真地偏离(卷 II 14.4.8.8)。
  • 集成难点:活着和布娃娃状态常用两套碰撞表示(前者允许重叠,后者绝不能穿透);动画姿势与物理姿势之间直接 lerp 效果不好,过渡期宜用动力约束;单面碰撞可以把嵌进墙里的肢体推出来;起身时要找第 0 帧姿势最接近布娃娃静止姿势的动画(卷 II 14.5.3.8)。
  • 详见 碰撞响应与约束求解 与 物理引擎与游戏的集成。
  1. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 13 章 13.7、13.11 节
  3. Control Rig & Control Rig in Animation Blueprints
  4. Control Rig Full-Body IK
  5. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.4.8.7–14.4.8.8、14.5.3.8 节

相关页面

游戏开发动画管线与动作状态机Animation Pipeline & Action State Machines低层动画管线把片段和混合规格变成局部姿势、全局姿势和蒙皮矩阵调色板;其上的动作状态机 (ASM) 给游戏代码提供"按状态驱动动画"的接口。每个状态是任意复杂的片段混合,跟踪当前所有片段的方式有扁平加权平均和混合树两种;过渡用数据驱动的过渡矩阵描述,控制参数通过节点搜索、命名变量或控制结构体暴露给代码(GEA4 卷 II 13.9–13.10)。游戏开发动画混合Animation Blending动画混合把两个或多个输入姿势合成一个输出姿势。基本工具是对每个关节的局部 SRT 分别做 lerp(旋转用 nlerp 或 slerp);在此之上有时间插值、交叉淡入淡出、方向移动、一维/二维混合空间、部分骨骼混合和叠加混合(差分片段)。前几种都是加权平均,叠加混合则是"加上一段变化"(GEA4 卷 II 13.6)。游戏开发骨骼、姿势与动画片段Skeletons, Poses & Animation Clips角色动画系统的数据核心是三样东西:骨骼(关节层级)、姿势(每个关节的 SRT 变换)和动画片段(姿势随局部时间变化的采样)。GEA 把各种动画方法看成对"逐点控制表面"这一理想的不同压缩方式;骨骼蒙皮用少量关节驱动大量顶点,是今天最主流的方案(GEA4 卷 II 13.1–13.4)。游戏开发 · UE5IK Rig 与动画重定向IK Rig & RetargetingIK Rig 资产为某个骨骼网格定义 IK 目标 (Goal)、求解器栈 (Solver Stack) 和骨骼设置;IK Retargeter 用两个 IK Rig 中定义的重定向链 (retarget chains),在骨骼数量、骨骼名称和朝向都不同的骨架之间传递动画,还可以用 IK 保持手脚接触点的精确。参考姿势不同(例如 T 形与 A 形)时,需要编辑重定向姿势。游戏开发 · UE5动画蓝图与动画系统Animation Blueprint & Animation SystemUE5 角色动画以动画蓝图 (Animation Blueprint) 为核心:它每帧为骨骼网格体 (Skeletal Mesh) 计算最终姿势。动画蓝图内部用状态机 (State Machine) 组织“何时播什么”,用混合空间 (Blend Space) 按速度、方向等参数连续混合,用蒙太奇 (Animation Montage) 在插槽 (Slot) 中插播攻击、交互等一次性动作,用 Control Rig 做程序化骨骼控制(如贴地)。算出的骨骼姿势最终交给蒙皮 (Skinning) 驱动顶点。游戏开发 · UE5Chaos 物理与碰撞Chaos Physics & CollisionChaos 是 UE5 的物理与破碎系统。日常最常打交道的是碰撞模型:每个物理体有对象类型 (Object Type) 和对其他类型的 Block/Overlap/Ignore 响应,结果由双方共同决定;Hit 与 Overlap 事件都要显式开启。骨骼网格通过物理资产 (Physics Asset) 获得刚体与约束(布娃娃、物理动画);Chaos 破碎基于几何集合 (Geometry Collection) 的分级断裂、簇阈值、连接图与缓存回放,并能把事件交给 Niagara。物理体用盒/球/胶囊/凸包代理,原理对应游戏数学中的包围体与相交测试。游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。游戏开发 · UE5角色移动组件与 MoverCharacter Movement Component & Mover角色移动组件 (CMC) 用「客户端预测 + 服务器校验 + 纠正后重放」实现联网移动:自主代理先在本地移动并把操作存起来,用 ServerMove RPC 发给服务器重演,位置不符时服务器用 ClientAdjustPosition 纠正,客户端再按保存的操作重放;模拟代理只应用复制下来的移动并做平滑。实验性插件 Mover 计划接替 CMC,改用共享时间线、回滚与重模拟的模型,并且更模块化。游戏开发碰撞响应与约束求解Collision Response & Constraint Solving刚体碰撞后,模拟必须让它们做出逼真的反应,并保证一步结束时不再互相穿透,这就是碰撞响应。主流方法有三种:基于牛顿恢复定律的冲量法、像硬阻尼弹簧一样的惩罚力、以及把碰撞当作约束交给通用约束求解器。此外还要处理摩擦、多边形汤上的伪接触(焊接),以及让物体安静下来(休眠与模拟岛)。约束(点对点、铰链、棱柱、布娃娃、动力约束等)限制刚体的自由度;每帧的物理步骤是"积分 → 碰撞检测 → 碰撞解决 → 约束求解"的迭代误差最小化(GEA4 卷 II 14.4.7–14.4.10)。游戏开发物理引擎与游戏的集成Integrating a Physics Engine into a Game碰撞/物理世界里的刚体只是抽象的数学描述,要通过游戏对象这个中枢,间接连到屏幕上的视觉表现。刚体按谁驱动分三类:物理驱动、游戏驱动(Havok 称 key framed)、固定;Havok 用可在运行时切换的"运动类型"统一表示。每帧更新有固定顺序:先更新游戏驱动刚体、幻影、力、冲量和约束,再步进模拟,然后回读物理驱动对象、查询幻影、执行投射查询。物理宜用恒定的 1/30 或 1/60 秒时间步。GEA 还逐一讨论了子弹、手雷、爆炸、可破坏物、角色移动、相机碰撞和布娃娃的实际做法(GEA4 卷 II 14.5–14.6)。游戏美术游戏动画技术基础Game Animation Technical Foundations《GAME ANIM》第 5 章按基础→中级→高级梳理游戏动画师必须掌握的引擎侧概念:三类动画形态(循环 / 线性 / 过渡)、骨骼导出与数值运算、样条与碰撞移动、FK/IK,以及状态机、参数化混合、局部动画、叠加层、布娃娃,再到全身 IK、Look-At、混合形状与程序化系统。本页只收录书中实际讲到的内容,并与引擎架构页互链。游戏美术技术动画Technical Animation第 8 章「Our Project: Technical Animation」覆盖角色从建模约束、蒙皮、绑定,到命名/目录、引用、导出格式与引擎规则、内存与切片、引擎内事件标签与混合时间、测试关与资产卫生。目标是让动画师少踩导出坑、系统可共享缩放。

输入关键词开始搜索

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