[GPU Gem3] 15 脸部动作捕捉的实时应用
介绍
动态的真实脸部的数字实现主要有两个难点:脸部复杂的组织结构和恐怖谷效应。本文介绍使用全方位捕捉(universal capture)技术来获取脸部细节并实时重建的方法。
具体来说是使用三个高分辨率相机来捕捉脸部的动作细节并生成动画漫反射贴图(animated diffuse map),脸部细节包括细微的眉毛动作、光照变化、自阴影和褶皱拉伸,然后使用主元分析法(principal component analysis, PCA)来压缩贴图并对动画PCA的几何和权重进行熵编码,之后GPU渲染时在像素着色器上对其解压缩。
实现
全方位捕捉
以环境光配置对准演员的脸部,演员脸上有70个回射标记点,标记点的3D动作路径被用来重建并作为静态头部几何体的变形来源。使用脸部骨骼rig来进行变形处理,骨骼和标记点相匹配。一旦实现了脸部变形的重建,就可以重新投影并在UV空间混合输入的图像序列来产生动画漫反射贴图。
动态纹理的压缩和解压
压缩方案基于一个假设:当某个维度的变化幅度较小时,可认为该维度是不重要的,可以当作噪声忽略。
而基于这个假设,本文使用主元分析法PCA来分析哪些维度是重要的,这些维度被称为主元,是相互正交的并和最大方差的方向对齐。PCA的分析方式是假设每个数据点都是多元正态分布的一个采样点,从而可以使用一个均值向量和协方差矩阵来将数据集合参数化,于是可以计算一个可以将协方差矩阵对角化的投影以找到最大方差的方向。
分析的第一步是将纹理数据映射进一个矩阵,矩阵的行表示随时间的随机变量,矩阵的列表示从多元正态分布采样的结果,将每帧的纹理的RGB看作是相同分布的三个采样。
接下来的一步就是计算分布的基础参数,计算每列的均值向量,然后生成原矩阵A和均值向量的差值矩阵B,通过决定B的奇异值分解(SVD)来计算矩阵B的协方差矩阵并对它对角化
- 压缩:PCA后将构成动画的分量根据重要性排序,各分量的重要性可由∑的对角项看出。压缩的主要思想就是简单地排除影响最小的分量,然后将数据投影到低维度表示从而压缩数据集,如本文选择使用10664个分量中的6个来表示动作。
- 解压缩:解压缩算法是一个简单的矩阵运算,使用公式A=LR来重建矩阵A,由此使用C分量来在RGB上重建帧f
优化
使用PCA对动态纹理贴图进行统一的压缩会使得某些地方如眼睛失去细节,因此使用可变的PCA来进行优化,对每个像素保存的数据量进行选择。为每个像素分配一个额外的主要分量的数目,使得可以逐像素影响图像的质量,比如头发可以使用四个分量而眼睛使用88个分量。或者可以逐区域实现,对不同区域使用固定的硬编码来简化算法。