Table of Contents

Unity 中的自訂相機實現 —— 外部幀數據源

透過外部幀數據源(ExternalFrameSource),開發者可以為 EasyAR Sense 擴充自訂的相機實現,從而支援特定的頭顯設備或其他輸入設備。以下內容介紹了外部幀數據源的類型結構及介面定義。

開始之前

外部幀資料來源類型

---
  config:
    class:
      hideEmptyMembersBox: true
---
classDiagram
  class FrameSource {
    <<abstract>>
  }
  class ExternalFrameSource {
    <<abstract>>
  }
  class ExternalDeviceFrameSource  {
    <<abstract>>
  }
  class ExternalDeviceMotionFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalDeviceRotationFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalImageStreamFrameSource:::EasyAR {
    <<abstract>>
  }

  ExternalFrameSource --|> FrameSource
  ExternalDeviceFrameSource --|> ExternalFrameSource
  ExternalDeviceMotionFrameSource --|> ExternalDeviceFrameSource
  ExternalDeviceRotationFrameSource --|> ExternalDeviceFrameSource
  ExternalImageStreamFrameSource --|> ExternalFrameSource
  
  classDef EasyAR fill:#6e6ce6,stroke:#333,color:#fff

上圖展示了外部幀資料來源的類型結構。

根據輸入資料的不同,外部幀資料來源可分為兩大類:

  • 影像和裝置運動資料輸入擴展
    • 透過繼承 ExternalDeviceMotionFrameSource 實現:裝置及裝置 SDK 提供 6DoF 運動追蹤功能。虛擬攝影機的 transform 及其它控制由裝置 SDK 完成。
    • 透過繼承 ExternalDeviceRotationFrameSource 實現:裝置及裝置 SDK 提供 3DoF 旋轉追蹤功能。虛擬攝影機的 transform 及其它控制由裝置 SDK 完成。
  • 影像輸入擴展

接入這幾種外部幀資料來源時,可以使用的 AR 功能有所不同:

  • 影像和裝置運動資料輸入擴展 ExternalDeviceMotionFrameSource
    • Mega
    • 運動追蹤(由裝置自身提供)
    • 稀疏空間地圖
    • 稠密空間地圖
    • 影像追蹤(支援運動融合)
    • 影像雲識別
    • 物體追蹤(支援運動融合)
  • 影像和裝置運動資料輸入擴展 ExternalDeviceRotationFrameSource
    • Mega
    • 影像追蹤(不支援運動融合)
    • 影像雲識別
    • 物體追蹤(不支援運動融合)
  • 影像輸入擴展 ExternalImageStreamFrameSource
    • 影像追蹤(不支援運動融合)
    • 影像雲識別
    • 物體追蹤(不支援運動融合)

外部幀數據源介面定義

建立外部幀資料來源時,必須實作相關介面。下面介紹了這些介面的定義及使用方法。

設備定義

可用性

  • FrameSource.IsAvailable可用性(Availability) 用於判斷 frame source 是否可以使用。 如果一個 frame source 在當前執行裝置或環境下不可用,該數值應為 false。 如果該數值等於 Optional<bool>.Empty,FrameSource.CheckAvailability() 協程會被呼叫,應在協程結束前更新 FrameSource.IsAvailable。 可用性介面會在 session 組裝時使用,不可用的元件將不會被選擇且它的方法在 session 執行時不會被呼叫。
  • FrameSource.CheckAvailability()(可選):檢查 frame source 是否可用的協程 FrameSource.IsAvailable 等於 Optional<bool>.Empty 時會被呼叫。在該協程結束前,session 的組裝過程會被阻塞。

session 原點

虛擬攝像機

  • FrameSource.Camera虛擬攝像機
    攝像機不受 session 控制,攝像機的 transform 和投影矩陣以及圖像背景渲染應由外部代碼控制。
    僅在頭顯上該攝像機會被使用,用於將一些診斷文字展示在眼前。
    ExternalDeviceFrameSource.OriginTypeXROrigin 時不需要定義,EasyAR 會自動使用 Unity XR 框架中定義的相機。

物理相機

物理相機參數需與真實裝置相機相同。

Session 啟動和停止

  • FrameSource.OnSessionStart(ARSession)處理 session 啟動事件 在 session 組裝時選擇了這個 frame source 時有效。 可以用於延遲初始化,在這個方法中進行 AR 獨有的初始化工作。
  • FrameSource.OnSessionStop()處理 session 停止事件 在 session 組裝時選擇了這個 frame source 時有效。 可以在這個方法中銷毀 FrameSource.OnSessionStart(ARSession) 以及 session 執行中建立的資源並恢復內部狀態。在 session 銷毀之前這個方法會被保證調用。如果 frame source 在 session 之前銷毀,它將不會被調用,且 session 將進入 Broken 狀態。

輸入幀

  • ExternalFrameSource.TryAcquireBuffer(int)嘗試從記憶體池中獲取記憶體區塊
    這個記憶體區塊通常用於儲存相機幀的圖像數據並輸入 EasyAR。
  • ExternalFrameSource.ReceivedFrameCountEasyAR 獲取到的相機幀計數
    EasyAR 會用它來檢查裝置相機幀輸入的健康情況。可以在除錯中使用,如果這個數值停止增長,通常說明裝置停止向 EasyAR 輸入數據。

Unity 訊息

在腳本中使用以下訊息時,需要注意確保基類實現被呼叫:

後續步驟

相关主题