Robust and Accurate Skeletal Rigging from Mesh Sequences

论文信息

  • 标题:Robust and Accurate Skeletal Rigging from Mesh Sequences
  • 作者:Binh Huy Le, Zhigang Deng(休斯顿大学)
  • 发表:ACM Transactions on Graphics (SIGGRAPH)

0. 背景知识

0.1 什么是骨骼绑定(Skeletal Rigging)?

在3D动画制作中,"骨骼绑定"是连接3D模型(称为"皮肤"或"网格")与虚拟骨骼系统的过程。这个过程就像给木偶安装关节:

graph LR
    A["3D网格模型<br/>(Mesh)"] --> B["骨骼系统<br/>(Skeleton)"]
    B --> C["蒙皮权重<br/>(Skinning Weights)"]
    C --> D["骨骼动画<br/>(Skeletal Animation)"]

为什么需要骨骼绑定?

  • 让角色能够自然地弯曲和运动
  • 只需要控制少量骨骼参数,就能驱动大量顶点
  • 游戏引擎和动画软件(如Maya、Blender)都支持骨骼动画

0.2 什么是线性混合蒙皮(LBS - Linear Blend Skinning)?

线性混合蒙皮是目前最广泛使用的骨骼蒙皮方法。它的核心思想是:每个网格顶点受多个骨骼影响,影响程度由权重决定

数学表达式:

$$ \mathbf{v} i' = \sum{j=1}^{B} w _{ij} \left( \mathbf{R} _j \mathbf{t} _j \right) \mathbf{v} _i $$

其中:

  • \(\mathbf{v} _i\) 是第 \(i\) 个顶点在初始姿态(静止姿态)的位置
  • \(\mathbf{v} _i'\) 是变换后的位置
  • \(w _{ij}\) 是顶点 \(i\) 受到骨骼 \(j\) 影响的权重
  • \(\mathbf{R} _j\) 是骨骼 \(j\) 的旋转矩阵
  • \(\mathbf{t} _j\) 是骨骼 \(j\) 的平移向量
  • \(B\) 是骨骼的总数

直观理解

  • 想象你用手拉动一块布的不同位置
  • 靠近手指的布跟随手指移动(高权重)
  • 远处的布只受轻微影响(低权重)

0.3 骨骼(Bone)与关节(Joint)

  • 骨骼(Bone):刚体部分,在旋转时保持形状不变
  • 关节(Joint):连接骨骼的枢纽点,骨骼绕此点旋转
    骨骼A           骨骼B
   ┌─────┐         ┌─────┐
   │     │         │     │
   │     │    关节 ├──    │
   └─────┘      ●  └─────┘

0.4 本文要解决的核心问题

传统骨骼绑定需要人工操作,非常耗时耗力。本文提出自动化方法:从一组示例姿态(网格序列)自动生成骨骼系统。

输入:一组不同姿态的3D网格序列(如运动捕捉数据)

输出

  • 骨骼结构(哪些骨骼相连)
  • 关节位置
  • 蒙皮权重
  • 各姿态对应的骨骼变换

1. 问题与动机

1.1 传统方法的局限性

现有基于示例的骨骼绑定方法(如 Schaefer & Yuksel 2007、de Aguiar 2008、Hasler 2010)存在两个主要问题:

问题1:过度估计的骨骼初始化

初始化时产生的骨骼数量往往过多,导致:

  • 不准确的骨骼
  • 冗余的骨骼(可以被其他骨骼组合替代)

传统方法问题:过度估计的骨骼初始化

Figure 2: 红箭头标注的是过度估计的骨骼

问题2:关节位置不准确

关节位置的估计误差会逐级累积——从根关节到叶关节,误差越来越大。

1.2 本文的核心贡献

  1. 鲁棒性:通过自动剪枝冗余骨骼,比之前方法更鲁棒
  2. 准确性:通过关节约束优化,比之前方法更准确

2. 方法概述

2.1 整体流程

flowchart TD
    A["输入:示例姿态序列<br/>Mesh Sequences"] --> B["Step 1: 初始化<br/>Initialization"]
    B --> C["Step 2: 拓扑重建<br/>Topology Reconstruction"]
    C --> D["Step 3: 迭代绑定<br/>Iterative Rigging"]
    
    D --> E["更新蒙皮权重<br/>Update Weights"]
    E --> F["更新关节位置<br/>Update Joint Positions"]
    F --> G["更新骨骼变换<br/>Update Bone Transformations"]
    G --> H{"骨骼剪枝?"}
    
    H -->|是| I["剪枝冗余骨骼<br/>Prune Bones"]
    I --> D
    
    H -->|否| J{"达到最大<br/>迭代次数?"}
    J -->|否| E
    J -->|是| K["输出:骨骼 & 蒙皮模型"]
    
    B -->|"32个初始簇"| C
    D -->|"交替更新"| E

Figure 3: 本文方法的完整流程

2.2 三个主要步骤

步骤名称功能
1初始化从示例姿态识别刚体部分,初始化骨骼变换
2拓扑重建构建骨骼层级结构(哪些骨骼相连)
3迭代绑定交替优化权重、关节位置、骨骼变换,并剪枝冗余骨骼

3. 初始化(Initialization)

3.1 运动驱动聚类(Motion-Driven Vertex Clustering)

核心思想:运动相似的顶点属于同一个刚体部分

使用 Linde-Buzo-Gray (LBG) 算法对顶点进行聚类:

  • 具有相似刚体变换的顶点被分到同一簇
  • 初始分为1簇,然后分裂成2、4、8、16、32簇

3.2 簇分裂-EM策略

为什么要分裂簇?

初始一个簇包含所有顶点,然后逐步分裂,让算法自动找到合适的骨骼数量。

如何选择分裂种子?

选择使得重建误差 × 到质心距离最大的顶点作为新簇种子:

$$ s = \arg\max _{i} \left{ d \left( \mathbf{u} _i, \mathbf{O} \right) e(i) \right} $$

其中:

  • \(d(\mathbf{u} _i, \mathbf{O})\) 是顶点到质心的欧氏距离
  • \(e(i)\) 是重建误差
  • \(L(i)\) 是顶点 \(i\) 的簇标签
    原始簇              分裂后
   ┌────────┐         ┌────────┐
   │   ●种子│   →     │  簇1   │ ●种子
   │  顶点  │         │  顶点  │
   │   ●   │         ├────────┤
   │   ●   │         │  簇2   │
   │   ●   │         │  顶点  │
   └────────┘         └────────┘

3.3 连接块生成

聚类算法只考虑运动相似性,忽略网格连接信息。因此,同一刚体部分可能被分割到多个簇。

解决方案:对每个簇,找出所有连通分量(连接块),每个连通分量初始化一个独立的骨骼变换。

4. 拓扑重建(Topology Reconstruction)

4.1 骨骼图构建

构建加权图 \(G\):

  • 节点:每个骨骼
  • 边权重 \(g(j,k)\):两个骨骼共享关节的概率

权重计算公式:

$$ g(j,k) = \frac{ \sum_{f=1}^{F} \left| \left[ \mathbf{R} _j^f | \mathbf{t} _j^f \right] \mathbf{C} _{jk} - \left[ \mathbf{R} _k^f | \mathbf{t} _k^f \right] \mathbf{C} {jk} \right|^2 }{ \sum{i=1}^{N} w _{ij} w _{ik} } $$

直觉理解:

  • 分子:关节拟合误差越小 → 两骨骼越应该相连
  • 分母:两骨骼的权重混合越大 → 它们越可能共享关节

4.2 最小生成树(MST)

使用 Kruskal 算法从加权图 \(G\) 构建最小生成树,即得到骨骼拓扑结构。

    加权图                    最小生成树(骨骼拓扑)
    
    A ──0.3── B              A ──0.3── B
    │╲       │                    ╲
   0.5╲ 0.4  │        →            ╲
    │   ╲    │                      C
    C ──0.6── D              C ──0.6── D

5. 迭代绑定(Iterative Rigging)

这是本文的核心创新部分!

5.1 优化目标

最小化目标函数:

$$ E = E _D + \lambda _S E _S + \lambda _J E _J $$

三项分别为:

  • \(E _D\):数据拟合项 —— 最小化网格重建误差
  • \(E _S\):权重平滑项 —— 保证相邻顶点权重相似
  • \(E _J\):关节约束项 —— 保证骨骼绕关节旋转

5.2 权重更新(Skinning Weights Update)

问题:传统最小二乘法对噪声敏感,且可能产生"蒙皮断裂"。

解决方案:刚性拉普拉斯正则化

定义拉普拉斯矩阵 \(\mathbf{L}\): $$ L {ik} = \begin{cases} 1 - \sum{h \in N(i)} d _{ik} & \text{if } k = i \ -d _{ik} & \text{if } k \in N(i) \ 0 & \text{otherwise} \end{cases} $$

其中刚性权重:

$$ d {ik} = \frac{1}{F} \sum{f=1}^{F} \frac{ \left| \mathbf{v} _i^f - \mathbf{v} _k^f \right|^2 }{ \left| \mathbf{u} _i - \mathbf{u} _k \right|^2 } $$

效果:刚性权重 \(d _{ik}\) 衡量顶点间距离在运动中是否保持不变

  • 距离保持不变 → \(d _{ik} \approx 1\) → \(L _{ik} \approx 0\) → 权重应相似
  • 距离变化大 → \(d _{ik} \ll 1\) → \(L _{ik} \approx 1\) → 允许权重不同

5.3 骨骼变换更新(Bone Transformations Update)

关键创新:关节软约束

约束骨骼 \(j\) 和 \(k\) 在共同关节处一起旋转:

$$ \min_{[\mathbf{R} _j^f | \mathbf{t} _j^f]} E j^f = \frac{1}{N} \sum{i=1}^{N} w _{ij}^2 \left| [\mathbf{R} _j^f | \mathbf{t} _j^f] \mathbf{u} _i - \mathbf{q} i^f \right|^2 + \lambda \sum{(j,k) \in S} \left| [\mathbf{R} _j^f | \mathbf{t} _j^f] \mathbf{C} _{jk} - \mathbf{q} ^f(\mathbf{C} _{jk}) \right|^2 $$

其中 \(\mathbf{q} ^f(\mathbf{C} _{jk})\) 是骨骼 \(k\) 变换后的关节位置。

    无关节约束                    有关节约束
    ┌─────────┐                  ┌─────────┐
    │    ●    │  骨骼不绕关节旋转   │    ●────┼── 骨骼绕关节旋转
    │   ╱ ╲   │  造成变形错误       │   ╱ ╲   │
    └─────────┘                  └─────────┘

Figure 6: 关节约束的效果对比

5.4 骨骼剪枝(Skeleton Pruning)

动机:初始化时故意生成过多骨骼(过度估计),然后剪枝。

剪枝策略:利用权重正则化项

如果骨骼 \(j\) 的权重平方和小于最大权重平方和的1%,则剪枝:

$$ \text{如果} \sum_{i=1}^{N} w _{ij}^2 < 10^{-2} \max k \sum{i=1}^{N} w _{ik}^2 \text{,则移除骨骼 } j $$

    剪枝前                        剪枝后
    ┌───────────────┐           ┌───────────────┐
    │  骨骼j(冗余)   │           │               │
    │    ↓ w≈0     │    →      │    骨骼A       │
    │  骨骼A ●────●骨骼B         │         ●────● 骨骼B
    └───────────────┘           └───────────────┘

Figure 7: 骨骼剪枝示意

6. 实验结果

6.1 数据集

数据集顶点数帧数骨骼数
cat-poses7,826298
lion-poses5,0009304
horse-gallop8,4314,82741
hand7,9974,31865
dance7,06120116
scape12,5007,02325
samba9,97117523
cow2,90420411

6.2 定量对比

方法我们的方法Method II
(Schaefer 2007)
Method III
(de Aguiar 2008)
Method IV
(Hasler 2010)
RMSE0.802.871.100.84
骨骼数量24242424

我们的方法在所有测试数据集上都达到了最低的RMSE(均方根误差)。

6.3 定性对比

与其他方法的对比

Figure 10: 与三种最先进方法的对比。红箭头标注了问题区域。

观察

  • 我们的方法在所有5个数据集上都产生了合理的结果
  • 其他方法在不同数据集上都有各自的问题
  • 我们的方法即使只使用一组参数也能处理所有数据集

6.4 鲁棒性测试

骨架剪枝的鲁棒性

Figure 8: 不同数据集的骨架提取结果

即使初始化为不同数量的簇(4, 8, 16, 32),我们的方法都能收敛到相似的最终骨架结构。

6.5 复杂模型应用

Samba模型:高度变形的裙子

Figure 13: 即使裙子高度变形,我们的方法也能生成合理的骨骼结构

弹性Cow模型

Figure 14: 弹性模型也能被成功绑定

7. 局限性

7.1 计算效率

  • 方法需要多次迭代剪枝,如果初始化骨骼过多,运行时间会显著增加
  • 目前只适用于离线应用

7.2 对输入数据的依赖

  • 输入姿态的运动范围受限可能导致关节不对称
  • 噪声和不完整的运动数据会影响结果质量

7.3 近似能力的局限

LBS模型的近似能力有限,无法捕捉某些复杂的非线性变形。

失败案例

Figure 15: 上臂和上腿的4个冗余骨骼无法被剪枝,因为LBS需要它们来近似肌肉鼓起效果

8. 结论

  1. 提出了一种鲁棒且准确的自动化骨骼绑定方法
  2. 核心创新:
    • 关节约束优化:保证骨骼绕关节旋转
    • 骨骼剪枝:自动移除冗余骨骼
    • 权重平滑正则化:刚性拉普拉斯正则化
  3. 在所有测试数据集上优于三种最先进的方法
  4. 输出可直接用于游戏引擎和3D动画软件

9. 公式速查表

公式编号名称用途
(1a)簇分裂种子选择选择最佳分裂点
(2)骨骼连接权重计算两骨骼共享关节的概率
(3a)总目标函数迭代优化的总体目标
(3b)数据拟合项最小化重建误差
(3c)权重平滑项保证相邻顶点权重相似
(3d)关节约束项保证骨骼绕关节旋转
(4a)拉普拉斯矩阵定义权重平滑的图结构
(4b)刚性权重衡量顶点距离保持能力
(11)剪枝条件判断是否应移除骨骼

10. 术语对照表

英文中文解释
Skeletal Rigging骨骼绑定将骨骼系统与3D网格连接的过程
Linear Blend Skinning (LBS)线性混合蒙皮最广泛使用的骨骼蒙皮方法
Skeleton骨骼系统由骨骼和关节组成的层级结构
Bone骨骼刚体部分,在旋转时保持形状
Joint关节连接骨骼的枢纽点
Skinning Weight蒙皮权重顶点受骨骼影响的程度
Vertex顶点3D网格的基本组成单元
Mesh网格由顶点组成的多边形表面
Rest Pose静止姿态角色的初始/参考姿态
Example Poses示例姿态用于训练的多个不同姿态
Pruning剪枝移除冗余骨骼的过程
Rigidness Laplacian刚性拉普拉斯用于权重平滑的图拉普拉斯变体

参考论文

  1. Le & Deng (2012) - 骨骼分解的平滑蒙皮(SSDR)
  2. Schaefer & Yuksel (2007) - 基于示例的骨骼提取
  3. de Aguiar et al. (2008) - 自动将网格动画转换为骨骼动画
  4. Hasler et al. (2010) - 学习用于形状和姿态的骨骼
  5. Kabsch (1978) - 绝对方向问题的解

本文档由 AI 自动生成,基于论文原文内容