ARAnchor 和 AnchorEntity 有什么区别?

eiv*_*dml 9 augmented-reality swift arkit realitykit

我目前正在用 RealityKit 做一些实验。

我一直在看一些示例代码,我有点困惑之间的差异ARAnchorAnchorEntity,当使用一个比其他。

到目前为止,我知道:

  • 两者都是描述现实世界中位置的锚点。
  • AnchorEntity也可以将 otherEntity作为子项,因此您可以将模型对象直接添加到锚点。你不能用 来做到这一点ARAnchor,你必须“手动”将模型对象添加到rootNode,并使用锚的位置正确放置它。
  • 在文档中它说 ARKit 使用添加ARAnchor来优化锚点周围区域的跟踪。的文档AnchorEntity没有指定这一点。

现在我将一个AnchorEntity作为“根节点”添加到会话中,因为它使用起来更简单,所以我可以简单地将模型作为子项直接添加到这个锚点。但随后我还在ARAnchor场景的锚点中添加了一个位于相同位置的 ,以增强围绕该点的跟踪。这是必要的吗?

问:谁能帮我弄清楚这两者的区别和用例?

ARG*_*Geo 15

更新时间:2021 年 4 月 3 日


ARAnchorclass 和AnchorEntityclass 都是为相同的神圣目的而制作的——将 3D 内容绑定到您的现实世界对象。

RealityKitAnchorEntity极大地扩展了 ARKit 的功能ARAnchor。这两者之间最重要的区别是AnchorEntity自动跟踪现实世界的目标,但ARAnchor需要renderer(...)session(...)实例方法来实现这一点。还要考虑到集合ARAnchors存储在 ARSession 中,而集合AnchorEntities存储在场景中。

以下是层次差异:

在此处输入图片说明

RealityKit 的主要优点是能够同时使用不同的 AnchorEntities,例如.plane.image.object

如您所知,在 ARKit 中,您只能在当前会话中运行一个配置:World、Image 或 Object。然而,在 ARKit 中有一个例外——你可以同时运行两个配置——WorldTracking 和 FaceTracking(但第一个必须是driver,另一个必须是driven)。


苹果开发者文档说:

在 RealityKit 框架中,您使用一个AnchorEntity实例作为实体层次结构的根,并将其添加到anchors collectionScene 实例中。这使 ARKit 能够将锚实体及其所有层次结构的后代放置到现实世界中。除了锚实体从Entity类继承的组件之外,锚实体还符合HasAnchoring协议,给它一个AnchoringComponent实例。

AnchorEntity 具有三个构建块:

  • 变换组件 (包含平移、旋转和缩放的变换矩阵)
  • 同步组件 (用于多用户体验的实体同步数据)
  • 锚定组件 (允许选择一种锚点 –world,bodyimage


所有实体都Synchronization component可以帮助组织协作会话

在此处输入图片说明


AnchorEntity有九种特定的锚点类型,用于九种不同的目的

  • 锚点
    • 帮助实现 10 个 ARKit 锚点,包括 ARGeoAnchor 和 ARAppClipCodeAnchor
  • 身体
  • 相机
  • 图片
  • 目的
  • 飞机
  • 世界
  • 光线投射结果


您可以同时使用这两个类ARAnchor,并AnchorEntity在您的应用程序。或者你可以只使用AnchorEntityclass,因为它已经足够了。

有关其他信息ARAnchor,并 AnchorEntity请看看这篇文章

  • 谢谢你很好的解释!但是这个呢:_“在文档中它说 ARKit 使用添加的 ARAnchor 来优化锚点周围区域的跟踪。AnchorEntity 的文档没有指定这一点。”_?AnchorEntity 是否也会进行此优化,或者我应该在放置对象的位置添加两种锚点类型以获得最佳结果? (2认同)
  • (抱歉@eivindml,我之前没有注意到您的评论)您不需要在场景中添加两种类型的锚点。您只需要一种类型:ARKit 的 ARAnchor 或 RealityKit 的 AnchorEntity。两个模块的锚点不仅优化了跟踪,还使固定在其上的物体更加稳定。 (2认同)