我一直在尝试提取面部特征,例如嘴巴,ARSCNFaceGeometry
以改变它们的颜色或添加不同的material
. 我知道我需要创建一个SCNGeometry
我拥有SCNGeometrySource
但无法创建SCNGeometryElement
. 已尝试从ARFaceAnchor
in创建它,update(from faceGeometry: ARFaceGeometry)
但到目前为止一直无法。非常感谢有人帮助
1 回答
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:)
初始化程序创建它,它实际上最多可以包含四个子网格。但即便如此,这些部分也不是面部的语义标记区域——它们是常规面部模型中的孔,是眼睛和嘴巴露出来的地方的平面填充物。