中EN
概念页

顶点混合与蒙皮

Vertex Blending & Skinning

更新于 2026-10-15 约 6 分钟动画蒙皮骨骼技术美术

顶点混合(也叫线性混合蒙皮、enveloping、骨骼子空间变形)让一个顶点受多根骨骼的变换影响,按权重混合结果,使关节处的"皮肤"连续弯曲。它非常适合在 GPU 上执行;主要缺点是关节折叠、扭转和自相交,可用双四元数蒙皮等方法改善。

为什么需要

把上臂、前臂当成两个刚体分别变换,肘部是两块重叠的几何,看起来不像真实关节。用一个网格并让关节附近的顶点同时受两根骨骼影响,就能弯曲。书中例子:权重 (2/3, 1/3) 表示顶点 2/3 跟随上臂、1/3 跟随前臂。

公式

u(t)=∑i=0n−1wiBi(t)Mi−1p,∑i=0n−1wi=1,  wi≥0\mathbf{u}(t)=\sum_{i=0}^{n-1}w_i\mathbf{B}_i(t)\mathbf{M}_i^{-1}\mathbf{p},\quad \sum_{i=0}^{n-1}w_i=1,\; w_i\ge0

  • p\mathbf{p} 是世界坐标下的原始顶点;Mi\mathbf{M}_i 把骨骼 ii 的初始坐标系变到世界,骨骼的控制关节通常在其坐标系原点;Bi(t)\mathbf{B}_i(t) 是随时间变化的骨骼世界变换,通常是父骨骼层级与本地动画矩阵的连乘。
  • 实践中每帧为每根骨骼预先合并 Bi(t)Mi−1\mathbf{B}_i(t)\mathbf{M}_i^{-1}。
  • 权重非负且和为 1,所以结果位于各骨骼变换结果的凸包内。权重超出 [0,1][0,1] 或和不为 1 只有在同时使用其他混合方法(如变形目标)时才有意义。
  • 法线通常也可用同一公式变换;若骨骼被明显拉伸或压扁,需要用 Bi(t)Mi−1\mathbf{B}_i(t)\mathbf{M}_i^{-1} 的逆转置。
  • 骨骼不必是刚性的:可以加额外关节表现肌肉鼓起,或使用可挤压拉伸的骨骼。
flowchart LR
  A["顶点 p"] --> B["逐骨骼: B_i 乘 M_i 逆"]
  B --> C["得到 n 个候选位置"]
  C --> D["按权重 w_i 加权求和"]
  D --> E["蒙皮后顶点 u"]

上图:顶点先分别经每根影响骨骼的合并矩阵变换,再按权重插值,这正是"顶点混合"名称的来源。

GPU 实现

  • 网格放在静态缓冲区中只上传一次,每帧只更新骨骼矩阵,由顶点着色器计算,CPU 处理和传输的数据最少。
  • 最好整个模型的骨骼矩阵能一起使用,否则要拆分模型并复制部分骨骼;也可以把骨骼变换存进纹理以避开寄存器限制,用四元数表示旋转时每个变换只需两张纹理。
  • 有 UAV 时可以复用蒙皮结果。

缺陷与改进

方法特点
线性混合蒙皮可能出现折叠、扭转、自相交,如肘内侧折叠、"糖纸扭曲"
双四元数蒙皮保持原变换的刚性,避免糖纸扭曲;计算量不到线性混合的 1.5 倍,被迅速采用;但可能出现鼓起
旋转中心蒙皮 (center-of-rotation)为每个顶点预计算旋转中心并施加刚体约束,避免肘部塌陷和糖纸扭曲;运行时类似线性混合加一步四元数混合

书中指出,更多骨骼和更仔细选择的权重能得到更好的结果。

在游戏开发中的意义

  • 美术侧:权重分配直接决定关节变形质量。
  • 程序侧:骨骼矩阵的存储方式(常量、纹理)决定单个模型可用的骨骼数量。
  • 面部等细节常与变形动画结合使用。

GEA 的视角:蒙皮与矩阵调色板(卷 II 13.5)

  • 逐顶点信息:每个顶点存所绑关节的索引和权重,权重和为 1。常见上限是 4 个关节:四个 16 位索引正好塞进 64 位,而且超过 4 个后多数人看不出质量差别。最后一个权重可省略,运行时用 w3=1−(w0+w1+w2)w_3=1-(w_0+w_1+w_2) 求出(卷 II 13.5.1):
struct SkinnedVertex {
    float m_position[3]; float m_normal[3]; float m_u, m_v;
    U16   m_jointIndex[4];
    float m_jointWeight[3];   // 第 4 个权重省略
};
  • 蒙皮矩阵不是基变换:蒙皮前后的顶点都在模型空间,蒙皮矩阵只是把顶点从绑定姿势"变形"到当前姿势。关键观察是:绑定到关节的顶点在关节空间中的坐标不变。于是先用逆绑定姿势把顶点变到关节空间,再用当前姿势变回模型空间(GEA 用行向量约定,式 13.3–13.4):

vMC=vMB (Bj→M)−1Cj→M=vMBKjv_M^C=v_M^B\,(B_{j\to M})^{-1}C_{j\to M}=v_M^B K_j

这与本页「公式」中的 Bi(t)Mi−1p\mathbf{B}_i(t)\mathbf{M}_i^{-1}\mathbf{p} 是同一件事:RTR4 用列向量、矩阵在左,GEA 用行向量、矩阵在右,乘法顺序相反(约定对照见 齐次坐标与矩阵约定)。

  • 矩阵调色板:对每个关节算 KjK_j,组成的数组叫矩阵调色板 (matrix palette),交给渲染器。逆绑定矩阵在整个游戏中不变,随骨骼缓存;每帧只需算局部姿势 → 全局姿势(见 骨骼、姿势与动画片段)→ 乘逆绑定矩阵(卷 II 13.5.2.2)。在整个动画管线中的位置见 动画管线与动作状态机。
  • 并入模型到世界变换:KjW=(Bj→M)−1Cj→MMM→WK_jW=(B_{j\to M})^{-1}C_{j\to M}M_{M\to W},每个顶点省一次矩阵乘法。但动画实例化(一套动画同时驱动一大群角色)时不能这样做,要保持模型到世界矩阵独立才能共享同一个调色板(卷 II 13.5.2.3)。
  • 多关节:vMC=∑iwivMBKjiv_M^C=\sum_i w_i v_M^B K_{j_i}。权重由绑定美术给出,和不为 1 时应由工具管线重新归一化(卷 II 13.5.2.4)。
  • GEA 第 13 章只讲线性混合蒙皮,不讨论本页「缺陷与改进」中的双四元数蒙皮等方法。
  1. realtime_rendering_4ed.pdf 第 4 章 Transforms
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 13 章 13.5 节

相关页面

游戏美术变形动画Morphing变形在两个模型之间插值,需要解决顶点对应和插值两个问题。顶点一一对应时可以逐顶点线性插值;更直观可控的形式是变形目标/混合形状:在中性模型上叠加加权的差分向量,常用于面部动画。过场中无法用这些方法表达的动画,可以用压缩后的几何缓存逐帧回放。游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。图形学顶点着色器Vertex Shader顶点着色器是程序员直接控制的第一个管线阶段,逐个处理输入顶点,至少要输出顶点在齐次裁剪空间里的位置。它不能创建或删除顶点,顶点之间也不能传递结果,正因如此可以大规模并行。游戏数学基本仿射变换Basic Affine Transforms平移、旋转、缩放、切变是摆放和变形物体的基础矩阵;它们的连乘顺序有关、但满足结合律。刚体变换的逆可以直接写出,法线要用伴随矩阵的转置(传统说法是逆转置)变换。理解这些矩阵的性质能写出更快、更正确的变换代码。综合角色渲染Character Rendering角色是游戏中最受关注、技术最集中的资产。本页按"动起来 → 表面细节 → 材质着色 → 特殊材质(皮肤、毛发、布料)→ 光照与阴影 → 性能"的顺序,把 wiki 中相关概念页串成一套角色渲染方案的地图。每一层只给出要点与取舍,细节见链接页。游戏开发 · UE5动画蓝图与动画系统Animation Blueprint & Animation SystemUE5 角色动画以动画蓝图 (Animation Blueprint) 为核心:它每帧为骨骼网格体 (Skeletal Mesh) 计算最终姿势。动画蓝图内部用状态机 (State Machine) 组织“何时播什么”,用混合空间 (Blend Space) 按速度、方向等参数连续混合,用蒙太奇 (Animation Montage) 在插槽 (Slot) 中插播攻击、交互等一次性动作,用 Control Rig 做程序化骨骼控制(如贴地)。算出的骨骼姿势最终交给蒙皮 (Skinning) 驱动顶点。图形学替身与深度精灵Impostors & Depth Sprites替身 (impostor) 是把复杂物体从当前视点渲染成纹理、贴在视点朝向公告板上的表示,可在多个实例或多帧间复用以摊薄生成成本。公告板云用少量相交的镂空平面近似网格;深度精灵在纹理中加入每像素深度偏移,能与周围几何正确穿插;浮雕纹理、浮雕替身和几何图像进一步模糊了图像与网格的界线(RTR4 13.6.4、13.6.5、13.7 节)。游戏开发 · UE5IK Rig 与动画重定向IK Rig & RetargetingIK Rig 资产为某个骨骼网格定义 IK 目标 (Goal)、求解器栈 (Solver Stack) 和骨骼设置;IK Retargeter 用两个 IK Rig 中定义的重定向链 (retarget chains),在骨骼数量、骨骼名称和朝向都不同的骨架之间传递动画,还可以用 IK 保持手脚接触点的精确。参考姿势不同(例如 T 形与 A 形)时,需要编辑重定向姿势。游戏开发 · UE5Chaos 布料Chaos ClothUE5 的布料由 Chaos Cloth 解算器模拟,它是一个基于粒子的底层解算器。有两套制作流程:一是传统流程,在骨骼网格编辑器里直接选材质分段、绘制参数遮罩(最大距离、背挡、动画驱动等);二是 UE 5.3 起的 Panel Cloth Editor,用独立的布料资产和 Dataflow 节点图搭建,支持可选的 XPBD 约束和水平集体积 (Level Set Volume) 碰撞。游戏开发 · UE5MetaHuman 数字人MetaHumanMetaHuman 是 Epic 的一套完整框架,用来创建、驱动和使用带完整绑定、照片级的数字人。从 UE 5.6 起,MetaHuman Creator 完全集成进引擎(双击 MetaHuman Character 资产打开),可以把角色组装 (Assembly) 成针对不同目标环境优化的资产。在引擎层面,最需要关心的是 LOD:MetaHuman 由多个 LOD 数量不同的组件组成,由 LODSync 组件统一切换;毛发是 Groom 资产,可以在发丝、发片、网格三种几何之间按 LOD 切换。游戏数学旋转表示的比较Comparison of Rotational Representations旋转可以用欧拉角、3×3 矩阵、轴角、四元数表示,再加上平移与缩放就有 4×4(或 4×3)矩阵与 SRT(SQT)变换;更进一步还有对偶四元数。没有一种在所有场合都最好。GEA 按大小、直观性、能否直接作用于向量、能否插值、有无万向节锁比较它们,并用「参数个数 − 约束个数 = 3 个自由度」统一解释为什么它们用的浮点数不同。图形学渲染开发与 GPU 调试工具Rendering Development & GPU Debugging Tools渲染引擎的运行时部分只是拼图的一块,还需要一批离线工具来制作内容、优化性能、诊断问题。GEA 介绍了四类:数字内容创作 (DCC) 工具、材质编辑器、资产调理管线,以及 PIX、Razor GPU 这样的 GPU 帧捕获、检查和回放工具(GEA4 卷 II 12.9)。游戏开发动画管线与动作状态机Animation Pipeline & Action State Machines低层动画管线把片段和混合规格变成局部姿势、全局姿势和蒙皮矩阵调色板;其上的动作状态机 (ASM) 给游戏代码提供"按状态驱动动画"的接口。每个状态是任意复杂的片段混合,跟踪当前所有片段的方式有扁平加权平均和混合树两种;过渡用数据驱动的过渡矩阵描述,控制参数通过节点搜索、命名变量或控制结构体暴露给代码(GEA4 卷 II 13.9–13.10)。游戏数学齐次坐标与矩阵约定Homogeneous Coordinates & Matrix Conventions实时渲染用 4×4 矩阵和四元素齐次坐标统一表示点和方向:方向向量 w=0,点 w=1。这样线性变换与平移可以合成为仿射变换并连乘。RTR4 采用列向量记法、右手观察坐标系;DirectX 采用行向量记法,书中强调这只是记法差异。游戏开发骨骼、姿势与动画片段Skeletons, Poses & Animation Clips角色动画系统的数据核心是三样东西:骨骼(关节层级)、姿势(每个关节的 SRT 变换)和动画片段(姿势随局部时间变化的采样)。GEA 把各种动画方法看成对"逐点控制表面"这一理想的不同压缩方式;骨骼蒙皮用少量关节驱动大量顶点,是今天最主流的方案(GEA4 卷 II 13.1–13.4)。游戏美术技术动画Technical Animation第 8 章「Our Project: Technical Animation」覆盖角色从建模约束、蒙皮、绑定,到命名/目录、引用、导出格式与引擎规则、内存与切片、引擎内事件标签与混合时间、测试关与资产卫生。目标是让动画师少踩导出坑、系统可共享缩放。游戏美术游戏动画技术基础Game Animation Technical Foundations《GAME ANIM》第 5 章按基础→中级→高级梳理游戏动画师必须掌握的引擎侧概念:三类动画形态(循环 / 线性 / 过渡)、骨骼导出与数值运算、样条与碰撞移动、FK/IK,以及状态机、参数化混合、局部动画、叠加层、布娃娃,再到全身 IK、Look-At、混合形状与程序化系统。本页只收录书中实际讲到的内容,并与引擎架构页互链。

输入关键词开始搜索

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