控制 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 狀態