ARFoundation之路-架構及術語
版權宣告:Davidwang原創文章,嚴禁用於任何商業途徑,授權後方可轉載。
(一)ARFoundation功能概述
在前文中我們知道,ARFoundation只是對ARCore和ARKit的再次封裝,ARFoundation並不實現AR的底層功能,換句說,ARFoundation只是一個功能的搬運工,因此,底層API沒有的功能,ARFoundation也不可能有(ARFoundation會新增一些輔助功能以方便開發者開發AR應用)。同時,ARFoundation能實現的功能也與底層SDK所處的平臺相關,如ARKit有worldmap功能,而ARCore沒有,這時,即使ARFoundation支援worldmap功能,其也只能在ARKit執行的iOS平臺這個功能才有效,編譯到Android平臺就會出錯。這即是說ARFoundation支援的功能與底層SDK是密切相關的,脫離底層SDK談ARFoundation功能是沒有意義的。當然,如果ARKit和ARCore都支援的功能,ARFoundation做的工作是在編譯時根據平臺選擇無縫切換所用底層SDK,達到一次開發,跨平臺部署的目的。
功能 | 描述 |
---|---|
世界跟蹤(World tracking) | 在物理空間中跟蹤使用者裝置的位置和方向(姿態)。 |
平面檢測(Plane detection) | 對水平與垂直平面進行檢測。 |
參考點(Reference points) | 對特定點的姿態跟蹤。ARCore中稱為Anchor。 |
光照估計(Light estimation) | 對物理環境中的光照強弱及方向進行估計。 |
人臉跟蹤(Face tracking) | 檢測並跟蹤人臉。 |
影象跟蹤(Image tracking) | 跟蹤物理空間中的2D影象。 |
物體跟蹤(Object tracking) | 跟蹤物理空間中的物體物件,目前只支援ARKit。 |
Seesion分享 | 支援多人共享場景,這在ARKit中稱為多人協作(Collaborative session),在ARCore中稱為Cloud Anchor。 |
人體動作捕捉(Motion capture) | 簡稱動捕,檢測物理空間中的人體及動作,用一個由17根骨骼組成的層次關節來表達人體動作。 |
人形遮擋(People occlusion) | 利用計算機視覺判斷人體在場景中的位置,獲取人體形狀及在場景中的位置實現虛擬物體遮擋。 |
攝像機影象API | 提供攝像機影象底層支援,方便開發人員開發計算機視覺應用。 |
(二)ARFoundation架構體系
雖然ARFoundtion是在底層SDK API之上的再次封裝,但Unity為了實現AR跨平臺應用(平臺無關性)做了大量工作,搭建了一個開放性的架構體系,使這個架構能夠容納各類底層SDK,能支援當前及以後其他底層AR SDK的加入,巨集觀上看,ARFoundation希望構建一個開發各類AR應用的統一平臺。
為實現這個開放的架構,ARFoundation建立在一系列的子系統(subsystem)之上。subsystem隸屬於UnityEngine.XR.ARSubsystems名稱空間,負責實現特定的功能模組,而且這個實現與平臺無關,即subsystem處理與平臺相關的特定模組的實現。如XRPlaneSubsystem負責實現平面檢測、顯示功能,不僅如此,其還要根據執行平臺的不同自動的呼叫不同底層的SDK,從呼叫者的角度看,他只調用了XRPlaneSubsystem的功能,而不用去管最終這個實現是基於iOS還是Android,即對平臺透明。
這種架構對上提供了與平臺無關的功能,對下可以在以後的發展中納入不同的底層SDK,從而實現最終的一次開發,跨平臺部署的目標。其架構圖如下所示:
(三)基本術語
世界跟蹤(Tracking)
指AR裝置確定其在物理世界中的相對位置和方向的能力。在2D和3D空間中跟蹤使用者的運動並最終定位它們的位置是任何AR應用程式的基礎,當我們的移動裝置在現實世界中移動時,ARFoundation會通過一個名為並行測距與對映(Concurrent Odometry and Mapping ,COM)的過程來理解移動裝置相對於周圍世界的位置。 ARFoundation會檢測捕獲的攝像頭影象中的視覺差異特徵(稱為特徵點),並使用這些點來計算其位置變化。 這些視覺資訊將與裝置 IMU 的慣性測量結果結合,一起用於估測攝像頭隨著時間推移而相對於周圍世界的姿態(位置和方向)。
在開發中,通過將渲染 3D 內容的虛擬攝像頭的姿態與 ARFoundation 提供的裝置攝像頭的姿態對齊,開發者能夠從正確的透視角度渲染虛擬內容,渲染的虛擬影象可以疊加到從裝置攝像頭獲取的影象上,讓虛擬內容看起來就像現實世界的一部分一樣。
可跟蹤(Trackable)
可以被AR裝置檢測和/或跟蹤的真實特徵,例如特徵點,平面,人臉,人形等等。
特徵點(Feature Point)
AR裝置使用攝像機和影象分析來跟蹤世界上用於構建環境地圖的特定點,例如木紋表面的結。特徵點雲包含了被觀察到的3D點和視覺特異點的集合,通常還附有檢測時的時間戳。
會話(Session)
Session的功能是管理AR系統的狀態,處理Session生命週期,是AR API的主要入口。在開始使用AR API的時候,通過設定的ARSessionState來檢查當前裝置是否支援AR。Session負責處理整個AR應用的生命週期,這樣AR系統會根據需要開始和暫停相機幀的採集,初始化和釋放相關的資源。
Session空間(Session space)
相對於AR session初始化時的座標系,例如,例如,會話空間(0,0,0)是指建立AR會話的位置。AR裝置跟蹤的座標資訊都是處在Session空間中,因此,在使用時,需要將其從Session空間轉換到其他空間。這類似於模型空間和世界空間的轉換。
使用者互動(User interaction)
ARFoundation利用命中測試來獲取對應於手機螢幕的 (x,y) 座標(通過點按或應用支援的任何其他互動提供),並將一條射線投影到攝像頭的視野中,返回這條射線貫穿的任何平面或特徵點以及交叉位置在現實世界空間中的姿態。 這讓使用者可以選擇環境中的物體或者與它們互動。
**增強影象(Augumented Image) **
使用增強影象(影象檢測)可以構建能夠響應特定 2D 影象(如產品包裝或電影海報)的 AR 應用, 使用者可以將手機的攝像頭對準特定影象時觸發 AR 體驗,例如,他們可以將手機的攝像頭對準電影海報,使人物彈出,然後引發一個場景。可離線編譯影象以建立影象資料庫,也可以從裝置實時新增單獨的影象。 註冊後,ARFoundation將檢測這些影象、影象邊界,然後返回相應的姿態。
共享 (Sharing)
藉助於ARKit中的多人協作(Collaborative session)或者ARCore中的Cloud Anchor,可以建立適用於 Android 和 iOS 裝置的協作性或多人遊戲應用。使用雲錨點,一臺裝置可以將錨點和附近的特徵點發送到雲端進行託管。 可以將這些錨點與同一環境中 Android 或 iOS 裝置上的其他使用者共享。 這使應用可以渲染連線到這些錨點的相同 3D 物件,從而讓使用者能夠同步擁有相同的 AR 體驗。共享需要伺服器的支援。
平面(Plane)
AR中所有的內容,都要依託於平面類進行渲染。如虛擬機器器人,只有在檢測到平面網格的地方才能放置。平面可分為水平、垂直兩種,Plane描述了對一個真實世界二維平面的認知,如平面的中心點、平面的x和z軸方向長度,組成平面多邊形的頂點。檢測到的平面還分為三種狀態,分別是正在跟蹤,可恢復跟蹤和永不恢復跟蹤。如果是沒有正在跟蹤的平面,包含的平面資訊可能不準確。兩個或者多個平面還會被被自動合併成一個父平面。如果這種情況發生,可以通過子平面找到它的父平面。
姿態(Pose)
Pose表示從一個座標系到另一個座標系的轉換。在所有的ARFoundation APIs中,Pose總是描述從物體的區域性座標系到世界座標系的變換,也就是說,來自ARFoundation API的Pose可以被認為等同於OpenGL的模型矩陣或DirectX的世界矩陣。隨著ARFoundation對環境的瞭解不斷變化,它將調整座標系模式以便與真實世界保持一致。 這時,Camera的位置(座標)可能會發生明顯的變化,以便它們所代表的物體處理恰當的位置。因此,每一幀影象都應被認為是在一個完全獨立的世界座標空間中。
光照估計(LightEstimate)
LightEstimate給我們提供了一個介面來查詢當前幀的光照環境。我們可以獲取當前相機檢視的光照強度,一個範圍在(0.0,1.0)的值,0代表黑色,1代表白色,使用該光照資訊繪製內容,可以使虛擬物體更真實。還可以獲取到光照方向,以便調整AR中虛擬物體的陰影方向,增加虛擬物體的真實感。
參考文獻
1、About AR Foundation About AR Foundation