现实工具包如何在运行时创建自定义网格?

3
RealityKit有很多有用的功能,例如内置网络多用户同步以支持共享世界,但我似乎找不到关于运行时网格/对象创建的文档。RealityKit具有一些基本的网格生成函数(盒子、球等),但我想在运行时创建自己的过程网格(顶点和索引),并且可能会像即时模式渲染一样在每帧重新生成它们。
首先,是否有一种方法可以做到这一点,或者RealityKit太封闭了,没有办法进行自定义渲染? 其次,是否有其他替代方案可以让我使用一些RealityKit的同步功能?例如,那部分是否只是我可以与ARKit 3一起使用的另一个库?它叫什么?我也想能够在用户设备之间同步任意数据,因此内置系统也将非常有用。
由于我目前没有支持beta软件的设备,所以无法真正测试这个问题。我正在尝试了解如果我得到必要的硬件,是否能够实现我的程序需求,但是文档很少。
2个回答

3

2022年2月

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

这些方法提供了创建MeshResource实例的方式 - 同步和异步 - 可以通过自己构建模型和实例,或者通过提供您自己创建的MeshDescriptor列表来完成。

目前(我撰写此文时),苹果文档不存在,但是如果您查看生成的Swift接口,API本身已经有相当好的文档。Max Cobb在Medium上撰写了一篇文章:Getting Started with RealityKit: Procedural Geometries,其中详细介绍了如何使用MeshDescriptor来描述表面网格,并提供了一个Swift包含有使用此技术的其他几何图形的swift package:RealityGeometries,可以轻松阅读以查看其实际应用示例。


1
据我所知,RealityKit 只能使用基本图形或 usdz 文件作为模型。您可以使用设备上的 ModelIO 生成 usdz 文件,但这对您的用例来说并不可行。
然而,同步已经内置在 ARKit 中,尽管当您不使用 RealityKit 时需要做更多的工作。
  1. 在设备之间创建一个MultipeerConnectivity 会话(这是您需要为RealityKit做的事情)。
  2. 配置您的 ARSession 并设置 isCollaborationEnabled,使您的会话输出 CollaborationDatasession(_:didOutputCollaborationData:) 委托回调中。
  3. 使用您的 MultipeerConnectivity 会话发送此数据。
  4. 接收其他用户的数据时,使用 update(with:) 将其集成到您的会话中。
要在用户之间发送任意信息,您可以通过 MultipeerConnectivity 独立于 ARKit 发送它们,或者使用自定义的 ARAnchors,这是处理位置数据时的首选选项,例如当用户在特定位置放置对象时。
与直接添加对象(例如使用 SceneKit 中的 scene.rootNode.addChildNode())不同,您需要创建一个带有添加模型所需所有信息的特殊 ARAnchor 子类,并将其添加到您的会话中。 然后,在 rendered(_:didAdd:forAnchor:) 回调中添加对象。这样做的好处是更好地跟踪您的对象(因为您已经向位置添加了一个锚点,指示给 ARKit 应该记住该位置),并且您不需要为多用户体验做任何特殊处理,因为 ARKit 为手动添加的锚点以及自动添加的锚点(例如当它接收到协作数据时)都调用 rendered(_:didAdd:forAnchor:) 方法。

嗯,听起来最好是将ARKit 3与其他API一起使用。对于刚开始的人来说,这是很多东西需要理解的。是否有任何可用的代码示例,可以显示AR和任意数据同步?此外,RealityKit中吸引人的一点是对象遮挡,它被实现为材料。据您所知,我仍然可以使用该功能吗?我的理解是它只适用于RealityKit。对于渲染,似乎我需要自己做Metal系统,但我希望避免这样做。 - synchronizer
如果我需要使用自己的Metal渲染器并创建动态网格/缓冲区,那么不使用ARAnchors会更有意义吧? - synchronizer
编辑:我猜这解决了遮挡问题:https://developer.apple.com/documentation/arkit/effecting_people_occlusion_in_custom_renderers 但它并没有展示如何在自定义渲染器中使用人物遮挡。看到处理任意数据和渲染的最小示例仍然是好的。 - synchronizer
我已经阅读过MultipeerConnectivity在过去是不稳定的。https://www.reddit.com/r/iOSProgramming/comments/40tllq/question_does_anyone_know_how_to_sync_data/ 这个问题有所改善吗?它是否足够快以实时流传输数据(例如来自陀螺仪的数据)? - synchronizer
2
没问题。你可以看看去年WWDC的这个会话,它展示了一个完全基于MultipeerConnectivity构建的AR游戏。 - jlsiewert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接