动画约束与后处理
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 骨骼中的关节 约束到对象 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 英尺/秒就以 播放(卷 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)。
- 动力约束:把关节建模为旋转弹簧 ,让 跟随动画姿势。刚体平时完全跟随动画,受阻时逼真地偏离(卷 II 14.4.8.8)。
- 集成难点:活着和布娃娃状态常用两套碰撞表示(前者允许重叠,后者绝不能穿透);动画姿势与物理姿势之间直接 lerp 效果不好,过渡期宜用动力约束;单面碰撞可以把嵌进墙里的肢体推出来;起身时要找第 0 帧姿势最接近布娃娃静止姿势的动画(卷 II 14.5.3.8)。
- 详见 碰撞响应与约束求解 与 物理引擎与游戏的集成。
出处
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 13 章 13.7、13.11 节
- Control Rig & Control Rig in Animation Blueprints
- Control Rig Full-Body IK
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.4.8.7–14.4.8.8、14.5.3.8 节