Unity AR 的入口 —— AR Session
AR 會話(session)是所有 AR 功能的入口,通過以下內容您將了解 AR Session 的基本概念、組成、運行流程以及它與 Unity AR Foundation 的 AR Session 有什麼關係。您還會了解到在 Unity 中,EasyAR Sense 的數據流到底是如何工作的。
AR session 是什麼
所有 AR 流程(例如物體追蹤)都是在原生庫,即 EasyAR Sense 內部執行的。session 是 Unity 中 AR 功能的主要入口點。它管理 AR 系統的運行過程和狀態,包括從實體相機和感測器讀取資料、分析真實世界、驅動場景中虛擬攝影機等其它部分物體的移動和渲染等。
flowchart LR
A((圖像<br>和其它數據))
B[Session]
C([Camera])
O([Origin])
T([Target])
A --> B
B -. transform .-> C
B -. transform .-> O
B -. transform .-> T
[可選] Easyar 的 session 與 ar foundation 的 session
Easyar 的 session 是 Unity 中使用 EasyAR 的核心元件,可以獨立於任何第三方或系統 AR 功能執行。而 AR Foundation 的 session 是 Unity XR 框架的一部分,只能使用 Unity XR 插件(如 ARKit 或 ARCore)提供的功能。
flowchart TD
A1[EasyAR<br>AR Session]
A2[EasyAR Sense]
A1 --> A2
B1[AR Foundation<br>AR Session]
B2[ARKit Plugin]
B3[ARCore Plugin]
B1 --> B2
B1 --> B3
使用 EasyAR 時,通常並不需要同時安裝和使用 AR Foundation。比如影像追蹤功能,運動追蹤功能等等,都是由 EasyAR Sense 獨立提供的。
在某些情況下,可能需要將 EasyAR Sense 與 AR Foundation 結合使用,以利用 AR Foundation 提供的額外功能(比如在部分裝置上的平面檢測)和介面。在這種情況下,EasyAR Sense 透過 AR Foundation 提供的介面與 Unity 引擎進行互動。
但是,由於 EasyAR 提供了比系統 AR 更多的功能和更完善的裝置適配,獨立使用 AR Foundation 通常無法達到與 EasyAR 相同的效果。
Session 的組成
一個典型的 session 主要由以下部分組成:
- 幀來源 (frame source):提供實體相機影像和感測器資料的元件,有時這些元件也會提供運動跟蹤資料。比如 CameraDeviceFrameSource 和 MotionTrackerFrameSource
- 幀過濾器(s) (frame filter(s)):提供特定 AR 功能的元件,比如 ImageTrackerFrameFilter
- 相機 (camera):場景中的虛擬攝像機物件
- 原點 (origin):運動跟蹤的原點物件
附註
在 AR Foundation 的概念中,運動跟蹤被作為必選功能,因此它始終會提供一個 origin。 而在 EasyAR 系統中,運動跟蹤是一個可選的功能,因此 origin 也是可選的。
[可選] session 的資料流
資料流 是 EasyAR Sense 的核心概念之一。它不影響您在 Unity 中開發 AR 應用。如果您想要更加深入地理解 session 的工作原理,可以閱讀本節內容。
在 Unity 中,一個 session 通常表達了一個 EasyAR Sense 的資料流。
flowchart LR
S[Frame Source]
R[Input Frame Recorder<br>Video Input Frame Recorder]
ift[iFrameThrottler]
iff[iFrameFork]
i2f[i2FAdapter]
fb[fbFrameFork]
i2o[i2OAdapter]
FOT[Object Tracker]
FIT[Image Tracker]
FMT[Mega Tracker]
FSSM[Sparse Spatial Map]
FST[Surface Tracker]
FDS[Dense Spatial Map]
FCR[Cloud Recognizer]
ofj[oFrameJoin]
off[oFrameFork]
ofb[oFrameBuffer]
O(( ))
ODS(( ))
OCR(( ))
S ==> R ==> ift ==> iff
iff --> i2f
i2f --> fb
fb -.-> FOT -.-> ofj
fb -.-> FIT -.-> ofj
iff ==> i2o ==> ofj ==> off ==> ofb ==> O
iff -.-> FMT -.-> ofj
iff -.-> FSSM -.-> ofj
iff -.-> FST -.-> ofj
iff -.-> FDS -.-> ODS
iff -.-> FCR -.-> OCR
off --> i2f
ofb --> ift
這個資料流是在 session 啟動過程中建立的,圖中除加粗資料通路外,其它部分是否連接取決於啟動過程中啟用的 AR 元件。
因此,透過修改 session 中啟用的元件,可以靈活改變資料流的結構和功能,也可以很方便地同時啟用多個 AR 功能。而這個方法將在接下來的段落中詳細介紹。
Session 的流程
flowchart LR
i[初始化<br>Initialize]
a[組裝<br>Assemble]
starta["啟動(已組裝的)<br>StartSession(Assembled)"]
start[啟動<br>StartSession]
update((更新<br>update))
stop[停止<br>StopSession]
di[反初始化<br>Deinitialize]
i --> a --> starta --> update --> stop --> di
i --> start --> update
初始化
初始化是使用 license key 啟動 EasyAR Sense 的過程。在初始化前,僅有極少數 EasyAR Sense 的介面可使用。初始化後,AR 功能才會被激活。組裝(Assembling)
組裝過程會根據組裝選項的配置,從場景中挑選合適的元件,並將它們連接成整體工作單元。此過程通常在啟動時自動完成,但也可在啟動前手動呼叫組裝介面來完成。組裝完成後,可透過啟動已組裝的 session 跳過組裝過程,從而加速啟動。
組裝過程另一重要用途是判斷 AR 元件及輸入源的可用性,並在所有候選輸入中選擇最合適的輸入源。此步驟亦可用於判斷當前 session 能否在當前設備上運行。組裝過程分為兩階段:
- 第一階段會啟動設備支援清單更新,並在配置等待固定時間後開始組裝。若在第一階段等待後設備支援清單已完成更新,則組裝過程結束;
- 否則組裝過程進入第二階段,此階段會在設備支援清單更新完成後執行。此階段中,若可用 frame source 從第一階段的無可用 frame source 轉變為存在可用 frame source,且 session 在第一階段後啟動失敗,則會嘗試重新啟動 session。
無論第一階段設備清單是否完成更新,session 皆會在第一階段完成後繼續後續步驟。
啟動
啟動是開始 AR 功能運行的過程。啟動前,AR 功能元件不會處理任何資料。正常啟動後,session 會開始控制場景中部分物體移動,並在使用部分輸入源時控制實體相機影像的渲染。更新
更新過程在 Unity 的渲染循環每幀執行。此過程會根據當前 AR 功能的運行結果,每幀修改虛擬攝影機(部分輸入源)、原點及追蹤目標的 transform。不同設備上更新過程的執行時間點不盡相同,但必定在渲染前執行。停止
停止會終止 AR 功能的運行,場景中的物體不再受 session 控制,輸入源的資料亦不會被處理。反初始化
反初始化會釋放部分全域資源(不會卸載動態庫)。反初始化後,AR 功能元件將無法使用。
附註
所有 AR 功能僅可在 ARSession.StartSession 後使用。
Session 的默認生命週期
flowchart LR
uload("BeforeSceneLoad")
ustart("MonoBehaviour.Start")
udestroy("MonoBehaviour.OnDestroy")
oi{Initialize<br>OnStartup}
ostart{AutoStart}
i[初始化<br>Initialize]
start[啟動<br>StartSession]
update((更新<br>update))
stop[停止<br>StopSession]
uload -.-> ustart -.-> udestroy
uload --> oi -. true .-> i
ustart --> ostart -. true .-> start
udestroy --> stop
i --> start --> update --> stop
session 的生命週期一般由介面呼叫的時間決定。採用預設設定時,session 會在以下時間點自動執行:
初始化(EasyARSettings.InitializeOnStartup ==
true)
自動初始化會在 Unity 的 BeforeSceneLoad 時間點執行。啟動(ARSession.AutoStart ==
true)
自動啟動會在 session 的 MonoBehaviour.Start() 時間點執行。停止
自動停止會在 session 的 MonoBehaviour.OnDestroy() 時間點執行。
Session 狀態
ARSession.State 描述了 session 的狀態。一個 session 有以下幾種狀態:
| 狀態 | 描述 |
|---|---|
| None | 初始狀態,session 未啟動或組裝 |
| Broken | 組裝失敗等原因 session 被破壞 |
| Assembling | 在組裝過程中,組裝過程通常可能持續幾幀 |
| Assembled | 成功完成組裝,但尚未啟動 |
| Ready | session 成功啟動,這個狀態只會持續一幀 |
| Running | session 在運行中 |
| Paused | session 暫停運行 |
通常 session 的狀態會在調用啟動和停止等介面時發生變化。運行過程中,如果出現嚴重錯誤,session 也可能進入 Broken 狀態。進入 Broken 狀態的 session 無法恢復運行,必需調用停止後重新啟動。
可以通過 session 的狀態了解當前 session 是否出於可用狀態。絕大多數功能只有在 Ready 或 Running 狀態下才能使用。
運動追蹤狀態
ARSession.TrackingStatus 描述了 session 的運動追蹤追蹤狀態,它表示裝置運動追蹤的品質,有這幾種狀態:
| 狀態 | 描述 |
|---|---|
| Optional<MotionTrackingStatus>.Empty | 運動追蹤功能未啟用或 session 未執行 |
| NotTracking | 運動追蹤結果不可用,原因可能是正在初始化,追蹤遺失或者正在重定位 |
| Limited | 運動追蹤是有效的,但是結果不太好,原因可能是當前區域紋理太弱或運動過快 |
| Tracking | 運動追蹤品質好 |
附註
在 AR Foundation 的概念中,運動追蹤被作為必選功能,因此它的追蹤狀態與 session 狀態合併在了一起。 而在 EasyAR 系統中,運動追蹤是一個可選的功能,因此追蹤狀態是獨立存在且可能為空的。
其它 ar 功能的跟踪状态在哪
由於 ar 功能可能同時追蹤複數個物件,因此影像追蹤狀態和其它 ar 功能的追蹤狀態並不在 session 中,而是在追蹤目標元件中。
可以使用 TargetController.IsTracked 瞭解追蹤目標是否處於追蹤狀態,或使用 TargetController.TargetFound 和 TargetController.TargetLost 事件在追蹤狀態變化時調整應用內容邏輯。
Next steps
Create session
- 嘗試在場景中 建立 session
控制運行
- 瞭解 初始化 的方法和作用
- 瞭解如何 判斷可用性和裝置支援
- 瞭解 控制 session 執行 的方法
訪問元件和結果
- 嘗試 訪問 AR 功能元件
- 瞭解如何 取得 session 的運行結果
元件參考
- ARSession 元件參考