3

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

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

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

4

2 回答 2

1

据我所知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:)手动添加锚点和自动添加锚点的方法,例如当它接收到协作数据时。

于 2019-08-09T07:17:58.133 回答
1

2022 年 2 月

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

这些提供了创建MeshResource实例的方法 - 同步和异步 - 要么自己构建模型和实例,要么提供MeshDescriptor你自己创建的列表。

Apple 文档(在我写这篇文章时)不存在,但如果您查看生成的 swift 接口,API 本身的文档记录相当完善。Max Cobb 有一篇文章(在 Medium 上):RealityKit 入门:程序几何,其中介绍了如何使用 MeshDescriptor 来描述表面网格,并且还有一个 swift 包,其中包含一些使用这种技术RealityGeometries的额外几何:不难阅读以查看实际使用它的示例。

于 2022-02-05T19:04:06.933 回答