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 體驗