6

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

4

1 回答 1

10

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

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

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

首先创建一个虚拟纹理

制作一个正方形图像并用双梯度填充它,这样每个像素的红色和蓝色分量都基于该像素的 x 和 y 坐标。或其他一些独特的模式。将该纹理应用到模型上,看看它的外观——纹理中的地标将指导您在哪里绘画。

导出模型

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

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


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

于 2017-11-14T18:16:59.900 回答