锚点示例
这个示例演示了如何创建和销毁本地以及保存的锚点,以准确跟踪现实世界中的某个点,有关锚点的基本信息以及 Unreal Engine 中的 ARPin 和 ARPin 本地存储的工作原理,请参阅 Unreal Engine 文档。要使用此功能,必须在 OpenXR 插件设置中启用它,设置位置在 项目设置 > Snapdragon Spaces 插件。
示例工作原理
默认情况下,当打开示例时,会在相机前方 1 米处显示一个白色的指示器。如果在相机前方检测到碰撞,指示器将变为黄色,并移动到碰撞位置。在此示例中,用户可以通过两种方式将指示器放置在当前位置:点击控制器上的选择按钮,或者在启用注视控制器时使用浮动 UI 中的“创建”按钮。
当指示器被放置时,首先会显示一个简单的白色指示器,表示它不是 ARPin 也没有被跟踪。如果底层功能报告一个被跟踪的锚点,指示器会变为红色、绿色和蓝色,并将一个 ARPin 附加到对象上。如果被跟踪的指示器不再跟踪或 ARPin 创建失败,指示器会变为红色。如果锚点已保存到本地锚点存储中,指示器中心会显示一个立方体网格组件。
用户在此示例中可以使用的选项包括:
● 销毁所有锚点:一个按钮,用于删除世界中所有本地指示器。此操作不会删除存储中的已保存锚点。
● 加载所有已保存的锚点:一个按钮,用于加载所有已保存的锚点,并将它们显示为世界中的本地指示器。
● 清空存储:一个按钮,用于从存储中移除所有已保存的锚点。此操作不会清除世界中的本地指示器。
● 将创建的锚点保存到本地存储:一个复选框,用于在创建时将本地指示器保存为已保存的锚点。
锚点管理
BP_AnchorManager 蓝图(位于 SnapdragonSpacesSamples 内容 > SnapdragonSpaces > Samples > Anchor > Placeable)负责集中管理创建和销毁指示器的操作,该蓝图将事件绑定到角色,以便与示例进行交互(在这种情况下,是控制器上的选择点击)。
要启用和禁用空间锚点,必须使用 Toggle Spaces Feature 方法,并将 Spatial Anchor 作为功能选项。
在 BP_Pawn 中,添加了一个 SceneComponent 作为未放置指示器的根组件,开发人员可以自定义未放置指示器的一些选项:
● AnchorTag:定义在 BP_Pawn 中的 SceneComponent 上的标签名称,用于未放置指示器的根组件。
● DistanceGizmo:未放置指示器距离相机的距离。
要放置指示器,管理器会将指示器从根组件中分离,并使用其变换来创建 ARPin 指示器。
此外,你还可以学习如何在 Update Hit 函数中将锚点实现与命中测试结合起来。
指示器
BP_Gizmo 蓝图文件(位于 SnapdragonSpacesSamples 内容 > SnapdragonSpaces > Samples > Anchor > Placeable)负责创建 ARPin。这个操作使用了 PinComponent 节点,如下图所示。
警告! 对于 SnapdragonSpaces 插件,必须指定要固定的组件(Component to Pin)以及组件应被固定的变换(Pin to World Transform),如果这两个输入中的任何一个为空,ARPin 的创建将会失败。 |
如果指示器启用了 bAutoSave 变量,则在分配 ARPin 后,锚点将自动保存到锚点存储中。锚点保存过程是异步进行的。OnSpacesAnchorIsSavedInfoResult 委托用于指示保存是否成功,调用可能返回以下结果:
● 成功:锚点已成功保存到存储中。
● 一般失败:由于 OpenXR 失败,锚点未能保存。
● 质量不足失败:由于环境质量不足,锚点未能保存。
● 锚点未创建:由于锚点创建尚未完成,锚点未能保存。
● 锚点存储失败:由于锚点存储无效,锚点未能保存。
● 锚点无效:由于锚点值无效,锚点未能保存。
● 锚点已销毁:由于锚点正在等待销毁,锚点未能保存。
在蓝图的每次 tick 中,会处理 Pin 状态的管理。
最后,当指示器被销毁且存在有效的 ARPin 时,会手动移除 Pin。
加载和保存锚点
警告! 确保检查环境,以生成更好的跟踪地图,从而减少保存和加载时间。一次性保存多个锚点会阻塞主线程,因此应使用回调来保存任何后续的锚点。 |
OpenXR 接口提供了加载和保存 ARPins 到本地存储的功能。在使用 Snapdragon Spaces 插件时,这些操作会在异步线程中进行,以避免应用程序冻结。因此,开发人员需要注意:
● 从本地存储加载 ARPins
○ 从本地存储中加载所有 ARPins。该节点返回一个包含名称和 ARPins 的映射。此时,这些 ARPins 尚未加载,其状态将显示为“未跟踪”,直到异步线程完成加载。当加载完成后,ARPin 的状态将自动更新。
● 将 ARPin 保存到本地存储
○ 将 ARPin 保存到本地存储。此节点使用名称作为 ID 来保存 ARPin(该名称会在加载节点中返回)。开发人员应使用 On Spaces Anchor Is Saved 委托来了解保存操作是否成功完成。
Snapdragon Spaces 插件提供了额外的功能来帮助管理蓝图中的已保存锚点:
● 获取已保存锚点名称
○ 返回存储中所有已保存锚点的名称。
● 获取 ARPin 的已保存锚点名称
○ 返回用于在存储中保存 ARPin 的名称。