如何使用AVDepthData制作3D模型?

时间:2018-10-23 16:13:45

标签: ios 3d scenekit arkit truedepth-camera

我对TrueDepth Camera的数据处理问题感兴趣。必须获取人脸的数据,构建人脸的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

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

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

谢谢。

1 个答案:

答案 0 :(得分:3)

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

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


可以使用模型I / O从ARKit中获取可导出模型。您需要的代码概述如下:

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

  2. 从面几何的MDLMeshBufferverticestextureCoordinates数组创建triangleIndices。 (Apple注意到纹理坐标和三角形索引数组永远不会改变,因此您只需创建一次即可-每次获得新框架时都必须更新顶点。)

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

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

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

该序列完全不需要SceneKit(或Metal,或任何显示的功能),根据您的需要,这可能会很有用。如果您确实想使用SceneKit和Metal,则可以跳过一些步骤:

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

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


但是,无论如何,它都可以切片,如果...是对眼睛和牙齿建模的强烈要求,那么Apple提供的任何选项都不会对您有所帮助,因为它们都无法做到这一点。因此,值得深思:

  • 考虑这是否有很强的要求?
  • 复制Apple的所有工作以从颜色+深度图像序列中进行自己的面部模型推断吗?
  • 使用根据ARKit报告的leftEyeTransform / rightEyeTransform为中心的球进行眼球建模吗?
  • 使用pre-made model of teeth进行牙齿建模,并结合ARKit提供的面部几何图形进行显示吗? (使用单个张开关节清晰地表达您的下颌模型,并使用ARKit的blendShapes[.jawOpen]使其与脸部动画。)