ARFoundation之路-ARSession & ARSessionOrigin

  在之前的工程裏,我們首先在Hierarchy窗口中添加了ARSession和ARSessionOrigin兩個對象,這兩個對象構建起了AR應用的最基礎的框架,所有其他工作都在這基礎之上展開,那麼,這兩個對象在整個AR應用中起什麼作用?

在這裏插入圖片描述

(一)ARSession

  ARSession對象主要包括兩個組件,一個就是ARSession,管理Session,另一個是AR Input Manager,管理輸入相關信息,如下圖所示。AR中Session(中文翻譯爲會話)用來管理 AR 應用的狀態、處理 AR 應用生命週期,是 AR API的主要入口,由其控制在目標平臺上啓用或禁用AR。在Unity 對應的生命週期方法中需要處理 Session 的生命週期,這樣 AR 應用會根據需要開始或暫停相機幀的採集,初始化或釋放相關的資源。AR場景必須包括ARSession組件,但ARSession可以掛在任何場景對象上,一般爲便於管理,我們將其掛載在ARSession對象上。

  AR Input Manager組件是啓用世界跟蹤所必需的組件,不啓用此組件,Tracked Pose Driver(跟蹤姿態驅動)將無法獲取設備的姿態。
在這裏插入圖片描述
  如果在應用運行期間禁用ARSession,系統將不再跟蹤其環境中的特徵點及相關功能,但如果稍後再啓用,系統將嘗試恢復以前檢測到的特徵點信息。選擇“Attempt Update”,設備將在可能的情況下嘗試安裝AR軟件,此功能的支持依賴於平臺,在Andriod平臺上,將嘗試安裝最新版的ARCore,在iOS平臺上,將嘗試安裝最新版的ARKit。

  特別需要注意的是,在任何一個AR應用中,有且僅允許有一個Session,因此Unity將Session設成一個全局組件,因此如果場景中有多個ARSession,那這些ARSession組件都將嘗試管理同一個Session。同樣,AR Input Manager組件也只能有且僅有一個。

  移動手機平臺設備各類繁多,不是每一個平臺都支持ARFoundation,因此我們需要一些Session狀態來表示平臺的可用性,以便根據Session狀態進行下步操作或者在設備不支持AR時可以提供替代的應用方案。

  要確定當前的Session狀態(例如設備是否支持、是否正在安裝AR軟件以及Session是否工作),可以使用ARSessionState枚舉類型,還可以在Session狀態更改時訂閱ARSession.stateChanged事件。ARSessionState枚舉包括以下類型:

ARSessionState 說明
CheckingAvailability 應用正在檢測設備可用性。
Installing AR軟件正在安裝(這裏指手機端的ARCore或者ARKit)。
NeedsInstall 設備支持AR,但需要安裝相應軟件(這裏指手機端的ARCore或者ARKit)。
None 應用還未完成初始化,設備可用性未知。
Ready AR可用並已經準備好。
SessionInitializing AR Session正在初始化,通常指AR在設備上可用,但AR應用目前還未收集到足夠的環境信息。
SessionTracking Session正常運行並且處於正常跟蹤狀態。
Unsupported 設備不支持AR。

  因此, 我們可以通過以下代碼來檢測AR應用當前狀態:

        if (ARSession.state == ARSessionState.None || ARSession.state == ARSessionState.CheckingAvailability)
        {
            //設備狀態未知
        }
        if (ARSession.state == ARSessionState.Unsupported)
        {
            // 設備不支持AR
        }
        else
        {
            // 設備支持AR
        }

(二)ARSessionOrigin

  AR Session Origin對象默認有一個Transfrom組件和一個AR Session Origin組件,如下圖所示。

在這裏插入圖片描述
  AR Session Origin組件的作用是將可跟蹤對象(如平面和特徵點)姿態信息轉換爲Unity場景中的最終位置、方向和比例。因爲AR設備由Session管理,因此其獲取的姿態信息在“session space(會話空間)”中,這是一個相對於AR Session開始的非標度空間,因此AR Session Origin執行一次座標空間變換,將其變換到Unity座標空間,這個類似於從模型局部空間到世界空間的變換,例如,在我們製作模型時,我們通常都會有模型自己的座標系,模型的所有部件都相對於其自身的座標系構建,模型自己的座標系我們叫做“模型空間”或“局部空間”,當將這些模型導入到Unity中時,模型的所有頂點位置信息都要變換到以Unity座標原點爲參考的世界空間中。同樣,由AR設備產生的可跟蹤設備姿態在“Session Space”中,因此也要做一次座標變換將其變換到Unity世界座標空間中。

  AR Session Origin還接受一個攝像機參數,這個攝像機就是AR攝像機,AR攝像機與用戶設備攝像機通過Tracked Pose Driver組件可以進行對齊,同時與AR session space對齊,這樣纔可以以正確的視角在特定位置渲染虛擬物體。

  爲更方便的渲染虛擬物體,AR Session Origin還允許縮放虛擬物體和相對攝像機的偏移。如果要使用縮放或偏移功能,則攝像機必須要是AR Session Origin的子對象(默認就是子對象),攝像機由Session驅動,因此設置AR Session Origin的縮放與偏移,則攝像機和檢測到的可跟蹤對象也一起縮放與偏移。

  要將縮放應用於AR Session Origin,只需設置其Transform 中的Scale值,將偏移應用於AR Session Origin,只需設置其Transform 中的Position值,這裏設置的縮放與偏移會影響所有虛擬物體的渲染,較大的Scale值將會使AR虛擬內容顯示得更小,例如,10倍的Scale將使虛擬對象顯示小10倍,而0.1將使虛擬對象顯示大10倍。在需要整體縮放虛擬物體時可以考慮調整該值。

  AR Session Origin對象還有一個子對象AR Camera,AR Camera默認掛載Tracked Pose Driver 、AR Camera Manager、AR Camera Background,如下圖所示。
在這裏插入圖片描述
  Tracked Pose Driver 組件主要作用是將Unity中的場景攝像機與設備的真實攝像機對齊,即是根據設備真實攝像機的位置與方向來調整Unity中的場景攝像機姿態,通過與真實攝像機對齊匹配,Unity中場景攝像機與設備真實攝像機所有參數均一致(即擁有相同的投影矩陣),這樣設置後真實攝像機與AR Session Space也是匹配的,由此來保證從Unity中渲染的虛擬物體在真實世界中的位置與姿態正確。反而言之,如果沒有該組件,Unity渲染的虛擬物體將會在真實世界中雜亂無章。Tracked Pose Driver 組件還有一些控制參數,可以根據工程需要進行選擇,甚至可以自己寫姿態控制腳本。

  AR Camera Manage組件負責處理控制攝像機的一些細節參數,如表示紋理和控制光照估計模式。其有兩個參數Focus Mode 和 Light Estimation Mode,相關意義如下表所示:

參數 選項
Focus Mode 攝像機對焦模式,可以爲“Auto”或“Fixed”,Auto即允許攝像機自動對焦,一般我們會選擇此模式,Fixed即爲固定焦距,固定焦距不會改變設備攝像機焦距,因此,與被拍攝物體距離不合適時就是出現模糊的現象。
Light Estimation Mode 光照估計模式,可以爲“Disable”或“Ambient Intesity”,選擇Ambient Intesity將啓用光照估計功能,ARFoundation將根據真實世界中的光照信息來評估當前環境中的光照強度、光照顏色、光照方向等信息,這個評估每一幀都要進行,所以如果不需要光照估計功能時選擇Disable可以節約資源。

  在AR中,我們以真實環境做爲背景,因此我們需要將攝像機捕捉到的圖像渲染成背景,使用AR Camera Background組件就可以輕鬆實現這個功能。AR Camera Background組件還有兩個參數Use Custom Material和Use Custom Render Asset ,這兩個參數均爲可選項。Use Custom Material、Use Custom Material一般情況下我們都不用勾選,這個默認會由Unity根據平臺來進行背景渲染,但如果勾選,我們就要提供背景渲染的材質、Shader,利用這兩個選項可以實現一些高級功能,如背景模糊、描邊等。

  如果在場景中只有一個AR Session Origin,我們可以簡單的爲其添加一個AR Camera Background就可以將攝像機的圖像渲染成背景,但如果有多個AR Session Origin,有多個攝像機(例如在不同的縮放尺度上渲染場景),那麼這時我們就要爲每一個AR Session Origin、每一個攝像機指定一個AR Camera Background組件並進行相應設置。

  ARSession與ARSessionOrigin負責AR應用整個生命週期管理、AR攝像機頭處理及背景渲染相關工作,這些工作是每一個AR應用都需要的,但這些工作需要與設備硬件交互,通常也會非常繁雜。這兩個功能模塊對此進行了良好封裝處理,用戶不用再擔心具體的細節,這大大的簡化了AR應用開發的難度。

參考文獻

  About AR Foundation About AR Foundation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章