可以从 制作 3D 模型AVDepthData
,但这可能不是您想要的。一个深度缓冲区就是这样——一个像素距离相机值的二维数组。因此,您从中获得的唯一“模型”不是非常 3D;这只是一个高度图。这意味着您无法从侧面看到它,也无法看到从正面看不到的轮廓。( WWDC 2017 深度摄影演讲附带的“使用深度数据”示例代码显示了一个例子。)
如果你想要更多真正的 3D“模型”,类似于 ARKit 提供的东西,你需要做 ARKit 所做的工作——随着时间的推移使用多个颜色和深度帧,以及经过训练以理解人脸的机器学习系统(以及为快速运行该系统而优化的硬件)。您可能不会发现自己这样做是一个可行的选择......
可以使用 Model I/O 从 ARKit中获取可导出的模型。您需要的代码大纲如下所示:
ARFaceGeometry
从面部跟踪会话中获取。
MDLMeshBuffer
从面几何的vertices
、textureCoordinates
和triangleIndices
数组创建s。(Apple 指出纹理坐标和三角形索引数组永远不会改变,因此您只需要创建一次——每次获得新帧时都必须更新顶点。)
MDLSubmesh
从索引缓冲区创建一个,MDLMesh
从子网格加上顶点和纹理坐标缓冲区创建一个。(可选地,MDLMesh
在创建网格后使用函数生成顶点法线缓冲区。)
创建一个空MDLAsset
并将网格添加到它。
将 导出MDLAsset
到 URL(提供带有.obj
文件扩展名的 URL,以便推断您要导出的格式)。
该序列根本不需要 SceneKit(或 Metal,或任何显示网格的能力),这可能会根据您的需要证明是有用的。如果您确实想涉及 SceneKit 和 Metal,您可能可以跳过几个步骤:
ARSCNFaceGeometry
在您的 Metal 设备上创建并通过ARFaceGeometry
面部跟踪会话传递给它。
用于MDLMesh(scnGeometry:)
获取该几何图形的模型 I/O 表示,然后按照上面的步骤 4-5 将其导出到.obj
文件。
但是,无论您以何种方式切割它……如果对眼睛和牙齿建模有强烈要求,Apple 提供的任何选项都不会帮助您,因为它们都没有这样做。所以,一些值得思考的食物:
- 考虑一下这是否是一个强要求?
- 复制 Apple 的所有工作,从颜色 + 深度图像序列中进行自己的面部模型推断?
- 根据ARKit 报告的
leftEyeTransform
/使用以球体为中心的眼睛建模作弊?rightEyeTransform
- 使用预制的牙齿模型进行牙齿建模,由 ARKit 提供的用于显示的面部几何图形组成?(用一个开闭关节连接您的内颌模型,并使用 ARKit
blendShapes[.jawOpen]
将其与脸部一起制作动画。)