从 ARSCNFaceGeometry 中提取人脸特征

Extract face features from ARSCNFaceGeometry

我一直在尝试从 ARSCNFaceGeometry 中提取面部特征(例如嘴巴)以更改其颜色或添加不同的 material,但没有成功。 我知道我需要创建一个 SCNGeometry,我有 SCNGeometrySource 但无法创建 SCNGeometryElement。 已尝试在 update(from faceGeometry: ARFaceGeometry) 中从 ARFaceAnchor 创建它,但到目前为止还不能。 非常感谢有人帮助

ARSCNFaceGeometry 是单个网格。如果您希望它的不同区域具有不同的颜色,最好的办法是应用纹理贴图(您在 SceneKit 中通过为 material 属性 内容提供图像来实现)。

没有与网格中的顶点相关联的语义信息——也就是说,没有任何内容表明“这个点是鼻尖,这些点是上唇的边缘,等等”。但是网格在拓扑上是稳定的,所以如果你创建一个纹理图像,在嘴唇周围添加一点颜色,或者在眼睛上添加闪电或其他任何东西,它会随着脸部四处移动而停留在那里。

如果您在开始绘制纹理方面需要帮助,可以尝试以下几种方法:

首先创建一个虚拟纹理

制作一个正方形图像并用双渐变填充它,这样每个像素的红色和蓝色分量都基于该像素的 x 和 y 坐标。或者其他一些独特的图案。将该纹理应用于模型,看看它的外观 - 纹理中的地标将指导您在何处绘画。

导出模型

使用 init(blendShapes:) 初始值设定项和一个空的 blendShapes 字典创建一个虚拟 ARSCNFaceGeometry(为此您不需要活动的 ARFaceTracking 会话,但您需要需要一个 iPhone X)。使用 SceneKit 的场景导出 API(或模型 I/O)将该模型写入某种 3D 文件(.scn,您可以在 Mac 或类似 .obj 上进一步处理)。

将该文件导入您最喜欢的 3D 建模工具(Blender、Maya 等)并使用该工具绘制纹理。然后在您的应用程序中使用带有真实面孔的纹理。


实际上,上面的内容过于简单化了,尽管它是常见情况的简单答案。如果使用 init(device:fillMesh:) 初始值设定项创建 ARSCNFaceGeometry 实际上最多可以包含四个子网格。但即使那样,这些部分也不是面部的语义标记区域——它们是常规面部模型中的 ,眼睛和嘴巴露出的地方的平面填充.