下载 PDF [1.08 MB]
本代码示例支持用户使用前置英特尔® 实感™ 摄像头扫描面部,将其投影至可定制头部网格,并为其添加后处理效果。 它被称为将英特尔® 实感™ 摄像头扫描运用于 3D 网格,是对之前的代码示例所进行的一次扩展。 该示例添加了多项特性和技巧,可显著提高最终头部结果的质量,并提供一系列后期映射效果。
本代码示例添加了以下特性:
- 参数化头部。用户可使用滑块塑造头部外形。 例如,用户可改变头部、耳朵、下巴等部位的宽度。
- 标准化网格拓扑。映射算法可用于支持标准化拓扑的头部网格,并在映射完成后保留各顶点的上下文, 从而为对头部进行动画制作、改进混合效果和后期映射效果奠定基础。
- 色彩和外形后期处理。映射阶段完成后,可采用形态目标和其他色彩混合,对最终结果进行定制。
- 头发。新创建了许多适合基础头部模型的头发模型。 使用自定义算法可调整头发几何体,使其符合用户所选的头部外形。
该示例的最终结果适用于各种应用。 开发人员将这些工具运用到应用程序之中,可支持其用户扫描面部并对面部特征进行定制。 它还可用于生成游戏角色内容。 也可添加其他形态目标,以扩大所创建的角色范围。
图 1: 从左至右: (a) 英特尔® 实感™ SDK 扫描模块所返回的面部网格,(b) 映射至头部模型的扫描面部,(c) 通过 ogre 形态目标调整后的头部模型几何体,以及 (d) 经过调整并着色后的头部。
本文将详细介绍如何使用代码示例的特性创建扫描、修改面部几何体并添加效果。 以下视频将为您详细介绍这些步骤。
使用英特尔® 实感™ 创建可定制头部网格
使用示例
本示例包含两个可执行文件: ReleaseDX.exe(支持面部扫描)和 ReleaseDX_NORS.exe(仅支持映射之前扫描的面部)。 这两个可执行文件均要求 64 位 Visual Studio* 2013 运行时(点击此处下载)。 ReleaseDX.exe 要求安装英特尔® 实感™ SDK 运行时 2016 R1 (8.0.24.6528),可点击此处或此处下载。
运行 ReleaseDX.exe 即可开始面部扫描流程。 满足头部定位提示后,按下 Begin Scan 按钮,缓慢转动头部,然后点击 End Scan。 为获得最佳效果,请摘掉帽子或眼镜,将头发拨至耳后,并在光线好的区域进行扫描。
扫描完成或加载现有扫描后,可使用 UI 中的以下类型定制结果:
- 面部扫描。调整偏航、倾斜、旋转和 z 位移,以调整面部扫描的方向和位置。
- 头部塑形。使用提供的滑块改变头部模型的形状, 使创建的头部与扫描人物的头部相符。 外形调整可在后期处理阶段进行。
- 混合。使用色彩控制选择两种最适合肤色的颜色。 第一种颜色为基础色,第二种用于调整色调。
- 后期头部塑形。映射流程结束后,可对头部外形进行调整。 在本阶段中,您可以改变体质指数、将自己变成 orge,放大双眼等等。
- 后期混合。映射完成后,选择任意色彩效果并将其运用于整个头部。 这些色彩效果不会影响嘴唇或眼睛。 可以使用这些效果调整头部的色调/饱和度/亮度。
调试类包含多种选项,用于显示面部映射管道的不同部分。
本示例支持将最终头部和头发导出至 .OBJ 文件,以便加载至其他应用。
图 2:代码示例截图,显示用于定制头部的一部分选项。
艺术资产
下文将简要介绍本代码示例所使用以及本文所引用的艺术资产。 所有纹理资产均面向基础头部模型的 UV 坐标创作。 所有纹理资产均可用于管道混合阶段(位移控制图除外,它用于几何体阶段)。
- 基础头部网格。 供扫描面部网格使用的基础头部网格。
- 头部特征数据。基础头部网格的特征,符合英特尔实感 SDK 提供给各面部扫描的特征。
- 位移控制图。控制基础头部网格的哪些顶点因生成的面部位移图而发生偏移。
- 色彩控制图。 控制面部色彩与头部色彩的混合。
- 特征图。为最后生成的漫反射图提供头部纹理的灰度图。
- 皮肤图在后期混合阶段中用于防止色彩效果影响眼睛和嘴唇。
- 色彩传递图。控制用户选择的两种色彩之间的混合。
- 特征网格。用于将头部顶点移至与面部图投影中的相应位置。
- 头部形态目标。形态目标集合,面部映射至头部之前和之后均可用于基础头部外形。
- 头发模型。可供用户选择的头发模型集合。
面部映射管道
面部映射管道可分成四个阶段。
- 位移和色彩图 渲染面部扫描几何体,以创建在后续阶段中映射至头部的位移和色彩图。
- 几何体。 本阶段主要调整头部网格的位置和法线。 可使用位移图的值通过头部模型凸出面部扫描的外形。
- 混合。 将头部和面部色彩通道混合在一起,输出可映射至头部模型 UV 的单一色彩图。
- 头发几何体。 重新映射头发顶点位置,以纳入几何体阶段中对头部外形所做的修改。
面部位移和色彩图阶段
在该阶段中,使用正交投影矩阵渲染扫描面部网格,以创建深度图和色彩图。 面部扫描特征位置可投影到这些贴图上,并在几何体阶段中用于投影至头部网格。
图 3: 位移图阶段创建的色彩和位移图。 黄色圆点表示英特尔® 实感™ SDK 提供并投影至 2D 贴图空间的特征。
几何体阶段。
该阶段主要调整基础头部网格外形,并将位移图印在头上。 进行上述操作时必须维持各面部顶点的上下文;头部网格中鼻尖的顶点将会移动,以便面部置换顶点时,该顶点仍在鼻尖上。 维持这种上下文有利于控制与基础头部网格相关的信息,从而保持最终的头部网格。
下文将详细介绍有关本流程的信息。 这些高级步骤包括:
- 将基础头部网格投射至特征网格。 这一步骤将关联头部顶点和特征网格上的单个三角形、重心坐标以及沿该三角形法线的偏移。
- 使用形态目标调整头部顶点。
- 计算映射矩阵以便将 2D 位移/色彩图投影至头部网格,并使用该矩阵计算各顶点的纹理坐标。
- 使用面部特征数据调整特征网格。
- 使用步骤 1 中的投影数据根据调整后的特征网格移动头部顶点。
- 使用位移图的值沿着 z 轴置换头部顶点。
- 运用后期处理形态目标
构建参数头部
各种头部空间均适用于形态调整系统。 每种形状空间负责雕刻头部的一小部分(例如,其中一个目标仅控制下巴宽度, 而另外一项体质指数 (BMI) 几乎可以改变整个头部外形。) 美术师创作的头部外形都包含相同数量的顶点,必须匹配基础头部外形中相应的顶点数量。
图 4:借助形态目标实施的参数头部。
通过编译各顶点的三角点位置,可将美术师创作的头部外形转换成形态目标。 三角点位置表示基础头部网格的顶点与其相关目标外形顶点之间的差异或变化。 添加各顶点的三角点位置,然后乘以标量值,即可运用形态目标。 标量 0 不会产生影响,标量 1 可运用精确的目标外形。 大于 1 的标量可放大目标外形,负数标量可反转目标外形,产生极其有趣的效果。
该示例展示了部分复合形态目标,支持单个滑块作用于多个形态目标。 部分滑块作用于 0-1 的权重,其他滑块支持该范围之外的数值。
无论是面部映射至头部网格之前还是之后,都可使用这些形态调整技巧。
创建位移和色彩图投影矩阵
位移/色彩图投影将头部模型顶点位置正交投影至之前创建的位移和色彩图的 UV 坐标。 关于该流程的更多详情请参阅之前的相关示例文本。
面部调整几何体
之前的示例要求基础头部网格拥有适用于面部区域的相对密集的顶点网格。 它置换这些顶点以匹配扫描网格的外形。 但它不按照功能识别这些顶点(例如嘴角的顶点)。 在本示例版本中,基础头部网格的密集程度较低,顶点契合面部扫描,从而保留了顶点功能。 例如,眼周围的顶点可随扫描眼睛的位置移动。
英特尔实感 SDK 在面部扫描过程中提供大量的已知面部特征。 创作的基础头部网格提供匹配的特征。 特征网格可用于面部之间的映射。 每个重要特征对应一个顶点,从而形成相对较大的三角形以便对面部区域进行划分。 我们确定在何处将基础头部网格顶点投影至特征网格,以计算其在扫描面部的相应位置。
在这一过程中,头部顶点投影至特征网格,特征网格根据基础头部网格和面部特征数据进行调整,顶点位置重新投影至头部。 最后,将位移图应用于各面部区域顶点的 z 组件,从而突出扫描面部的外形。 位移控制图可确保仅移动面部顶点,以及受影响和未受影响顶点之间的平稳过渡。
将顶点投影至特征网格与头发调整阶段的投影类似。
图 5:包含明显特征的面部色彩图(左)和包含明显头部特征的基础头部网格(右)。
图 6: 与头部网格(左)顶部重叠的特征网格。 请注意内层顶点均排列于头部特征的上方。 根据面部特征信息(右)调整的特征网格。
图 7:重新投影并置换顶点位置(左)后包含特征网格的头部重叠。 注意嘴唇如何上移。 重新投影、置换和使用面部色彩图(右)之后的头部。
混合阶段
混合阶段负责混合面部扫描色彩数据和美术师创作的头部纹理,从而生成面向头部 UV 坐标创建的最终漫反射纹理。
色彩传递图用于计算用户选择的两种头部色彩之间的插值。 最终颜色乘以头部细节图,即可生成最终的头部颜色。 然后使用该色彩控制图混合头部颜色和面部颜色,从而平稳过渡这两种颜色。
确定色彩后,我们可以选择施加部分后处理混合效果。 该示例支持彩色和色彩调整效果。 彩色效果提取混合后的最终色彩的亮度,然后施加特定于用户的色调、饱和度和其他亮度。 色彩调整与其类似,不同之处在于它调整(而非覆盖)现有的色调、饱和度和亮度。 两种效果均支持色彩控制图控制的这两种色彩/调整。 这些效果使用皮肤图掩膜,以便眼睛和嘴唇的颜色保持不变。
所有混合操作均在 GPU 上完成。 如欲获取着色器,请访问 Media/MyAssets/Shader/SculptFace.fx。
图 8: 用于混合用户选择的两种色彩(左)的色彩传递图,和将纹理添加至头部的特征图(右)。
图 9:色彩控制图(左)负责控制头部颜色与面部颜色的混合。 该混合流程创建可映射至头部网格 UV 坐标(右)的色彩纹理。
头发几何体阶段
仅扫描面部不能提供头发信息。 应用需要提供头发,才能创建完整的头部。 该示例仅包含几个选择,只能展示技术功能,无法提供完整的解决方案。 功能齐全的应用包含多种选择和变体。
该示例支持更改头部外形,因此也可支持改变头发外形,从而以使两者之间完美匹配。 一种可能性是创建头发形态目标,以匹配头部形态目标。 但这需要创建大量的艺术资产,因此该示例选择随头部外形的变化以编程的方式调整头发形状。
图 10:在基础头部网格(左)上渲染的基础头发。 在调整后的头部外形上渲染的调整后的头发(中和右)。
找到与基础头部模型相关的头发顶点,然后将顶点移至最终头部外形中的相同的头部相对位置,即可完成头发匹配过程。 具体来说,每个头发顶点都与基础头部网格上的三角形、重心坐标和沿该三角形法线的偏移相关。
可以首先将头发顶点映射至基础头部网格的三角形,从而迭代每个头部网格三角形,然后使用三角形的法线将顶点投影至三角形的平面,并查看顶点是否位于三角形内部。 但这种方法会造成头发顶点可能无法映射至三角形的情况。 更好的方法是沿着顶点的法线正向投影基础头部网格三角形,直到它与头发顶点交叉。 如果头发顶点能够映射至多个头部网格三角形(因为头部网格为非凸面体),那么可以选择沿三角形法线的头发顶点最近的三角形。
图 11:简化后的头部网格和头发顶点。
图 12:单个三角形沿顶点法线突出,直到包含头发顶点。
图 13:为新的头部网格外形计算新的头部顶点位置。 按照相同的重心坐标查找,但与三角形的新顶点位置和法线相关。
图 14:将三角形投影至顶点 — 数学。
图 14 显示了用于将三角形投影至顶点的矢量,如以下 4 个视图所示。
- 黄色三角形为原始头部三角形。
- 灰色三角形为投影至头发顶点的黄色三角形。
- 蓝色线条表示顶点法线(非标准化)。
- 粉色线条从头发顶点延伸至黄色三角形上的点(注意其中一个顶点用作平面上的点)。
- 绿色线条显示沿着三角形法线从顶点到平面(包含三角形)的最短距离。 投影三角形的顶点位置的计算方法为:首先计算最近距离 d(从头发顶点到包含三角形的平面)。
Nt = 三角形法线
Ns = 表面法线(即从顶点法线插值替换)
Vh = 头发顶点
P = 平面上的顶点(即黄色三角形的一个顶点)
Px= 交叉位置。 三角形上的位置与从头发顶点(沿着表面法线)延伸出的线条交叉
at = 2x 投影三角形区域
d =从头发顶点到包含头部三角形的平面之间的最短距离
l = 从头发顶点到交叉点的距离
从头发顶点到包含头部三角形的平面之间的最短距离为投影三角形提供距离。
d = Nt(Vh-P)
各投影顶点的位置 v’i ,其中 Ni 为 Vi 的法线,即
V’i =Vi + dNi/(NtNi )
头发顶点的重心坐标(与投影三角形相关)为三角形的总面积。 运用交叉乘积使三角形的面积增加一倍。
at = |(V’1 - V’0) x (V’2-V’0)|
三个重心坐标 a、b、c 为
a = |(V’2 - V’1) x (Vh-V’1)|/at
b = |(V’0 - V’2) x (Vh-V’2)|/at
c = |(V’1 - V’0) x (Vh-V’0)|/at
顶点位于三角形内部,如果 a、b、c 大于 0,那么 a、b、c 的总和应小于 1。 注意该顶点位于表面法线之上。 重心坐标提供通过三条顶点法线插值交替的表面法线。 它们同样提供三角形上的点(也沿着这条线分布(即交叉点)。
Ns = aN0 + bN1 + cN2
交叉点为
Px = aV0 + bV1 + cV2
保存从头发顶点到 Px的距离 (l)。 头部变形后,头发顶点将移动至与新头部外形上的三角形保持这段距离。
l = |(Px - Vh)|
逆向进行该流程,以确定与新头部外形相对的头发顶点位置。 交叉点的重心坐标(之前根据基础头部网格所计算的)可用于计算头发顶点位置和新头部外形的法线。
N’s = aN’0 + bN’1 + cN’2
P’x = aV’0 + bV’1 + cV’2
新的头发顶点位置为
V’h = P’x + lN’s
注意,该方法仅移动顶点, 取法检查其他交叉点。 在实际应用中,该方法能够取得良好的效果,但也存在局限性。 例如,极端头部外形会使头发顶点/三角形穿过头发。
另外需要注意的一点是,头发顶点可位于头部三角形的任意一侧。 这样有助于美术师将部分头发顶点推进至头部。 可缩短该距离,从而最大限度地降低相关顶点和三角形位于头部另一侧的几率。
致谢
用于基础头部网格、形态目标、纹理和部分头发模型的资产均由 3DModelForge (http://3dmodelforge.com) 创建。
其他头发由 Liquid Development (http://www.liquiddevelopment.com/) 创建。
Doug McNabb、Jeff Williams、Dave Bookout 和 Chris Kirkpatrick 为该示例提供了其他帮助。