AR 場景中的 Unity 攝像機
Unity 中 AR 的效果呈現離不開攝像機。通過以下內容,您將瞭解 AR 場景中攝像機的作用,以及 session 如何控制攝像機的屬性以確保正確的 AR 體驗。
開始之前
- 通過 ARSession 簡介瞭解 session 的基本概念、組成和工作流程。
AR 場景中攝像機的作用
Unity 中的攝像機用於向玩家展示遊戲世界,而在 AR 場景中,攝像機的作用更加重要。它不僅負責渲染虛擬內容,還需要與現實世界進行對齊,以確保虛擬對象正確地疊加在現實場景中。
這段視頻展示了一個簡單的 AR 場景。視頻左邊是
Scene視圖,右邊是Game視圖。視頻是使用模擬運行數據,在 Unity 編輯器的Play模式錄製的。Game視圖的內容與用戶在現實世界中手機看到的內容是一樣的。可以看到,在這段視頻裏,代表用戶的攝像機(攝像機圖標)會根據用戶在現實世界中的移動而移動。白色錐體截取了過去一段時間內攝像機的位置和朝向軌跡。可以看到在
Game視圖中,攝像機不僅展示了Scene視圖裏的虛擬內容,同時在虛擬內容底部還疊加了現實世界的圖像,這就是 AR 場景中攝像機的典型工作方式。
爲了確保虛擬對象正確地疊加在現實場景中,攝像機的部分屬性需要根據 AR 運行的狀態進行調整。這些屬性包括:
- 攝像機的 transform(位置和朝向)
- 攝像機的視野(FOV)、寬高比(aspect ratio)和投影矩陣
- 攝像機的剔除設置(GL.invertCulling)
警告
在開發應用時,修改 session 攝像機的這些屬性是不受支持的,因爲這可能會導致虛擬內容與現實世界對齊不正確,從而影響用戶體驗。即使通過某些手段修改了這些屬性,AR 系統也會在運行過程中覆蓋這些修改,或是因爲渲染數據與計算數據的不一致導致不可預期的行爲。
根據控制這些屬性的對象的不同,session 所使用的攝像機可以分爲兩類:受 session 控制的攝像機和不受 session 控制的攝像機。
受 session 控制的攝像機
如果 session 的攝像機不屬於任何外部系統,比如頭顯或 AR Foundation,那麼 session 會自動控制攝像機的上述屬性,以確保攝像機正確地與現實世界對齊。
transform
攝像機的 transform(位置和朝向)是由 session 根據 AR 功能的運行狀態進行調整的。一般來說,session 會根據運動跟蹤數據和/或 target 的跟蹤數據來更新攝像機的位置和朝向,從而確保用戶看到的內容和現實世界中的內容一致。
在 Unity 中,所有 AR 跟蹤的中心參考點被稱爲 session 中心,而 session 運行過程中決定這個中心的規則被稱爲中心模式。在不同的中心模式下,攝像機的 transform 行爲有所不同:
在 Camera 中心模式下,攝像機是可以隨意移動的。
一般 Camera 模式很少被應用使用。
在其它中心模式(比如 FirstTarget)下,攝像機是不能隨意移動的。
FirstTarget 是大部分 AR 應用會採用的模式。
警告
攝像機 transform 的 scale 數值應始終保持爲 (1, 1, 1)。修改攝像機的 scale 可能會導致不可預期的行爲。
投影矩陣
攝像機的投影矩陣會在 session 每幀更新時根據物理相機的內參進行更新,以確保虛擬內容正確地疊加在現實場景中。
剔除設置
攝像機的剔除設置(GL.invertCulling)會根據 session 的鏡像設置進行調整,以確保虛擬內容正確地渲染在現實場景中。
在 HorizontalFlip 中對應當前使用的攝像頭的設置爲 World 時,GL.invertCulling 會被設置爲 true。這是前置攝像頭的默認配置。
AR 背景視頻流
在 AR 場景中,攝像機通常會渲染來自物理相機的視頻流作爲背景,以增強用戶的沉浸感。session 會自動處理視頻流的獲取和渲染,並確保視頻流與虛擬內容正確地對齊。
不受 session 控制的攝像機
在使用頭顯和 AR Foundation 、以及實現中指定了 IsCameraUnderControl 爲 false 的 FrameSource 時,session 不會控制攝像機的上述屬性,而是由外部系統負責控制。
警告
雖然在這種情況下 session 不會控制攝像機的屬性,但它們會由第三方系統(比如頭顯 SDK 或 AR Foundation)所控制,在開發應用時修改這些屬性仍然是不受支持的。
複製攝像機時的注意事項
有時可能需要將 session 攝像機的參數複製到另一個攝像機上,這時需要額外關注以下兩點:
- 屬性獲取時間:在使用受控攝像機時,需要參考 獲取 session 的運行結果 在正確的時間獲取這些參數;在使用不受控 session 控制的攝像機時,需要參考第三方系統的文檔在正確的時間獲取。
- 攝像機的視野(FOV)、寬高比(aspect ratio)和投影矩陣:需要使用 Camera.projectionMatrix 獲取攝像機投影矩陣,並複製到另外一個攝像機。Camera.fieldOfView 和 Camera.aspect 在數學上是投影矩陣的一部分,使用 Camera.fieldOfView 和 Camera.aspect 是不充分的。
後續步驟
- 閱讀 Camera 配置 瞭解如何配置攝像機以獲得最佳的 AR 體驗