人体拓扑结构、标准骨架和权重的数据文件
如 SMPL、SMPL-X 模型或类似的数字人体模型,通常以 .pkl(Python Pickle)或 .npz(NumPy Compressed Archive)格式存储,包含了将网格变成可变形的人体的所有核心数学描述
| 组件 | 数学符号 | 作用 |
|---|---|---|
| Vertices | V | 人体表面的点云 |
| Joints | J | 旋转发生的中心点 |
| Weights | W | 决定哪些点跟着哪根骨头动 |
| Faces | F | 渲染时用于连点成面 |
| Regressors | R | 从皮肤表面推算骨骼位置的矩阵 |
1. 拓扑结构 (Topology / Mesh)
拓扑定义了人体的“形状基础”。它不包含具体的位置坐标,而是定义了点与点之间的连接关系
- 顶点 (Vertices): 一个 $N \times 3$ 的矩阵,代表人体表面所有点的初始坐标(通常是 T-Pose 或 A-Pose)
- 面片 (Faces): 一个 $M \times 3$ 的整数矩阵,定义了哪些顶点组合成一个三角面片
- 意义: 无论人体如何运动,顶点之间的连接关系(拓扑)是不变的
2. 标准骨架 (Template Skeleton / J)
标准骨架定义了人体的“关节中心”
- 关节点 (Joints): 通常由 $K \times 3$ 的坐标组成。在 SMPL 模型中,这些关节点通常是从顶点坐标中通过一个回归矩阵 (Joint Regressor) 计算出来的
- 运动链 (Kinematic Tree): 定义了骨骼的父子关系(例如:手肘是肩膀的子节点)。这决定了旋转是如何从躯干传递到四肢的
- $K$ (行数): 关节点的数量。在标准 SMPL 模型中,$K = 24$(包括盆骨、膝盖、脚踝、脖子、肩膀等)
- 作用: 它们是人体旋转的中心点。当你摆动大腿时,所有的顶点都会绕着“髋关节(Hip Joint)”这个坐标进行旋转
回归矩阵 (Joint Regressor)
关节点的位置不是固定不变的,而是随着人体形状(Shape)的变化而自动调整$$J = \mathcal{W} \cdot V$$
- $V (N \times 3)$: 所有顶点坐标
- $\mathcal{W} (K \times N)$: 线性回归矩阵(Joint Regressor)
- 这个矩阵非常稀疏。对于每一个关节点(如手肘),$\mathcal{W}$ 只在对应手肘周围的顶点索引上有权重
- 关节点坐标实际上是它周围一圈顶点坐标的加权平均值
3. 混合权重 (Blend Weights / $W$)
这是让皮肤随骨骼自然移动的关键
- 数据结构: 一个大小为 $N \times K$ 的矩阵($N$ 为顶点数,$K$ 为关节数)
- 功能: 它定义了每一个顶点受每一个关节运动影响的程度
- 例如,大腿上的一个顶点可能 90% 受大腿骨旋转影响,10% 受臀部旋转影响
- 线性混合蒙皮 (LBS): 最终顶点的坐标是通过这些权重对相邻骨骼的变化进行加权平均计算出来的
4. 混合形状 (Blend Shapes)
为了让模型更逼真,文件中通常还包含两类修正项:
- 形状混合形状 (Shape Blendshapes / $\beta$): 解决“高矮胖瘦”的问题。通过 PCA(主成分分析)定义的基向量,改变 $\beta$ 参数可以调整人体的比例
- 姿态混合形状 (Pose Blendshapes): 解决“皮肤扭曲”的问题。例如当手臂弯曲时,为了防止肘部像纸盒一样塌陷,模型会根据旋转角度自动补偿顶点的偏移
SMPL_basic.ipynb
内容
- 模型加载:加载包含人体拓扑结构、标准骨架和权重的数据文件(通常是
.pkl或.npz) - 参数初始化:定义初始的形状参数(Betas)和姿态参数(Pose)
- 前向计算过程:
- 形状融合 (Shape Blend Shapes):根据 Betas 调整基础模型的胖瘦高矮
- 姿态融合 (Pose Blend Shapes):根据旋转角度调整关节处的皮肤变形(避免生硬的折痕)
- 正向运动学 (Forward Kinematics):计算各关节在空间中的位置
- 蒙皮 (Skinning):将顶点按照权重绑定到骨骼上,形成最终的人体网格
- 可视化:使用交互式工具展示生成的三维人体模型
参数
A. $\beta$ (Shape / Betas - 形状参数)
- 含义:描述人体的身材特征(如身高、胖瘦、腰围、头身比等)
- 形式:通常是一个 10 维的向量
- 原理:这是通过对数千个人体扫描样本进行主成分分析(PCA)得到的。$\beta_1$ 通常控制身高/胖瘦,$\beta_2$ 控制肌肉度等
B. $\theta$ (Pose - 姿态参数)
- 含义:描述人体 24 个关节的旋转角度
- 形式:$24 \times 3 = 72$ 维向量(使用轴角/Axis-angle 表示),或者 $24 \times 3 \times 3$(旋转矩阵)
- 组成:
- Root Rotation (Global Orient):前 3 维,决定人体的整体朝向(是面朝北还是面朝南)
- Body Pose:剩余的 69 维,描述各关节(如膝盖、手肘)相对于其“父节点”的旋转
C. $T$ (Translation - 位移参数)
- 含义:人体盆骨(根节点)在世界坐标系中的绝对 $XYZ$ 位置
- 形式:3 维向量 $[x, y, z]$
D. $J_regressor$ (关节回归矩阵)
- 含义:定义了如何从人体表面的 6890 个顶点中计算出那 24 个关节的中心点位置
- 重要性:它决定了“关节”到底在哪里。