RealityKit深入浅出之AnchorEntity

1,875 阅读5分钟

Reality-ARView.008.jpeg

概述

RealityKit的Anchor是基于ARKit创建并与之整合的产物,所以可以使用他的完整功能集,要定义锚点的内容,首先要创建一个锚点,明确想要的锚点类型,然后把锚点实体添加在scene中,一旦ARKit发现合适的目标,AnchorEntity就会自动跟踪,让创建的虚拟内容出现在现实世界并随着你设备的移动而移动

AnchorEntity的结构

协议HasAnchoring与父类Entity

AnchorEntity用于将Entity绑定到场景中。使用AnchorEntity来控制RealityKit如何将虚拟对象放入场景中。AnchorEntity遵守HasAnchoring协议,因此具有AnchoringComponent实例。关于AnchoringCompoent后面会找机会与Component详细说明,此篇内容不包含具体内容,只做结构拆解。

@available(macOS 10.15, iOS 13.0, *)
@MainActor @preconcurrency public class AnchorEntity : Entity, HasAnchoring { ... }

直接将锚点实体添加到场景的Scene/anchors集合中,或通过将它们添加到场景中的其他实体的Entity/children集合中的任何位置。因为AnchorEntityEntity的子类,所以可以将锚点实体作为任何其他实体的子级。当场景更新时,RealityKit可能会移动锚点实体,即使代码不修改其Entity/transform属性,锚点实体的位置和旋转可能相对于其父实体发生变化。

AnchoringComponent组件

RealityKit根据锚定组件的AnchoringComponent/target属性来放置锚点。例如,可以配置一个锚点实体,让它在AR场景中检测到合适的水平平面(如桌子或地板)时自动放置。

//关于HasAnchoring协议内定义的属性
@available(macOS 10.15, iOS 13.0, *)
extension HasAnchoring {

    @available(macOS 10.15, iOS 13.0, macCatalyst 14.0, *)
    @MainActor public var anchoring: AnchoringComponent

    ...
}

//定义一个检测水平平面设置AnchorEntity的例子
//这个例子相对简单,检测水平位置,然后设置0.5*0.5的锚点(单位是m)
let anchor = AnchorEntity(plane: .horizontal, minimumBounds: [0.5, 0.5])

如果RealityKit无法检测到适当的位置,某些锚点实体可能根本不会显示在场景中。例如,具有image目标的锚点实体在现实世界中检测到指定图像之前不会显示在场景中。可以在RealityKit场景中拥有多个锚点:

  • 一个锚点可以将小汽车放在水平表面上,如桌子
  • 一个锚点可以将信息性文本气泡绑定到同一场景中的图像上,比如说小汽车

AnchorEntity的初始化函数

Reality-ARView.008.jpeg

Anchor Type

RealityKit支持多种类型的Anchor,以满足不同的AR应用需求。一些常见的Anchor类型包括:

  • ARPlaneAnchor(平面锚点) :用于检测和跟踪平面,例如地板、桌面等。
  • ARImageAnchor(图像锚点) :用于在检测到特定图像时放置虚拟内容。
  • ARFaceAnchor(面部锚点) :用于跟踪用户的面部,以便在面部上放置虚拟化妆或其他效果。
  • ARGeoAnchor(地理锚点) :用于将虚拟内容与地理位置相关联,例如在城市街道上放置虚拟标志。
  • ...

请看下图,来自WWDC2019-605 截屏2023-09-22 17.38.09.png

与AnchorEntity相关的protocol和struct

包括但不限于HasAnchoring、Entity、AnchoringComponent等

HasAnchoring

此协议用于在AR场景中将虚拟内容锚定到显示世界的对象。该协议继承自Entity,因此它也具有Entity的所有特性。主要的协议属性和方法包括:

  • anchoring属性:这是一个用于获取和设置实体锚定信息的属性。通过这个属性,您可以配置实体如何与AR世界中的现实世界对象关联。
  • anchorIdentifier属性:这是一个可选的UUID属性,用于获取与锚定实体关联的AR锚点的标识符。如果实体当前没有被锚定,它将返回nil
  • reanchor(_:preservingWorldTransform:)方法:这个方法允许您更改实体的锚定方式。您可以指定AnchoringComponent.Target来描述锚定的方式,并选择是否保留当前的世界空间位置或使用相对于前一个锚点的位置。

Reality-ARView.010.jpeg

AnchoringComponent

AnchoringComponent 是一个用于描述虚拟对象如何与现实世界对象进行锚定的组件。这个组件在增强现实(AR)应用程序中控制虚拟对象的位置,将它们精确放置在现实世界中的特定位置上。下面是对 AnchoringComponent的详细解析:

  1. AnchoringComponent.Target 枚举

    • 这是一个嵌套在 AnchoringComponent 中的枚举类型。
    • 枚举定义了不同类型的现实世界对象,虚拟对象可以锚定到这些对象上。例如,枚举可以包括水平平面、垂直平面、图像等类型。
  2. target 属性

    • 这是一个存储属性,用于表示锚定组件的目标。
    • 它指示虚拟对象应该锚定到哪种类型的现实世界对象上,具体取决于 AnchoringComponent.Target 枚举的值。
  3. init(_:) 初始化方法

    • 这个初始化方法接受一个 AnchoringComponent.Target 参数,用于指定虚拟对象应该锚定到哪种类型的现实世界对象上。
    • 通过调用这个初始化方法,您可以为虚拟对象创建一个具有特定锚定目标的 AnchoringComponent
  4. == 运算符重载

    • 这个运算符重载允许您比较两个 AnchoringComponent 值,以确定它们是否相等。
    • 如果两个 AnchoringComponent 具有相同的锚定目标,那么它们被认为是相等的。

Reality-ARView.011.jpeg

AnchoringComponent 可以在AR场景中精确控制虚拟对象的位置和锚定方式。通过选择不同的锚定目标,可以实现各种AR应用场景,如将虚拟对象放置在水平表面上、垂直墙壁上或特定的图像上。这种灵活性使开发AR应用变得更加真实。