RealityKit 如何在运行时创建自定义网格?

RealityKit How to create custom meshes at runtime?

RealityKit 有很多有用的功能,比如通过网络内置的多用户同步来支持共享世界,但我似乎找不到太多关于在运行时创建网格/对象的文档。 RealityKit 有一些基本的网格生成函数(盒子、球体等),但我想在运行时创建我自己的程序网格(顶点和索引),并可能在每一帧即时模式渲染样式中重新生成它们。

首先,有没有办法做到这一点,或者 RealityKit 是否过于封闭而无法进行大量自定义渲染? 其次,是否有替代解决方案可以让我使用 RealityKit 的一些同步功能?例如,那部分真的只是我可以与 ARKit 3 一起使用的另一个库吗?这叫什么?我也希望能够在用户的设备之间同步任意数据,所以内置系统也会有帮助。

我无法真正测试这个,因为我目前没有任何设备可以支持测试版软件。我正在尝试了解如果我确实获得了必要的硬件,我是否能够为我的程序做我想做的事情,但文档很少。

据我所知RealityKit只能使用图元或usdz文件作为模型。虽然您可以在设备上使用 ModelIO 生成 usdz 文件,但这对您的用例不可行。

然而,同步是内置于 ARKit 中的,尽管在不使用 RealityKit 时您必须做更多的工作。

  1. 在设备之间创建一个 MultipeerConnectivity 会话(这也是 RealityKit 需要做的事情)
  2. 配置您的 ARSession 并设置 isCollborationEnabled which makes your session output CollaborationData in the session(_:didOutputCollaborationData:) 委托回调。
  3. 使用您的 MultipeerConnectivity 会话发送此数据。
  4. 当从其他用户接收数据时,使用 update(with:)
  5. 将其集成到您的会话中

要在用户之间发送任意信息,您可以通过 MultipeerConnectivity 独立于 ARKit 发送它们,也可以使用自定义 ARAnchors,这是处理位置数据时的首选选项,例如当用户将对象放置在特定位置时。
不是直接添加对象(通过在 SceneKit 中使用 scene.rootNode.addChildNode() 之类的东西,而是创建一个特殊的 ARAnchor 子类,其中包含添加模型并将其添加到会话中所需的所有信息。 然后在 rendered(_:didAdd:forAnchor:) 回调中添加对象。这样做的好处是可以更好地跟踪您的对象(因为您在该位置添加了一个锚点,指示 ARKit 它应该记住该位置)并且您不需要为多用户体验做任何特殊的事情,因为ARKit 为手动添加的锚点和自动添加的锚点调用 rendered(_:didAdd:forAnchor:) 方法,例如当它接收协作数据时。

2022 年 2 月

从 macOS 12 / iOS15 开始,RealityKit 包括 API 以允许您提供自己的程序生成的网格,主要通过以下方法:

这些提供了创建您自己创建的 MeshResource instances - synchronously and asynchronously - either constructing the models and instances yourself, or by providing a list of MeshDescriptor 的方法。

Apple 文档(在我撰写本文时)是 non-existent,但如果您查看生成的 swift 界面,API 本身的文档记录相当完备。 Max Cobb 有一篇文章(在 Medium 上):Getting Started with RealityKit: Procedural Geometries that goes into some description of how to use a MeshDescriptor to describe a surface mesh, and also has a swift package with some additional geometries that use this technique: RealityGeometries 不难通读以查看实际使用它的示例。