图像跟踪示例
此示例演示了如何检测和增强现实世界中的图像目标。有关图像跟踪的基本信息以及 AR Foundation 的 AR Tracked Image Manager 组件的功能,请参阅 Unity 文档。要使用此功能,必须在 OpenXR 插件设置中启用它,路径为 Project Settings > XR Plug-in Management > OpenXR (> Android Tab)。
示例工作原理
首先,确保在 OpenXR 项目设置中启用了图像跟踪功能。
提示! 你可以在“测试用图像目标”部分找到使用的参考图像。 |
图像目标通过 XR Reference Image Library 提供给底层 XR 插件。添加的图像需要有一个名称,这将有助于以后识别被跟踪的目标。此外,还需要将“Keep Texture at Runtime”标志设置为 true。这将使子系统能够将纹理数据传递给 Snapdragon Spaces Services 以进行跟踪。
此外,在示例中,图像目标的高度为 26 厘米(当打印为 DIN A4 或 US letter 尺寸时)。正确的尺寸对于准确的姿态估计和后续的增强现实放置至关重要。因此,启用“Specify Size”选项后,必须指定图像目标的实际尺寸。
在导入设置中,纹理的“读取/写入”标志应启用,并将格式设置为 RGB 24 位(也可能显示为 RGB8)。如果格式设置为“自动”,项目的图形设置可能会错误地指定格式。
将 ARTrackedImageManager 组件添加到 ARSessionOrigin GameObject 中,将启用 Snapdragon Spaces 包中的图像跟踪子系统。该组件提供了三个字段:一个用于之前创建的 RuntimeReferenceImageLibrary,一个用于指定最大移动图像数量,另一个用于定义在检测到跟踪图像时生成的预制体。所使用的预制体是一个指示跟踪图像方向的 gizmo。
通过订阅 ARTrackedImageManager 的方法以监听跟踪图像的变化,可以为跟踪图像的状态和位置设置相应的 UI 信息,如下方的简化代码示例所示。
警告! 为了使此示例正常工作,XR Reference Image Library 中设置的参考图像名称必须唯一。任何重复的名称会导致 _trackedImages 字典中的哈希码冲突。 |
可选的 Spaces Reference Image Configurator 组件也可以添加到与 ARTrackedImageManager 相同的 GameObject 上。该组件为每个跟踪图像提供了额外的配置选项。
Tracking Mode 字段允许为每个图像定义三种不同的跟踪模式之一:
● 动态(默认) - 动态模式每帧更新跟踪图像的位置,适用于移动和静态目标。如果找不到跟踪图像,则不会报告位置或姿态。相较于其他跟踪模式,此模式的功耗较高。如果没有找到 Spaces Reference Image Configurator 组件,所有跟踪图像将默认使用此模式。
● 静态 - 静态模式适用于已知为静态的图像,这样可以降低功耗并提高性能。例如,这些图像可能固定在地板或墙壁上。此模式适用于持续显示增强现实效果,即使图像不再可见。静态模式下的图像位置不会更新,无论图像是否移动或超出视线。
● 自适应 - 自适应模式适用于静态图像,但如果图像移动,会定期更新跟踪图像的姿态,大约每 5 帧更新一次。如果头戴显示器(HMD)移动了,图像姿态会根据显示刷新率进行调整。对于超出视线的图像,跟踪最终会丢失。此模式在功耗和跟踪精度之间取得平衡,适用于将保持固定位置的图像。
模式 | 添加 | 更新 | 移除 |
动态(默认) | 进入帧时 | 每帧更新 | 退出帧时 |
静态 | 进入帧时 | 不更新 | 新图像被跟踪 |
自适应 | 进入帧时 | 周期性更新(大约每 5 帧更新一次,图像移动时) | 退出帧时 |
在启动应用程序时,每个被跟踪的图像会初始使用在 Spaces Reference Image Configurator 组件中定义的跟踪模式,但如果需要,可以在运行时更新此值,如下面的简化示例代码所示。
运行时切换参考库
可以在运行时更换 AR Tracked Image Manager 使用的参考图像库,而无需切换场景,为实现这一点,请注意以下事项;
● 必须重新启动图像跟踪子系统以使库更改生效。这可以通过重新启用 AR Tracked Image Manager 组件来完成。
● 必须在 Spaces Reference Image Configurator 组件中重新同步新的库的跟踪模式,使用组件的 SyncTrackingModes 函数。需要提供一个包含参考图像名称和所需初始跟踪模式的 Dictionary<string, SpacesImageTrackingMode> 作为参数。
警告! 如果在更换库时未重新应用跟踪模式,则 Spaces Reference Image Configurator 的 SetTrackingModeForReferenceImage 函数在未找到先前库中的参考图像名称时会失败。 在这种情况下,动态模式将作为参考图像的默认跟踪模式。 |
下面的示例代码实现了一个 SwapTargetLibrary 函数,用于在运行时切换到不同的参考图像库。首先禁用 Tracked Image Manager 组件,然后在 Spaces Reference Image Configurator 组件的 SyncTrackingModes 函数中重新同步图像跟踪模式。参考图像名称和所需初始跟踪模式的 Dictionary<string, SpacesImageTrackingMode> 由辅助函数 CreateTrackingModesDictionary 提供。最后,将新的参考库应用于 AR Tracked Image Manager 组件,并重新启用该组件。