控制 mega 追蹤過程
本文介紹瞭如何控制 mega 追蹤過程中的各項功能和參數,以滿足不同應用場景的需求。
開始之前
- 檢查 我的定位庫可以使用了嗎?
調整設備支援等級
MegaTrackerFrameFilter 的 MegaTrackerFrameFilter.MinInputFrameLevel 屬性用於指定 mega 支援的最低設備等級。
![]()
mega 可以在幾乎所有類型的幀資料源上運行,但不同的幀資料源對追蹤效果有不同的影響。
預設情況下,mega 會選擇設備支援的最高等級的幀資料源進行追蹤。預設配置下的支援 mega 的 session 已經配置了支援 6DoF 和 5DoF 的幀資料源。
在 mega 運行時要支援某個等級的幀資料源需要滿足兩個條件:
- 所需的幀資料源在 session 的可選幀資料源組中。
- MegaTrackerFrameFilter.MinInputFrameLevel 大於或等於所需的幀資料源的 CameraTransformType 等級。
比如,要在預設 session 中支援 3DoF 追蹤,需要:
- 新增 ThreeDofCameraDeviceFrameSource 到 session 的幀資料源組中。
- 修改 MegaTrackerFrameFilter.MinInputFrameLevel 為 ThreeDof。
又比如,要在預設 session 中刪除 5DoF 追蹤支援,需要:
- 從 session 的幀資料源組中刪除 InertialCameraDeviceFrameSource。
- 修改 MegaTrackerFrameFilter.MinInputFrameLevel 為 SixDof(即使不修改,由於沒有 5DoF 幀資料源,5DoF 也不會被使用)。
在沒有滿足條件的幀資料源可用時,session 組裝會失敗。
追蹤目標管理
使用 mega 時,需要指定 MegaTrackerFrameFilter 使用的 target 即 block。
block 來源控制
大部分情況下,建議保持預設配置,即在編輯器中使用 mega studio 匯入 block。
選中 session 下的 Mega Tracker 物體,Block Root Source 選項應該保持為 External(預設)。
![]()
同時,需要指定 Block Root 為場景中的 MegaBlocks 物體。
![]()
修改 Block Root Source 選項可以指定其它 block 來源方式,比如使用 ema 匯入資料時,通常會選擇 Internal 或 Mixed 選項。
在指令碼中,可以修改 BlockHolder.BlockRootSource 來達到同樣的效果。
多目標追蹤控制
在大部分的 mega 使用場景下,沒有使用多目標的必要。在熟練掌握如何避免多個 block 互相影響之前,建議一個定位庫中只放一個block。
提示
原理上,mega 會計算設備在所有 block 中的位置,而不是從定位庫中抽選設備看到的 block。考慮不周的使用可能會因資料混淆等原因導致效果劣化。
選中 session 下的 Mega Tracker 物體,修改 Multi Block 選項可以啟用或停用多目標追蹤功能。
![]()
在指令碼中,可以修改 BlockHolder.MultiBlock 來達到同樣的效果。
警告
一般情況下,一個定位庫裡只能同時有一個 block。
修改多目標配置會影響追蹤效果,一般不建議修改。請在 easyar 技術支援的指導下使用。
如果應用執行過程中該配置被修改過,向 easyar 反饋問題時請務必說明這一點。
瞭解當前系統狀態
在預設 session 配置下,UI 訊息 會顯示在螢幕上,其中包含了 mega 追蹤狀態的資訊。
在定位成功時,mega block 下會包含 Found 狀態文字以及當前追蹤的 block 名稱和 ID:
![]()
在定位失敗時,mega block 下會包含 NotFound 狀態文字:
![]()
提示
NotFound 是正常狀態,在 mega 工作的整個過程中經常會出現該狀態,出現該狀態時追蹤仍然在繼續。通常應用開發中不需要對 NotFound 狀態進行特殊處理。
使用 MegaTrackerFrameFilter.LocalizationRespond 事件可以獲取當前的定位狀態,從而瞭解系統當前是否找到了追蹤目標。
以下程式碼展示瞭如何使用該事件,以及常見的需要應用關注的異常狀態的處理方法:
private void Awake()
{
megaTracker.LocalizationRespond += HandleLocalizationStatusChange;
}
private void HandleLocalizationStatusChange(MegaLocalizationResponse response)
{
var status = response.Status;
wakingUpCount = status == MegaTrackerLocalizationStatus.WakingUp ? wakingUpCount + 1 : 0;
if (wakingUpCount >= 5)
{
// 服務正在喚醒中,需要讓終端使用者等待
}
if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
{
// QPS 超限,會隨機有終端使用者定位失敗(總體追蹤質量下降)
// 這時一般需要付費提升 QPS 上限以保障當前使用者量下的追蹤質量
}
if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
{
// Token過期,這只會出現在使用 Token 介面存取服務時
// 接近該問題需要應用請求自己的後臺獲取 Token,並呼叫 MegaTrackerFrameFilter.UpdateToken 進行更新
}
}
如果應用經常遇到 MegaTrackerLocalizationStatus.RequestTimeout 狀態,通常說明裝置連線服務的網路狀況不佳,建議優化網路環境以提升追蹤質量。在網路狀況無法改善的場景下,可以考慮增加請求逾時時間。
附註
無法通過該事件獲取定位返回的 pose。
事實上,定位返回的 pose 在應用開發中是不需要的,easyar 會在定位返回後通過本地演算法計算出更準確的 pose 並返回給開發者使用,而該 pose 已經體現在 block 的 transform 中,可以參考 獲取 session 的執行結果。
暫停和繼續
mega 的追蹤和定位功能可以分別暫停和繼續。
暫停追蹤
設定 MegaTrackerFrameFilter.enabled 為 false 可以暫停追蹤。
預設在追蹤暫停後,所有 block 節點下的內容都會隱藏。
暫停定位
設定 MegaTrackerFrameFilter.EnableLocalization 為 false 可以暫停定位。
警告
暫停定位會影響追蹤效果,一般不建議修改。請在 easyar 技術支援的指導下使用。
如果應用執行過程中定位被暫停過,向 easyar 反饋問題時請務必說明這一點。
服務和請求控制
可以通過修改 MegaTrackerFrameFilter 元件的參數來控制請求服務的行為。
請求間隔和逾時
選中 session 下的 Mega Tracker 物體,修改 Request Time Parameters 下的選項可以調整請求服務的時間間隔和逾時時間。
![]()
在指令碼中,可以修改 MegaTrackerFrameFilter.RequestTimeParameters 來達到同樣的效果。
警告
修改請求間隔會影響追蹤效果,一般不建議修改。請在 easyar 技術支援的指導下使用。
如果應用執行過程中請求間隔被修改過,向 easyar 反饋問題時請務必說明這一點。
切換定位庫
使用 MegaTrackerFrameFilter.SwitchEndPoint(ExplicitAddressAccessData, BlockRootController) 可以在執行時切換定位庫。使用這個介面時相機畫面及 session 不會中斷。
相關主題
- 適用於 mega 的 ar session 最佳實踐 介紹瞭如何建立和配置適用於 mega 的 ar session
- 新增 mega 追蹤目標 介紹瞭如何新增 mega 的追蹤目標 block 以及如何在 unity 編輯器中載入 block 模型以輔助開發
- 新增一組幀資料源 介紹瞭如何修改 session 的幀資料源組
- 獲取 session 的執行結果 介紹瞭如何獲取 session 元件的追蹤結果
- UI 訊息 介紹瞭如何使用 UI 訊息來顯示 session 狀態