首页 > 解决方案 > RealityKit 如何在运行时创建自定义网格?

问题描述

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

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

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

标签: renderingarkitmeshprocedural-generationrealitykit

解决方案


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

然而,同步是内置的,ARKit尽管当您不使用RealityKit.

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

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


推荐阅读