如何以.dae格式以编程方式保存arkit对象

时间:2018-04-03 09:32:34

标签: ios swift ios11 arkit

我正在开发一个应用程序,用于创建用户脸部的3d网格。我成功生成了用户脸的数据。

我希望以.dae格式以编程方式保存这些数据,这样我就可以导出我的.dae文件,在像blender这样的3d软件中编辑它,然后在我的iphone中进一步导入它并在sceneview中显示该文件。

长话短说我想以编程方式保存.dae格式的数据。我无法在互联网上找到任何关于此的内容。

如果还有其他办法,请告诉我。

2 个答案:

答案 0 :(得分:3)

SceneKit在iOS中本身不读取或写入DAE格式。 (SceneKit仅在macOS中读取/写入DAE。当您在应用程序的捆绑资源中发送DAE时,Xcode会在构建时将其转换为iOS优化格式。)

将网格导出到iOS的常见文件格式的最佳选择是Model I/O。该框架支持多种格式,但不支持DAE。如果你只是想输出由ARKit生成的ARFaceGeometry网格物体,你真的不需要比OBJ更复杂的格式,而模型I / O就是这样做的。

要点:

  1. 从顶点/索引数据创建MDLMesh。这对于顶点和纹理坐标数据需要MDLMeshBuffer,对于三角形索引数据需要MDLSubmesh es。或者,如果您已在SceneKit中使用网格物体,请将其转换为MDLMesh(scnGeometry:)

  2. 为您的网格创建一个空的MDLAssetadd作为子对象。

  3. Export资产到文件。您为写入资产而提供的URL的文件扩展名确定了导出的文件格式,因此如果要编写OBJ文件,请使用“.obj”文件名。

答案 1 :(得分:2)

您可以尝试以下代码:

  let scene2 = sceneView.scene
  let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
  let timeInterval = Date().timeIntervalSince1970 * 1000
  let filename = String(format: "test_%d.dae", timeInterval)
  let exportUrl = documentsPath.appendingPathComponent(filename)
  scene2.write(to: exportUrl, options: nil, delegate: nil, progressHandler: nil);