RealityKit 如何在运行时创建自定义网格?
RealityKit How to create custom meshes at runtime?
RealityKit 有很多有用的功能,比如通过网络内置的多用户同步来支持共享世界,但我似乎找不到太多关于在运行时创建网格/对象的文档。 RealityKit 有一些基本的网格生成函数(盒子、球体等),但我想在运行时创建我自己的程序网格(顶点和索引),并可能在每一帧即时模式渲染样式中重新生成它们。
首先,有没有办法做到这一点,或者 RealityKit 是否过于封闭而无法进行大量自定义渲染?
其次,是否有替代解决方案可以让我使用 RealityKit 的一些同步功能?例如,那部分真的只是我可以与 ARKit 3 一起使用的另一个库吗?这叫什么?我也希望能够在用户的设备之间同步任意数据,所以内置系统也会有帮助。
我无法真正测试这个,因为我目前没有任何设备可以支持测试版软件。我正在尝试了解如果我确实获得了必要的硬件,我是否能够为我的程序做我想做的事情,但文档很少。
据我所知RealityKit
只能使用图元或usdz
文件作为模型。虽然您可以在设备上使用 ModelIO
生成 usdz
文件,但这对您的用例不可行。
然而,同步是内置于 ARKit
中的,尽管在不使用 RealityKit
时您必须做更多的工作。
- 在设备之间创建一个
MultipeerConnectivity
会话(这也是 RealityKit
需要做的事情)
- 配置您的 ARSession 并设置
isCollborationEnabled
which makes your session output CollaborationData
in the session(_:didOutputCollaborationData:)
委托回调。
- 使用您的
MultipeerConnectivity
会话发送此数据。
- 当从其他用户接收数据时,使用
update(with:)
将其集成到您的会话中
要在用户之间发送任意信息,您可以通过 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
不难通读以查看实际使用它的示例。
RealityKit 有很多有用的功能,比如通过网络内置的多用户同步来支持共享世界,但我似乎找不到太多关于在运行时创建网格/对象的文档。 RealityKit 有一些基本的网格生成函数(盒子、球体等),但我想在运行时创建我自己的程序网格(顶点和索引),并可能在每一帧即时模式渲染样式中重新生成它们。
首先,有没有办法做到这一点,或者 RealityKit 是否过于封闭而无法进行大量自定义渲染? 其次,是否有替代解决方案可以让我使用 RealityKit 的一些同步功能?例如,那部分真的只是我可以与 ARKit 3 一起使用的另一个库吗?这叫什么?我也希望能够在用户的设备之间同步任意数据,所以内置系统也会有帮助。
我无法真正测试这个,因为我目前没有任何设备可以支持测试版软件。我正在尝试了解如果我确实获得了必要的硬件,我是否能够为我的程序做我想做的事情,但文档很少。
据我所知RealityKit
只能使用图元或usdz
文件作为模型。虽然您可以在设备上使用 ModelIO
生成 usdz
文件,但这对您的用例不可行。
然而,同步是内置于 ARKit
中的,尽管在不使用 RealityKit
时您必须做更多的工作。
- 在设备之间创建一个
MultipeerConnectivity
会话(这也是RealityKit
需要做的事情) - 配置您的 ARSession 并设置
isCollborationEnabled
which makes your session outputCollaborationData
in thesession(_:didOutputCollaborationData:)
委托回调。 - 使用您的
MultipeerConnectivity
会话发送此数据。 - 当从其他用户接收数据时,使用
update(with:)
将其集成到您的会话中
要在用户之间发送任意信息,您可以通过 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
不难通读以查看实际使用它的示例。