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 消息

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

後續步驟

相關主題