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