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

Posted

技术标签:

【中文标题】如何在运行时将 3D 内容加载到 RealityKit 应用程序中?【英文标题】:How to load 3D content into RealityKit Apps at runtime? 【发布时间】:2021-08-31 13:08:05 【问题描述】:

出于特定目的,我必须在运行时将 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/ 但就我而言,它并不是真正可用的,因为它依赖于基于 Mac 的 3D 内容预编译,并且使用的是 SceneKit 而不是 RealityKit。 我还听说过 Model I/O (https://developer.apple.com/documentation/modelio) 这可能是一种解决方案,但我的知识不足以评估它。我怀疑它是否可用于 RealityKit 或仅适用于 SceneKit。

如果我混淆了 SceneKit/RealityKit/ARKit,请纠正我。

【问题讨论】:

【参考方案1】:

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 一样使用 SCNNodes。因此,您能够加载到 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 方库,可用于在运行时将多种文件类型转换/导入到 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。

【讨论】:

以上是关于如何在运行时将 3D 内容加载到 RealityKit 应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时将图像加载到 WPF?

如何在运行时将代码加载到 Android 中

如何将 JTable 的内容保存到文件中,然后在需要时将它们加载回来? [关闭]

如何在.NET 运行时将文件夹添加到程序集搜索路径?

在运行时将图像加载到对话框图片控件中

在运行时将新表重新加载/替换到 WPF DataGrid 中