控制 Mega Go 跟踪过程
本文介绍了如何控制 Mega Go 跟踪过程中的各项功能和参数,以满足不同应用场景的需求。
开始之前
- 检查 我的定位功能可以使用了吗? 确认已下载正确地图。
tracker 的工作流程
tracker 的工作流程如下:
flowchart LR
subgraph startup_graph[启动]
direction TB
sstart((session 启动))
create[原生创建]
load(加载 target)
verify[试用校验]
init_g[[初始化]]
end
subgraph init_graph[初始化]
direction TB
init_{6DoF 初始化成功<br>或非 6DoF}
init[[本地跟踪初始化过程]]
detecting[[检测]]
tracking_g[[跟踪]]
end
subgraph tracking_graph[跟踪]
direction TB
tracking[[持续跟踪]]
end
subgraph stopping_graph[停止]
direction TB
unload(卸载 target)
dispose[原生销毁]
sstop([session 停止])
end
sstart --> create --> load --> verify --> init_g
init --> init_ --> |Yes| detecting --> tracking_g
unload --> dispose --> sstop
init_ --> |No| init
startup_graph --> init_graph
init_graph --> tracking_graph
tracking_graph --> stopping_graph
流程大致分为几个阶段:
- 启动:
- 在 session 启动后,原生层的 tracker 会被创建。
- target 自身 Start() 之后会被加载到对应 tracker 中。
- 对于试用数据,需要联网验证试用资格,验证成功后才会进入后续阶段。
- 初始化:
- 使用 6DoF frame source 时,会进入本地跟踪初始化过程。
- 本地跟踪初始化可能会花费一些时间,与场景复杂度和设备性能能力相关,且通常会与 frame source 底层使用的算法有关。
- 使用非 6DoF frame source 时,本地跟踪初始化阶段会被跳过,直接开始检测。
- 检测过程可能会花费一些时间,取决于场景易定位程度和数据采集建图质量。
- 默认配置下,这个阶段内容不会显示,可以通过 ActiveController 组件选项来控制这个行为。
- 使用 6DoF frame source 时,会进入本地跟踪初始化过程。
- 跟踪:
- tracker 会持续跟踪当前 block。
- 默认配置下,这个阶段只有处于跟踪状态(TargetController.IsTracked ==
true)的 target 节点下的内容会显示,可以通过 ActiveController 组件选项来控制这个行为。
- 停止:
- 在 session 停止后,target 被卸载,原生层的 tracker 会被销毁。
调整设备支持等级
MegaGoTrackerFrameFilter 的 MegaGoTrackerFrameFilter.MinInputFrameLevel 属性用于指定 Mega 支持的最低设备等级。
![]()
Mega Go 可以在几乎所有类型的帧数据源上运行,但不同的帧数据源对跟踪效果有不同的影响。
默认情况下,Mega 会选择设备支持的最高等级的帧数据源进行跟踪。默认配置下的支持 Mega Go 的 session 已经配置了支持 6DoF 和 5DoF 的帧数据源。
在 Mega 运行时要支持某个等级的帧数据源需要满足两个条件:
- 所需的帧数据源在 session 的可选帧数据源组中。
- MegaGoTrackerFrameFilter.MinInputFrameLevel 大于或等于所需的帧数据源的 CameraTransformType 等级。
比如,要在默认 session 中支持 3DoF 跟踪,需要:
- 添加 ThreeDofCameraDeviceFrameSource 到 session 的帧数据源组中。
- 修改 MegaGoTrackerFrameFilter.MinInputFrameLevel 为 ThreeDof。
又比如,要在默认 session 中删除 5DoF 跟踪支持,需要:
- 从 session 的帧数据源组中删除 InertialCameraDeviceFrameSource。
- 修改 MegaGoTrackerFrameFilter.MinInputFrameLevel 为 SixDof(即使不修改,由于没有 5DoF 帧数据源,5DoF 也不会被使用)。
在没有满足条件的帧数据源可用时,session 组装会失败。
了解当前系统状态
在默认 session 配置下,UI 消息 会显示在屏幕上,其中包含了 Mega Go 状态信息。
Tracker 状态会显示在 Mega Go: 旁边,比如 Tracking、VerifyingTrial 等。在检测和跟踪过程中,下方还会显示定位更新。
![]()
当前加载的 block 的跟踪状态会显示在 Mega Go: 下方,显示为 Block (<trackingStatus>): <name> (<id>)。其中 <name> 是 block 的名称,<id> 是 block 的 ID。trackingStatus 可能为 Tracking 或 NotTracking,分别表示当前 block 是否被跟踪中。

使用 MegaGoTrackerFrameFilter.Status 属性可以获取当前状态,从而了解跟踪器的运行情况。在出现错误状态时,可以通过 MegaGoTrackerFrameFilter.Error 来获取错误状态,并进行相应的处理。
以下代码展示了如何使用这些属性,以及常见的需要应用关注的异常状态的处理方法:
void HandleTrackerStatus()
{
if (tracker.Status == MegaGoTrackerStatus.Error)
{
if (tracker.Error == MegaGoTrackerError.ServiceVerificationFailed)
{
// 服务校验未通过,建议检查数据是否到期或失效(测试版转成正式版之后,测试版数据会失效)。
}
else if (tracker.Error == MegaGoTrackerError.LocalVerificationFailed)
{
// 本地校验未通过,建议检查 target 文件是否完整。
}
else
{
// 其它错误。
}
}
else if (tracker.Status == MegaGoTrackerStatus.VerifyingTrial)
{
// 试用 target 校验中。如果长时间无法完成验证,建议检查网络连接。
}
else if (tracker.Status == MegaGoTrackerStatus.VIOInitializing)
{
// VIO 输入初始化中。如果长时间无法完成初始化,建议提示用户优化使用方法。
// 比如:“请尝试摄像头朝向斜前方,携带设备身体左右大幅移动 5 次。”
}
}
使用 MegaGoTrackerFrameFilter.LocalizationRespond 事件可以获取定位更新。
暂停和继续
设置 MegaGoTrackerFrameFilter.enabled 为 false 可以暂停跟踪。
默认在跟踪暂停后,所有 block 节点下的内容都会隐藏。
相关主题
- 适用于 Mega Go 的 AR Session 最佳实践 介绍了如何创建和配置适用于 Mega Go 的 AR Session
- 添加 Mega Go 跟踪目标 介绍了如何添加 Mega Go 的跟踪目标 block 以及如何在 Unity 编辑器中加载 block 模型以辅助开发
- 添加一组帧数据源 介绍了如何修改 session 的帧数据源组
- 获取 session 的运行结果 介绍了如何获取 session 组件的跟踪结果
- UI 消息 介绍了如何使用 UI 消息来显示 session 状态