本地锚点

锚点示例

这个示例演示了如何创建和销毁本地以及保存的锚点,以准确跟踪现实世界中的某个点,有关锚点的基本信息以及 Unreal Engine 中的 ARPin 和 ARPin 本地存储的工作原理,请参阅 Unreal Engine 文档。要使用此功能,必须在 OpenXR 插件设置中启用它,设置位置在 项目设置 > Snapdragon Spaces 插件。

 

示例工作原理

默认情况下,当打开示例时,会在相机前方 1 米处显示一个白色的指示器。如果在相机前方检测到碰撞,指示器将变为黄色,并移动到碰撞位置。在此示例中,用户可以通过两种方式将指示器放置在当前位置:点击控制器上的选择按钮,或者在启用注视控制器时使用浮动 UI 中的“创建”按钮

 

当指示器被放置时,首先会显示一个简单的白色指示器,表示它不是 ARPin 也没有被跟踪。如果底层功能报告一个被跟踪的锚点,指示器会变为红色、绿色和蓝色,并将一个 ARPin 附加到对象上。如果被跟踪的指示器不再跟踪或 ARPin 创建失败,指示器会变为红色。如果锚点已保存到本地锚点存储中,指示器中心会显示一个立方体网格组件。

 

用户在此示例中可以使用的选项包括:

● 销毁所有锚点:一个按钮,用于删除世界中所有本地指示器。此操作不会删除存储中的已保存锚点。

● 加载所有已保存的锚点:一个按钮,用于加载所有已保存的锚点,并将它们显示为世界中的本地指示器。

● 清空存储:一个按钮,用于从存储中移除所有已保存的锚点。此操作不会清除世界中的本地指示器。

● 将创建的锚点保存到本地存储:一个复选框,用于在创建时将本地指示器保存为已保存的锚点。

 

图片1.png


锚点管理

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 的创建将会失败。


图片2.png


如果指示器启用了 bAutoSave 变量,则在分配 ARPin 后,锚点将自动保存到锚点存储中。锚点保存过程是异步进行的。OnSpacesAnchorIsSavedInfoResult 委托用于指示保存是否成功,调用可能返回以下结果:

● 成功:锚点已成功保存到存储中。

● 一般失败:由于 OpenXR 失败,锚点未能保存。

● 质量不足失败:由于环境质量不足,锚点未能保存。

● 锚点未创建:由于锚点创建尚未完成,锚点未能保存。

● 锚点存储失败:由于锚点存储无效,锚点未能保存。

● 锚点无效:由于锚点值无效,锚点未能保存。

● 锚点已销毁:由于锚点正在等待销毁,锚点未能保存。

 

在蓝图的每次 tick 中,会处理 Pin 状态的管理。

 

最后,当指示器被销毁且存在有效的 ARPin 时,会手动移除 Pin。


加载和保存锚点


警告!

确保检查环境,以生成更好的跟踪地图,从而减少保存和加载时间。一次性保存多个锚点会阻塞主线程,因此应使用回调来保存任何后续的锚点。


OpenXR 接口提供了加载和保存 ARPins 到本地存储的功能。在使用 Snapdragon Spaces 插件时,这些操作会在异步线程中进行,以避免应用程序冻结。因此,开发人员需要注意:

● 从本地存储加载 ARPins

○ 从本地存储中加载所有 ARPins。该节点返回一个包含名称和 ARPins 的映射。此时,这些 ARPins 尚未加载,其状态将显示为“未跟踪”,直到异步线程完成加载。当加载完成后,ARPin 的状态将自动更新。


图片3.png

 

● 将 ARPin 保存到本地存储

○ 将 ARPin 保存到本地存储。此节点使用名称作为 ID 来保存 ARPin(该名称会在加载节点中返回)。开发人员应使用 On Spaces Anchor Is Saved 委托来了解保存操作是否成功完成。

 

图片4.png


Snapdragon Spaces 插件提供了额外的功能来帮助管理蓝图中的已保存锚点:

● 获取已保存锚点名称

○ 返回存储中所有已保存锚点的名称。

● 获取 ARPin 的已保存锚点名称

○ 返回用于在存储中保存 ARPin 的名称。

 

图片5.png