版權聲明: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,達到一次開發,跨平臺部署的目的。
當前,ARFoundation主要支持以下功能:
功能 | 描述 |
---|---|
世界跟蹤(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