一天认识一种模型方法--3D人体建模 SMPL
SMPL
SMPL (Skinned Multi-Person Linear Model) 是一个“万能人体生成器”。它非常强大,因为你只需要给它两组参数,它就能生成一个具有特定体型 (Shape) 和姿态 (Pose) 的、带有关节的、完整的 3D 人体网格(mesh)。
这两组参数就是:
- 体型参数 β (Beta): 一组数字,控制着这个人的高矮胖瘦、身体比例等。可以理解为“捏人”时的体型滑块。
- 姿态参数 θ (Theta): 一组数字,控制着人体20多个关节点(如手肘、膝盖等)的旋转角度,决定了这个人是站着、坐着、还是在跑步。
整个过程可以分为两大步:
- 塑造个性化模板:根据体型和姿态参数,在一个基础模型上进行微调,得到一个“准备好”被摆姿势的身体模型。
- 骨骼蒙皮:像提线木偶一样,驱动这个身体模型的“骨骼”到目标姿态,然后让“皮肤”(也就是mesh)跟着骨骼一起运动。
1. 塑造个性化模板
这个公式对应上面说的第一大步。它计算出要建模的人的3D人体模型(此时还没有各种动作,只是标准状态下的外表的建模),这个模型已经具备了目标的体型和姿态修正,但所有关节还处在“标准姿势”(Template Pose,T-Pose)下。
- T: 这是一个基础模板模型 (Template)。你可以把它想象成一个最标准、最平均的男性或女性 T-Pose 模型,它是所有变化的起点。它包含了数千个顶点(vertices)的坐标。
- Bs(β): 这是Shape Blend Shape
- 它是一个函数,输入体型参数 β,输出一个 3D 的形变量。
- 这个形变量会加到基础模板 T 上,来实现高矮胖瘦的变化。比如,如果 β 的某个值很大,可能 Bs(β) 就会让模型的肚子部分向外凸出一些。
- Bp(θ): 这是Pose Blend Shape
- 这是一个非常巧妙的修正项。当你单纯地旋转骨骼时,关节处(比如手肘、肩膀)的皮肤会不自然地扭曲或凹陷(被称为“糖果纸”效应)。
- Bp(θ) 就是为了修正这个问题。它会根据最终的目标姿态 θ,在关节处预先添加一些微小的、符合肌肉运动规律的形变。比如,当你要弯曲手臂时,它会在这里加上一个二头肌鼓起的形状。
2. 骨骼蒙皮(Linear Blend Skinning)
M(β,θ): 这就是我们想要的最终模型,一个特定体型、特定姿态的 3D 人体网格。
lbs(⋅): 代表线性混合蒙皮 (Linear Blend Skinning, LBS) 函数。这是计算机图形学中一个经典算法,用来将皮肤(网格顶点)附着到骨骼上。
T(β,θ): 这是上一步算出来的个性化 T-Pose 模型。
J(β): 根据体型参数 β 计算出的骨骼关节点(Joints)在 T-Pose 下的位置。胖的人骨架会宽一些。
θ: 目标姿态参数,它定义了每个关节应该如何旋转。
W: 蒙皮权重 (Blend Weights)。这是一个非常重要的矩阵,它定义了每一个顶点受每一个关节影响的程度。例如,对于小臂上的一个顶点,它主要受手肘和手腕关节的影响,几乎不受膝盖关节的影响。
这个公式揭示了 lbs 函数内部是如何对某一个顶点进行操作的。
vc: 代表个性化模板 T(β,θ) 上的任意一个顶点(在 Canonical Pose 下)。
vo: 代表这个顶点在经过姿态变换后,在最终模型 M 里的新位置(在 Observation Space 下)。
G: 这是一个为顶点 vc量身定制的、最终的混合变换矩阵。
wk: 对于我们正在计算的这个顶点 vc,它受到第 k 个关节的影响权重。这个值是从权重矩阵 W 中查出来的。
Gk(θ,jk): 这是第 k 个关节(骨骼)自身的全局变换矩阵(包含旋转和平移)。它由姿态参数 θ 和关节初始位置 jk 决定。
: 这就是 LBS 的核心!一个顶点的最终变换 G,不是由某一个关节决定的,而是由影响它的 K 个关节的变换 Gk 进行加权平均得到的。
SMPL-X
SMPL-X 由 SMPL 发展而来,在模型中加入了更多面部顶点、表情参数φ以及表情混合形状函数Be: