Unity 中的攝像頭及輸入幀數據來源 —— 幀數據源(Frame Source)
幀數據源是 Unity 中攝像頭及輸入幀數據的提供者。本文介紹了幀數據源的基本概念、類型以及運行時的選取方法。
開始之前
- 了解 AR Session 的基本概念、組成和工作流程。
- 了解 攝像頭、輸入幀 等基本概念。
幀數據源是什麼
幀數據源(FrameSource)是輸入幀(InputFrame)的提供者,抽象了攝像頭以及其它提供輸入幀數據的設備和功能。
下圖展示了幀數據源在 session 中的位置:
flowchart LR
F[Frame Source]
A((Input Frame))
B[Session]
C([Camera])
O([Origin])
T([Target])
F --> A
A --> B
B -. transform .-> C
B -. transform .-> O
B -. transform .-> T
style F fill:#6e6ce6,stroke:#333,color:#fff
幀數據源可能只是提供數據給下游 AR 功能使用,也可能它自身就實現了一些 AR 功能,比如運動跟蹤。部分幀數據源會提供攝像頭設備的控制接口,允許用戶選擇攝像頭參數,比如分辨率、對焦模式等。
幀數據源的類型
以提供幀數據源的 Unity 包區分,幀數據源可以分為兩大類:
- 內置幀數據源:由 EasyAR Sense Unity 插件包提供的幀數據源,通常支持大部分常見的使用場景和部分頭顯。
- 外部幀數據源:由 EasyAR Sense Unity 插件擴展包提供的幀數據源,通常用於支持特定的頭顯設備。很多時候,外部幀數據源是由頭顯廠商或第三方開發者提供的。
區分於外部幀數據源,自定義相機 並不一定是由外部提供的,內置幀數據源中也有部分是自定義相機。
幀數據源可以提供不同自由度的運動數據:0DoF、3DoF、5DoF 和 6DoF,同一個幀數據源有可能在不同工作狀態下提供不同自由度的運動數據。
下面的表格列出了由 EasyAR 提供的幀數據源:
| 名稱 | 內置 | 自定義相機 | 運動數據 | 說明 |
|---|---|---|---|---|
| CameraDeviceFrameSource | 是 | 否 | 無(0DoF) | 普通攝像頭,支持前後攝和 PC |
| EditorCameraDeviceFrameSource | 是 | 否 | 無(0DoF) | 普通攝像頭,僅支持在編輯器下調試使用 |
| FramePlayer | 是 | 否 | 播放文件決定 | 回放 EIF 文件,實現模擬運行 |
| ThreeDofCameraDeviceFrameSource | 是 | 否 | 3DoF | 提供 3DoF 跟蹤能力 |
| InertialCameraDeviceFrameSource | 是 | 否 | 5DoF | 提供慣性導航能力 |
| MotionTrackerFrameSource | 是 | 否 | 6DoF | 提供 EasyAR 實現的運動跟蹤 |
| ARCoreFrameSource | 是 | 否 | 6DoF | 提供 ARCore 的運動跟蹤 |
| ARKitFrameSource | 是 | 否 | 6DoF | 提供 ARKit 的運動跟蹤 |
| AREngineFrameSource | 是 | 是 | 6DoF | 提供 AR Engine 的運動跟蹤 |
| VisionOSARKitFrameSource | 是 | 是 | 6DoF | 提供 VisionOS ARKit 的運動跟蹤 1 |
| XREALFrameSource | 是 | 是 | 6DoF | 提供 XREAL 設備的運動跟蹤 1 |
| ARCoreARFoundationFrameSource | 是 | 是 | 6DoF | 提供 ARFoundation 對應 ARCore 的運動跟蹤 |
| ARKitARFoundationFrameSource | 是 | 是 | 6DoF | 提供 ARFoundation 對應 ARKit 的運動跟蹤 |
| PicoFrameSource | 否 | 是 | 6DoF | 提供 Pico 設備的運動跟蹤 1 |
| RokidFrameSource | 否 | 是 | 6DoF | 提供 Rokid 設備的運動跟蹤 1 |
運行時幀數據源選取
session 的場景層級結構中包含了一個或多個幀數據源組件。在 session 運行時,並非所有的幀數據源組件都會被使用。
下面的截圖展示了一個只有單個幀數據源組件的場景層級結構:
![]()
下面的截圖展示了一個包含多個幀數據源組件的場景層級結構:

每個幀數據源的功能不同,這也同時決定了它們適用的使用場景和裝置。在 session 組裝時,會從這些組件中選取一個且僅有一個作為 session 的幀數據源。
AssembleOptions.FrameSourceSelection 屬性定義了 session 運行時幀數據源的選取方法:
| 名稱 | 方法 |
|---|---|
| Auto(預設) | 自動選擇,按 transform 順序選擇第一個可用且 active 的子節點。 |
| Manual | 手動指定。只能指定 session 子節點。 |
| FramePlayer | 使用 FramePlayer。 |
提示
Unity 物件的 transform 順序可以使用 Transform.GetSiblingIndex() 判斷,也可以從 Hierarchy 視圖中物件的排序判斷,但是需要關閉以下選項(預設是關閉狀態): Edit > Preferences > General > Enable Alphanumeric Sorting。
session 組裝過程中,幀數據源在經歷如下步驟後被選定:
- session 遍歷其子節點,按 transform 順序收集所有 active 的幀數據源組件。
- 根據 AssembleOptions 中的選源策略(AssembleOptions.FrameSource)篩選候選列表:
- Auto(預設):保留所有候選。
- Manual:僅保留手動指定的幀數據源。
- FramePlayer:更換候選列表為 FramePlayer。
- 再次篩選候選列表,移除以下組件:
- 被組件自身停用的組件。
- 關閉了自訂相機(AssembleOptions.EnableCustomCamera 為 false)時的所有自訂相機組件。
- (Android 平台)如果 AssembleOptions.DeviceList 的超時設定大於 0,且候選列表中包含 MotionTrackerFrameSource、ARCoreFrameSource 或 AREngineFrameSource,會嘗試下載對應的最新裝置支援列表。下載更新後,這些幀數據源的可用性可能會發生變化。下載完成或超時後,繼續後續步驟。
- 按列表順序依次檢查剩餘候選組件的可用性(調用 FrameSource.CheckAvailability() 並存取 FrameSource.IsAvailable)。
- 選取第一個檢查結果為可用的幀數據源。
其中,組件自身的停用條件由組件內部定義,常見有這些情況:
- 在不支援的系統中運行,比如非 Android 系統下 AREngineFrameSource 會被停用。
- 必要的第三方 SDK 未安裝,比如 XREAL SDK 未安裝時 XREALFrameSource 會被停用。
- 設定的條件未滿足,比如裝置的 MotionTrackerCameraDeviceQualityLevel 低於 MotionTrackerFrameSource.DeviceQualityLevel 時 MotionTrackerFrameSource 會被停用。
如果最終沒有任何一個幀數據源被選定,session 會進入 Broken 狀態,且 session 報告中 BrokenReason 欄位數值是 NoAvailabileFrameSource。
附註
裝置列表完成更新後,如果裝置列表發生變化,幀數據源的可用性可能也會發生改變,可以參考 裝置支援和 session 報告 了解這時 session 的行為。
後續步驟
- 嘗試在場景中 添加一組幀數據源
相關主題
- 設備支持和 session 報告
- EasyAR 的頭顯支持
- 創建 外部幀數據源 以使用 自定義相機
-
設備支持情況可以參考 EasyAR 的頭顯支持 。↩↩↩↩