我目前正在使用 RealityKit 做一些实验。
我一直在查看一些示例代码,我对
ARAnchor
和 AnchorEntity
之间的差异以及何时使用其中一个感到有点困惑。
到目前为止我知道:
AnchorEntity
还可以将其他 Entity
作为子级,因此您可以将模型对象直接添加到锚点。您无法使用 ARAnchor
执行此操作,您必须“手动”将模型对象添加到 rootNode
,并使用正确放置锚点的位置。ARAnchor
来优化锚点周围区域的跟踪。 AnchorEntity
的文档没有指定这一点。现在,我将
AnchorEntity
添加到会话中作为“根节点”,因为它使用起来更简单,这样我就可以简单地将模型作为子项直接添加到该锚点。但随后我还向场景的锚点添加了位于同一位置的 ARAnchor
,以增强围绕该点的跟踪。 这个有必要吗?
更新日期:2023 年 11 月 26 日。
ARAnchor
和 AnchorEntity
类都是为了同一个神圣目的而创建的——将 3D 模型与现实世界的对象联系起来。
RealityKit
AnchorEntity
极大地扩展了 ARKit ARAnchor
的功能。这两者之间最重要的区别是 AnchorEntity
自动跟踪现实世界目标,但是当您使用 RealityKit 时 ARAnchor
需要 session(...)
实例方法(如果使用 SceneKit,则需要 renderer(...)
实例方法)来完成它。考虑到 ARAnchors
的集合存储在 ARSession 对象中,而 AnchorEntities
的集合存储在 Scene 中。
此外,生成 ARAchors 需要手动会话配置,而生成 AnchorEntities 需要最少的开发人员参与。
iOS AR场景的层级差异:
RealityKit 的主要优点是能够同时使用不同的 AnchorEntities,例如
.plane
、.body
或 .object
。 RealityKit 中有 automaticallyConfigureSession
实例属性。启用后,ARView
会自动运行 ARSession
,其配置将根据您的相机模式和场景锚点进行更新。禁用后,需要使用您自己的配置手动运行会话。
arView.automaticallyConfigureSession = true // default
如您所知,在 ARKit 中,您只能在当前会话中运行一个配置:World、Body 或 Geo。然而,ARKit 中有一个例外 - 您可以同时运行两个配置 - FaceTracking 和 WorldTracking(其中一个必须是driver,另一个必须是driven)。
let config = ARFaceTrackingConfiguration()
config.isWorldTrackingEnabled = true
arView.session.run(config)
Apple 开发者文档说:
在 RealityKit 框架中,您使用
实例作为实体层次结构的根,并将其添加到场景实例的AnchorEntity
中。这使得 ARKit 能够将锚实体及其所有分层后代放置到现实世界中。除了锚点实体继承自anchors collection
类的组件之外,锚点实体还符合Entity
协议,为其提供一个HasAnchoring
实例。AnchoringComponent
AnchorEntity
具有三个构建块:
world
、body
或 image
)所有实体都有
Synchronization component
帮助组织 协作会议。
在 iOS 版 RealityKit 中,
AnchorEntity
对象具有适用于 11 种不同场景的 11 种特定锚点类型(但请记住,在 macOS 版 RealityKit 中,您只能使用两种类型的锚点 – AnchorEntity(world: .zero)
和 AnchorEntity(.camera)
):
您可以在应用程序中同时使用对象
ARAnchor
和 AnchorEntity
。
您可以在此
此帖子中找到有关
ARAnchor
和 AnchorEntity
的更多信息。