从ARSCNFaceGeometry中提取面部特征

时间:2017-11-14 04:53:50

标签: ios arkit arscnview

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

1 个答案:

答案 0 :(得分:9)

ARSCNFaceGeometry是单个网格。如果你想要它的不同区域是不同的颜色,最好的办法是应用纹理贴图(你在SceneKit中通过提供材料属性内容的图像来做)。

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

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

首先创建一个虚拟纹理

制作正方形图像并用双梯度填充,使每个像素的红色和蓝色分量基于该像素的x和y坐标。或者其他一些独特的模式。将该纹理应用于模型,并查看其外观 - 纹理中的地标将指导您绘制的位置。

导出模型

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

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

实际上,上述内容有点过于简单化,尽管这是常见案例的简单答案。如果您使用init(device:fillMesh:)初始化程序创建它,ARSCNFaceGeometry实际上最多可包含四个子网格。但即使这样,这些部分也没有语义标记的面部区域 - 它们是常规面部模型中的,是眼睛和嘴巴显示的地方的平面填充。