RealityKit深入浅出之AnchorEntity

概述

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的初始化函数

RealityKit深入浅出之AnchorEntity

Anchor Type

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

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

请看下图,来自WWDC2019-605

RealityKit深入浅出之AnchorEntity

与AnchorEntity相关的protocol和struct

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

HasAnchoring

此协议用于在AR场景中将虚拟内容锚定到显现国际的方针。该协议承继自Entity,因而它也具有Entity的所有特性。主要的协议特点和办法包含:

  • anchoring特点:这是一个用于获取和设置实体锚定信息的特点。经过这个特点,您能够装备实体如何与AR国际中的实际国际方针相关。
  • anchorIdentifier特点:这是一个可选的UUID特点,用于获取与锚定实体相关的AR锚点的标识符。假如实体当时没有被锚定,它将返回nil
  • reanchor(_:preservingWorldTransform:)办法:这个办法答应您更改实体的锚定方法。您能够指定AnchoringComponent.Target来描绘锚定的方法,并挑选是否保存当时的国际空间方位或运用相对于前一个锚点的方位。

RealityKit深入浅出之AnchorEntity

AnchoringComponent

AnchoringComponent 是一个用于描绘虚拟方针如何与实际国际方针进行锚定的组件。这个组件在增强实际(AR)使用程序中操控虚拟方针的方位,将它们准确放置在实际国际中的特定方位上。下面是对 AnchoringComponent的具体解析:

  1. AnchoringComponent.Target 枚举

    • 这是一个嵌套AnchoringComponent 中的枚举类型
    • 枚举界说了不同类型的实际国际方针,虚拟方针能够锚定到这些方针上。例如,枚举能够包含水平平面、笔直平面、图画等类型。
  2. target 特点

    • 这是一个存储特点,用于表明锚定组件的方针。
    • 它指示虚拟方针应该锚定到哪种类型的实际国际方针上,具体取决于 AnchoringComponent.Target 枚举的值。
  3. init(_:) 初始化办法

    • 这个初始化办法接受一个 AnchoringComponent.Target 参数,用于指定虚拟方针应该锚定到哪种类型的实际国际方针上。
    • 经过调用这个初始化办法,您能够为虚拟方针创立一个具有特定锚定方针的 AnchoringComponent
  4. == 运算符重载

    • 这个运算符重载答应您比较两个 AnchoringComponent 值,以确认它们是否相等。
    • 假如两个 AnchoringComponent 具有相同的锚定方针,那么它们被认为是相等的。

RealityKit深入浅出之AnchorEntity

AnchoringComponent 能够在AR场景中准确操控虚拟方针的方位和锚定方法。经过挑选不同的锚定方针,能够实现各种AR使用场景,如将虚拟方针放置在水平表面上、笔直墙壁上或特定的图画上。这种灵活性使开发AR使用变得愈加真实。