锚点示例
此示例演示了如何创建和销毁本地锚点,以准确跟踪现实世界中的一个点。有关锚点的基本信息以及 AR Foundation 的 AR Anchor Manager 组件的功能,请参考 Unity 文档。要使用此功能,需要在 OpenXR 插件设置中启用该选项,路径为:项目设置 > XR 插件管理 > OpenXR (> Android 标签)。
示例工作原理
首先,请确保在 OpenXR 项目设置中启用了空间锚点功能。
为了放置锚点,一个透明的放置工具将浮动在摄像机中心,距离为 1 米。如果启用了“在表面上放置锚点”切换按钮,每帧都会从头部中心向前发射一条射线,以确定放置工具相对于现实世界平面的定位。如果检测到碰撞,放置工具会变为黄色。然后,点击主控制器上的触控板或与可见的 UI 面板上的凝视交互(如果选中凝视交互器),将会实例化一个空的 GameObject 和一个 ARAnchor GameObject。空的 GameObject 具有一个透明的工具网格,并由 AR Session 进行跟踪。AR 锚点工具将通过 ARAnchorManager 的 anchorsChanged 事件进行更新,以表示其跟踪状态。
销毁所有锚点
通过点击 UI 中的“销毁所有锚点”按钮,可以销毁所有锚点和工具。为了防止在所有内容删除后再次使用“选择”按钮创建新的锚点,删除命令会有延迟发出。
Spaces 锚点存储
通过在 AR Anchor Manager 旁边添加 Spaces Anchor Store 组件,可以将锚点本地保存,以便在后续会话中识别和跟踪。该组件提供了以下 API,用于加载和保存锚点、删除保存的锚点以及清除本地锚点存储。
在这部分信息迁移到脚本 API 之前,以下是这些方法的简要说明:
● ClearStore
○ 清除本地锚点存储。
● SaveAnchor
○ 通过指定的名称或生成的哈希值保存 AR Anchor 对象,保存完成后可以调用回调函数。
● SaveAnchorWithResult
通过指定的名称或生成的哈希值保存 AR Anchor 对象,保存完成后可以调用回调函数。
● SaveAnchorResult 的可能值包括:
○ PENDING: 锚点待保存。无法正常查看,请使用 ARAnchor.pending 进行检查。
○ SAVED: 成功保存到本地存储中。
○ FAILURE_RUNTIME_ERROR: 由于运行时错误,未能保存到本地存储中。
○ FAILURE_STORE_NOT_LOADED: 由于 Spaces Anchor Store 加载失败,未能保存到本地存储中。
○ FAILURE_INSUFFICIENT_QUALITY: 由于环境地图质量不足,未能保存到本地存储中。
● DeleteSavedAnchor
通过名称从本地存储中删除已保存的锚点。
● LoadSavedAnchor
○ 从本地存储中加载锚点,并尝试在场景中定位该锚点。如果找到锚点,将实例化一个 AR Anchor 对象。加载的锚点将在 ARAnchorManager 的 anchorsChanged 事件中列为已添加。保存的锚点名称可以通过 GetSavedAnchorNames 方法获取。保存完成后可以调用回调函数。
● LoadAllSavedAnchors
从存储中加载所有锚点,并尝试在场景中定位它们。与 LoadSavedAnchor 方法类似,识别到的锚点将实例化为 AR Anchor 对象。
● GetSavedAnchorNames
返回所有已保存锚点的名称。
● GetSavedAnchorNameFromARAnchor
○ 如果跟踪到的 AR Anchor 对象是之前保存的,方法将返回其名称;否则返回空字符串。此方法可用于检查一个锚点是否为已保存的锚点。
在示例中保存、删除和加载锚点
通过启用“将新锚点保存到本地存储”选项,每当创建新的锚点时,它都会被保存到本地应用存储中。这意味着,只要场景中有 AR Anchor Manager,该锚点就可以像其他常规锚点一样被重新创建和跟踪。为了区分常规锚点和已保存的锚点,在锚点的中心会生成一个额外的立方体网格。如果立方体是红色,表示该锚点未被跟踪;如果是白色,则表示正在跟踪。点击“加载所有已保存的锚点”将从本地存储中加载所有锚点,并尝试在场景中定位它们。点击“清除存储”将删除所有保存在本地存储中的锚点,但不会影响从存储中加载的现有锚点。