骨骼蒙皮

20.3. 骨骼蒙皮#

利用本章已经学到的知识,我们已经可以让一个角色动起来了,但是此时的角色依然是只具有一具由骨骼连接关节形成的骨架,因此我们需要使用 §9 的几何模型给角色蒙上一层表皮,使其看上去更真实。

对于静止的角色,其蒙皮固定不变,因此较容易进行蒙皮上顶点(vertex),面片(mesh)的生成与编辑。但是由于我们可以利用 §19.2.1 讲述前向运动学驱动骨架,因此我们需要给出根据骨架计算的顶点坐标,在进行后续的渲染工作。

为了带动皮肤,我们首先需要执行骨架与皮肤的对应关系。对应关系通常针对标准姿势进行。常见的标准姿势有 §19.2.1 提到的 T 型姿势。但是由于 T 型姿势在肩膀处形变较大,绑定效果一般,因而也有部分采用了将手臂 \(45^{\circ}\) 下垂的 A 型姿势(A-pose)。

产生标准姿势下的骨架结构与蒙皮定点后,我们便需要找到皮肤定点与骨架的对应关系。最简单的想法下,我们可以将顶点绑定到与其距离最近的骨骼上,并使用骨骼的旋转和位置驱动该顶点。对于绝大多是的顶点,其都能够找到唯一控制的骨骼。但是在关节分界的位置会出现顶点控制骨骼的突变,这导致关节处的蒙皮会有明显的割裂感。为了克服这个问题,工业界提出了线性混合蒙皮(linear blend skinning)的技术。

对于以骨骼 \(i\) 表示的坐标系,我们在给定时刻 \(t\),通过前向运动学过程后,从标准姿势变成时刻 \(t\) 所处的状态时,进行的变换为 \(\boldsymbol M_i^{(t)}\)。假设蒙皮上的顶点 \(i\) 在标准姿势下的坐标为 \(\boldsymbol v_i\),则通过线性混合蒙皮,最终其位置在 \(xyz\) 正交坐标系下的坐标为:

\[ \boldsymbol v_i'=\sum_{j=1}^mw_{i,j}\boldsymbol M_j^{(t)}\boldsymbol v_i=\left(\sum_{j=1}^mw_{i,j}\boldsymbol M_j^{(t)}\right)\boldsymbol v_i, \]

这里 \(w_{i,j}\) 表示第 \(j\) 根连杆对第 \(i\) 个顶点在施加变换之后的权重,且满足 \(\sum_jw_{i,j}=1\)。通常情况下,至多只有 \(4\) 个关节的 \(w_{i,j}\) 非零。不难发现,线性混合蒙皮只是将绑定到不同连杆的结果进行了加权求和,而加权的系数通常需要通过人力进行手工调整。

但是直接使用线性蒙皮的话,缺点依然存在。在部分关节局部旋转较大的时候,关节处可能会出现不必要的重叠与自交现象,导致出现类似于“糖纸”(candy wrapper)的扭曲现象。为了避免这种现象,后续工业界提出了对偶四元数蒙皮、旋转中心蒙皮等多种方法来解决这种问题。

在获得顶点坐标后,我们便可以根据 §15 的内容,对生成的蒙皮进行贴图,渲染等一系列操作。此时角色便不再是一具仅有骨骼的火柴人,更加像一个有血有肉的真实人类了。