ios - 如何从 AVDepthData 制作 3D 模型?

标签 ios 3d scenekit arkit truedepth-camera

我对 TrueDepth Camera 的数据处理问题很感兴趣。需要获取人脸数据,建立人脸的3D模型,并保存为.obj文件。

由于在 3D 模型中需要人的眼睛和 dentry 的存在,因此 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模型呢?

谢谢。

最佳答案

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

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


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

  1. 从面部跟踪 session 中获取 ARFaceGeometry

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

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

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

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

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

  1. 在您的 Metal 设备上创建 ARSCNFaceGeometry,并从面部跟踪 session 中向其传递一个 ARFaceGeometry

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


不过,无论您如何切片...如果对眼睛和 dentry 建模有很强的要求,Apple 提供的选项都不会帮助您,因为它们都不会这样做。所以,一些值得深思的事情:

  • 考虑一下这是否是一项严格的要求?
  • 复制 Apple 的所有工作来根据颜色 + 深度图像序列进行您自己的面部模型推断?
  • 使用根据 ARKit 报告的 leftEyeTransform/rightEyeTransform 居中的球体在眼睛建模上作弊?
  • 使用 pre-made model of teeth 在 dentry 造型上作弊, 由 ARKit 提供的人脸几何组成来显示? (用一个单独的开闭关节连接你的内颚模型,并使用 ARKit 的 blendShapes[.jawOpen] 将它与脸部一起制作动画。)

关于ios - 如何从 AVDepthData 制作 3D 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52953590/

相关文章:

ios - SCNCamera 旋转时应用程序在“后退”按钮上崩溃

ios - 在用户看到之前在 TableView 中显示数组

android 3d 动态壁纸 - 使用什么引擎?

ios - 在 SceneKit 中为对象着色相当于什么?

swift - 如何在 Xcode 10.1 中渲染 DAE (COLLADA) 文件。目前正在崩溃

python-2.7 - 用 python 绘制 3D 条形直方图

iphone - 如何在项目中实现UIPageController

带有导航 Controller 的 iOS TvOS 标签栏

ios - 使用 PDF 中的可点击链接在 Swift 中创建 PDF

java - 为什么 Raspberry Pi 上的 JavaFX (3D) 不起作用,尽管它应该起作用?