如何在运行时将 3D 内容加载到 RealityKit 应用程序中?

How to load 3D content into RealityKit Apps at runtime?

出于特定目的,我必须在运行时将 3D 内容(绝对首选 glTF)加载到我的基于 RealityKit 的应用程序中。 据我了解,RealityKit 通常在编译期间依赖 3D 内容转换为专有 .reality。

为了使其更易于理解:该应用程序可以与 IKEA Place 应用程序进行比较,具有不断变化的 AR 内容,甚至可以打开附加到邮件的 3D 内容。

最先进的解决方案是什么? 我发现了这种方法:https://the-nerd.be/2014/11/07/dynamically-load-collada-files-in-scenekit-at-runtime/ 但就我而言,它并不是真正可用的,因为它依赖于 3D 内容的基于 Mac 的预编译 并使用 SceneKit 而不是 RealityKit。 我还听说过 Model I/O (https://developer.apple.com/documentation/modelio) 这可能是一个解决方案,但我的知识不足以评估它。我怀疑它是否可用于 RealityKit 或仅用于 SceneKit。

如果我搞错了请指正SceneKit/RealityKit/ARKit。

RealityKit 仅支持加载 USDZ 文件和专为 RealityKit 制作的项目。 RealityKit 建立在 ARKit 之上,但使用实体。支持的格式是:

usdz, rcproject, 现实

let url = URL(fileURLWithPath: "path/to/MyEntity.usdz")
let entity = try? Entity.load(contentsOf: url)

ARKit 可以使用 MDLAsset 加载更多文件类型,但也非常有限。它像 SceneKit 一样使用 SCNNode。因此,您可以加载到 SceneKit 中的所有内容都可以在 ARKit 中使用。 MDLAsset 支持:

abc, usd, usda, usdc, usdz, ply, obj, stl

let url = URL(fileURLWithPath: "path/to/MyScene.usdz")
let asset = MDLAsset(url: url)
asset.loadTextures()
let scene = SCNScene(mdlAsset: asset)
return scene.rootNode.flattenedClone()

有一种方法可以使用 AssimpKit 加载其他类型的模型 - https://github.com/dmsurti/AssimpKit。您可以加载场景并克隆根节点(SCNNode),然后可以在 ARKit 中使用。

AssimpKit 是第 3 方库,您可以在运行时使用 convert/import 将许多文件类型导入 SceneKit。支持的类型有:

3d, 3ds, ac, b3d, bvh, cob, dae, dxf, ifc, irr, md2, md5mesh, md5anim, m3sd, nff, obj, off, mesh.xml, ply、q3o、q3s、原始、smd、stl、wrl、xgl、zgl、fbx、md3

如果支持 USDZ 和 RealityKit 项目还不够,您现在可能需要使用 ARKit。