Table of Contents

Unity 中的攝像頭及輸入幀數據來源 —— 幀數據源(Frame Source)

幀數據源是 Unity 中攝像頭及輸入幀數據的提供者。本文介紹了幀數據源的基本概念、類型以及運行時的選取方法。

開始之前

幀數據源是什麼

幀數據源(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
MetaXRFrameSource 否 是 6DoF 提供 Meta XR 設備的運動跟蹤 1

運行時幀數據源選取

session 的場景層級結構中包含了一個或多個幀數據源組件。在 session 運行時,並非所有的幀數據源組件都會被使用。

下面的截圖展示了一個只有單個幀數據源組件的場景層級結構:

alt text

下面的截圖展示了一個包含多個幀數據源組件的場景層級結構:

alt text

每個幀數據源的功能不同,這也同時決定了它們適用的使用場景和設備。在 session 組裝時,會從這些組件中選取一個且只有一個作爲 session 的幀數據源。

AssembleOptions.FrameSourceSelection 屬性定義了 session 運行時幀數據源的選取方法:

名稱 方法
Auto(默認) 自動選擇,按 transform 順序選擇第一個可用且 active 的子節點。
Manual 手動指定。只能指定 session 子節點。
FramePlayer 使用 FramePlayer。
提示

Unity 物體的 transform 順序可以使用 Transform.GetSiblingIndex() 判斷,也可以從 Hierarchy 視圖中物體的排序判斷,但是需要關閉以下選項(默認是關閉狀態): Edit > Preferences > General > Enable Alphanumeric Sorting。

session 組裝過程中,幀數據源在經歷如下步驟後被選定:

  1. session 遍歷其子節點,按 transform 順序收集所有 active 的幀數據源組件。
  2. 根據 AssembleOptions 中的選源策略(AssembleOptions.FrameSource)篩選候選列表:
    • Auto(默認):保留所有候選。
    • Manual:僅保留手動指定的幀數據源。
    • FramePlayer:更換候選列表爲 FramePlayer。
  3. 再次篩選候選列表,移除以下組件:
  4. (Android 平臺)如果 AssembleOptions.DeviceList 的超時設置大於 0,且候選列表中包含 MotionTrackerFrameSource、ARCoreFrameSource 或 AREngineFrameSource,會嘗試下載對應的最新的設備支持列表。下載更新後,這些幀數據源的可用性可能會發生變化。下載完成或超時後,繼續後續步驟。
  5. 按列表順序依次檢查剩餘候選組件的可用性(調用 FrameSource.CheckAvailability() 並訪問 FrameSource.IsAvailable)。
  6. 選取第一個檢查結果爲可用的幀數據源。

其中,組件自身的禁用條件由組件內部定義,常見有這些情況:

如果最終沒有任何一個幀數據源被選定,session 會進入 Broken 狀態,且 session 報告中 BrokenReason 字段數值是 NoAvailabileFrameSource。

附註

設備列表完成更新後,如果設備列表發生變化,幀數據源的可用性可能也會發生改變,可以參考 設備支持和 session 報告 瞭解這時 session 的行爲。

後續步驟

相關主題


  1. 設備支持情況可以參考 EasyAR 的頭顯支持 。↩↩↩↩↩