我一直试图从ARSCNFaceGeometry
中提取人脸特征,例如嘴巴,以改变它们的颜色或添加不同的material
,但没有成功。我知道我需要创建一个SCNGeometry
,我有SCNGeometrySource
,但无法创建SCNGeometryElement
。已经尝试在update(from faceGeometry: ARFaceGeometry)
中从ARFaceAnchor
创建它,但到目前为止还无法。非常感谢有人帮助
ARSCNFaceGeometry
是单个网格。如果希望它的不同区域具有不同的颜色,最好应用纹理贴图(在SceneKit中通过为材质属性内容提供图像来实现)。
没有与网格中的顶点相关的语义信息——也就是说,没有任何信息表明"这个点是鼻尖,这些点是上唇的边缘,等等"。但网格在拓扑上是稳定的,所以如果你创建一个纹理图像,在嘴唇周围添加一点颜色,或者在眼睛上添加一道闪电,或者其他什么,当脸四处移动时,它会保持不变。
如果你需要帮助开始绘制纹理,你可以尝试以下几种方法:
首先创建虚拟纹理
制作一个正方形图像,并用双渐变填充,使每个像素的红色和蓝色分量基于该像素的x和y坐标。或者其他一些与众不同的图案。将该纹理应用于模型,并查看其外观——纹理中的地标将引导您在哪里绘制。
导出模型
使用init(blendShapes:)
初始值设定项和空的blendShapes
字典创建一个伪ARSCNFaceGeometry
(不需要活动的ARFaceTracking
会话,但需要iPhone X)。使用SceneKit的场景导出API(或模型I/O)将该模型写入某种类型的3D文件(.scn,您可以在Mac上进一步处理,或类似.obj的文件)。
将该文件导入到您喜爱的3D建模工具(Blender、Maya等)中,然后使用该工具绘制纹理。然后在你的应用程序中使用真实的人脸纹理。
事实上,上面的内容有点过于简单,尽管这是常见情况的简单答案。如果使用init(device:fillMesh:)
初始值设定项创建ARSCNFaceGeometry
,那么它实际上最多可以包含四个子网格。但即便如此,这些部位也不是人脸的语义标记区域——它们是普通人脸模型中的洞,是眼睛和嘴巴露出的地方的平面填充。