我对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模型?
谢谢。
答案 0 :(得分:3)
可以从AVDepthData
创建3D模型,但这可能不是您想要的。一个深度缓冲区就是这样-像素到相机距离值的2D数组。因此,您从中获得的唯一“模型”不是非常3D的。这只是一个高度图。这意味着您不能从侧面看它,也不能看到从前面看不到的轮廓。 (附加到WWDC 2017 talk on depth photography的“使用深度数据”示例代码显示了一个示例。)
如果您想要更多类似于ARKit提供的真正3D“模型”,则需要完成ARKit所做的工作-随时间使用多个颜色和深度框架,以及训练有素的机器学习系统了解人脸(以及为快速运行该系统而优化的硬件)。您可能不会发现自己是一个可行的选择...
可以使用模型I / O从ARKit中获取可导出模型。您需要的代码概述如下:
从面部跟踪会话获取ARFaceGeometry
。
从面几何的MDLMeshBuffer
,vertices
和textureCoordinates
数组创建triangleIndices
。 (Apple注意到纹理坐标和三角形索引数组永远不会改变,因此您只需创建一次即可-每次获得新框架时都必须更新顶点。)
从索引缓冲区创建一个MDLSubmesh
,从子网格以及顶点和纹理坐标缓冲区创建一个MDLMesh
。 (创建网格后,可以使用MDLMesh
函数来生成顶点法线缓冲区。)
创建一个空的MDLAsset
并将网格添加到其中。
将MDLAsset
导出到URL(提供带有.obj
文件扩展名的URL,以便其推断您要导出的格式)。
该序列完全不需要SceneKit(或Metal,或任何显示的功能),根据您的需要,这可能会很有用。如果您确实想使用SceneKit和Metal,则可以跳过一些步骤:
在金属设备上创建ARSCNFaceGeometry
,并通过面部跟踪会话将其ARFaceGeometry
传递给它。
使用MDLMesh(scnGeometry:)
获取该几何的模型I / O表示,然后按照上面的步骤4-5将其导出到.obj
文件中。
但是,无论如何,它都可以切片,如果...是对眼睛和牙齿建模的强烈要求,那么Apple提供的任何选项都不会对您有所帮助,因为它们都无法做到这一点。因此,值得深思:
leftEyeTransform
/ rightEyeTransform
为中心的球进行眼球建模吗?blendShapes[.jawOpen]
使其与脸部动画。)