从ARSCNFaceGeometry中提取面部特征

pes*_*sch 4 ios arkit arscnview

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

ric*_*ter 9

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:)初始化程序创建它,实际上最多可以包含四个子网格.但即使这样,这些部分也没有语义标记的面部区域 - 它们是常规面部模型中的,是眼睛和嘴巴显示的地方的平坦填充物.