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