【问题标题】:How to make a 3D model from AVDepthData?如何从 AVDepthData 制作 3D 模型?
【发布时间】:2019-03-27 23:01:57
【问题描述】:

我对 TrueDepth 相机的数据处理问题很感兴趣。需要获取人脸数据,构建人脸3D模型,并将模型保存在.obj文件中。

由于在 3D 模型中需要人的眼睛和牙齿存在,因此 ARKit / SceneKit 不适合,因为 ARKit / SceneKit 不会用数据填充这些区域。

但在 SceneKit.ModelIO 库的帮助下,我设法以 .obj 格式导出 ARSCNView.scene(SCNScene 类型)。 我试图以这个项目为基础: https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/streaming_depth_data_from_the_truedepth_camera

在这个项目中,TrueDepth Camera 的使用是使用 Metal 完成的,但如果我没记错的话,使用 Metal 渲染的 MTKView 不是 3D 模型,不能导出为 .obj。

请告诉我是否有办法将 MTKView 导出到 SCNScene 或直接导出到 .obj? 如果没有这种方法,那么如何从 AVDepthData 制作 3D 模型?

谢谢。

【问题讨论】:

  • @Orlov 运气好吗?

标签: ios 3d scenekit arkit truedepth-camera


【解决方案1】:

可以从AVDepthData 制作 3D 模型,但这可能不是您想要的。一个深度缓冲区就是这样——一个像素距离相机值的二维数组。因此,您从中获得的唯一“模型”不是非常 3D;这只是一个高度图。这意味着您无法从侧面看到它,也无法看到从正面看不到的轮廓。 (WWDC 2017 talk on depth photography 附带的“使用深度数据”示例代码显示了一个示例。)

如果您想要更多真正的 3D“模型”,类似于 ARKit 提供的功能,您需要完成 ARKit 所做的工作——随着时间的推移使用多个颜色和深度帧,以及经过训练的机器学习系统了解人脸(以及为快速运行该系统而优化的硬件)。您可能不会发现自己这样做不是一个可行的选择...


可以使用 Model I/O 从 ARKit 中获取可导出的模型。您需要的代码大纲如下所示:

  1. 从面部跟踪会话中获取 ARFaceGeometry。

  2. 从面几何的vertices、textureCoordinates 和triangleIndices 数组创建MDLMeshBuffers。 (Apple 指出纹理坐标和三角形索引数组永远不会改变,因此您只需要创建一次 - 每次获得新帧时都必须更新顶点。)

  3. 从索引缓冲区创建一个MDLSubmesh,从子网格加上顶点和纹理坐标缓冲区创建一个MDLMesh。 (可选地,在创建网格后使用MDLMesh 函数生成顶点法线缓冲区。)

  4. 创建一个空的MDLAsset 并将网格添加到其中。

  5. 将MDLAsset 导出到URL(提供带有.obj 文件扩展名的URL,以便推断出您要导出的格式)。

该序列根本不需要 SceneKit(或 Metal,或任何显示网格的能力),这可能会根据您的需要证明是有用的。如果您确实想使用 SceneKit 和 Metal,您可以跳过几个步骤:

  1. 在您的 Metal 设备上创建 ARSCNFaceGeometry,并通过面部跟踪会话将 ARFaceGeometry 传递给它。

  2. 使用 MDLMesh(scnGeometry:) 获取该几何图形的模型 I/O 表示,然后按照上述步骤 4-5 将其导出到 .obj 文件。


不过,无论您以何种方式切割它……如果对眼睛和牙齿建模有很强的要求,那么 Apple 提供的任何选项都不会帮助您,因为它们都没有这样做。所以,值得深思:

  • 考虑这是否是一个强要求?
  • 复制 Apple 的所有工作,根据颜色 + 深度图像序列进行您自己的人脸模型推断?
  • 根据 ARKit 报告的leftEyeTransform/rightEyeTransform,使用以球体为中心的眼睛建模作弊?
  • 使用pre-made model of teeth 进行牙齿建模作弊,由 ARKit 提供的用于显示的面部几何图形组成? (用一个开闭关节连接您的内颌模型,并使用 ARKit 的blendShapes[.jawOpen] 将其与脸部一起制作动画。)

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 2021-07-14
    • 2016-09-06
    • 1970-01-01
    • 2017-12-14
    • 2020-08-19
    • 2021-03-30
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多