Table of Contents

創建和配置 AR session

在 Unity 中使用 AR,需要首先在場景中創建並配置 AR session。本文介紹了創建和配置 AR session 的幾種主要方法。一般在成功創建 session 之後,在 Hierarchy 視圖中可以看到如下結構:

alt text

開始之前

  • 通過 ARSession 簡介瞭解 session 的基本概念、組成和工作流程。

創建默認配置的 session

Hierarchy 視圖中 空白 處點擊右鍵,通過菜單 EasyAR Sense > [ AR 功能 ] > AR Session ([ 功能 ] Preset) 可以創建一個預設好的 session。session 預先配置了適合該功能的 frame source 和 frame filter 組件。

在腳本中,可以使用 ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset, ARSessionFactory.Resources) 來創建 session。

比如,通過菜單 EasyAR Sense > Image Tracking > AR Session (Image Tracking Preset) 可以創建一個用於圖像跟蹤的 session。

alt text

對應的腳本代碼如下:

ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.ImageTracking);

需要注意的是,在使用 ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder 以及 ARSessionFactory.ARSessionPreset.DenseSpatialMapBuilder 預設時,需要同時傳入資源參數。例如,下面的代碼創建了一個用於稀疏空間構建的 session,並指定了點雲材質:

ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial });

如果腳本只在編輯器中運行,也可以使用默認編輯器資源:

ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, ARSessionFactory.Resources.EditorDefault());

菜單 EasyAR Sense > AR Session (Preset) > ** 中列出了所有可以使用的預設 session,可以參考使用。

alt text

附註

同一個場景中多個 session 同時運行會相互衝突,因此在場景中最多隻能保留一個被啓用(GameObject.activeInHierarchy == true)的 session。

添加組件

session 的 frame source 和 frame filter 組件可以在 session 創建後根據需要添加和刪除。

Hierarchy 視圖中,選中 AR Session (EasyAR) 並點擊右鍵,通過菜單 EasyAR Sense > [ AR 功能 ] > ** 可以添加適合該功能的 frame source 和 frame filter 組件。

在腳本中,可以使用 ARSessionFactory.AddFrameSource<Source>(GameObject, bool) 來添加 frame source 組件,或使用 ARSessionFactory.AddFrameFilter<Filter>(GameObject, ARSessionFactory.Resources) 來添加 frame filter 組件。

比如,通過菜單 EasyAR Sense > Image Tracking > Frame Filter : Image Tracker 可以給當前選中的 session 添加一個新的圖像跟蹤器。

alt text

對應的腳本代碼如下:

ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
注意

添加組件必需在 assemble 前完成。session 開始執行 assemble 以及完成 assemble 後,任何對組件的增加和刪除都會導致 session 進入 Broken 狀態並停止工作。

需要注意的是,在添加 SparseSpatialMapBuilderFrameFilter 以及 DenseSpatialMapBuilderFrameFilter 時,需要同時傳入資源參數。例如,下面的代碼創建了一個用於稀疏空間構建的 SparseSpatialMapBuilderFrameFilter,並指定了點雲材質:

ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial })

如果腳本只在編輯器中運行,也可以使用默認編輯器資源:

ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, ARSessionFactory.Resources.EditorDefault());

創建 frame filter 之後,可以使用 ARSessionFactory.SetupFrameFilters(List<GameObject>, ARSessionFactory.ARSessionPreset) 來根據預設配置調整 frame filter 的參數。

比如下面這段代碼給 session 添加一個新的圖像跟蹤器,並配置成 ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion 的預設參數。

var filter = ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
ARSessionFactory.SetupFrameFilters(new() { filter }, ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion);

使用菜單創建時無法按預設調整參數,需要在創建後根據具體的組件說明進行配置。

刪除組件

要從 session 中刪除組件,可以在 Hierarchy 視圖中選中對應的組件並按 Delete 鍵,或者在腳本中銷燬(Destroy)對應的物體。

附註

禁用(SetActive(false))組件的 GameObject 的效果與刪除組件相同。

比如要從 session 中刪除圖像跟蹤器,可以選中 Image Tracker 並按 Delete 鍵。

alt text

注意

刪除組件必需在 assemble 前完成。session 開始執行 assemble 以及完成 assemble 後,任何對組件的增加和刪除都會導致 session 進入 Broken 狀態並停止工作。

組件排序的影響

session 的 frame filter 子節點的排列順序對 session 執行沒有任何影響。

session 的 frame source 子節點的排列順序將影響 frame source 在 assemble 過程中的選擇順序。只有按 transform 順序 排列的第一個可用的 frame source 會被選中作爲 session 的實際 frame source。

附註

frame source 節點的順序只有在 assemble 之前修改是有效的。assemble 後,調整順序不會影響運行結果。

[可選] 自由創建 session

如果默認配置的 session 不能滿足需求,還可用根據需要自由創建和配置 session。

可用使用菜單 EasyAR Sense > AR Session (Preset) > AR Session (Empty) 創建一個不包含任何 frame source 和 frame filter 組件的空 session。

在腳本中,可以使用 ARSessionFactory.CreateSession() 來實現。

ARSessionFactory.CreateSession();

然後根據實際需要,添加合適的 frame source 和 frame filter 組件。

比如,如果需要創建一個包含稀疏空間構建和稠密空間構建功能的 session,可以使用下面的代碼:

var session = ARSessionFactory.CreateSession();

var group = new GameObject("Frame Source Group");
group.transform.SetParent(session.transform, false);

ARSessionFactory.AddFrameSource<XREALFrameSource>(session);
ARSessionFactory.AddFrameSource<AREngineFrameSource>(session);
ARSessionFactory.AddFrameSource<ARCoreFrameSource>(session);
ARSessionFactory.AddFrameSource<ARCoreARFoundationFrameSource>(session);
ARSessionFactory.AddFrameSource<ARKitFrameSource>(session);
ARSessionFactory.AddFrameSource<ARKitARFoundationFrameSource>(session);
ARSessionFactory.AddFrameSource<VisionOSARKitFrameSource>(session);
ARSessionFactory.AddFrameSource<MotionTrackerFrameSource>(session);

List<GameObject> filters = new();
filters.Add(ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, resources));
filters.Add(ARSessionFactory.AddFrameFilter<DenseSpatialMapBuilderFrameFilter>(session, resources));

ARSessionFactory.SetupFrameFilters(filters, ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder);
ARSessionFactory.SetupFrameFilters(filters, ARSessionFactory.ARSessionPreset.DenseSpatialMapBuilder);

它將創建出這樣的 session 結構:

alt text

後續步驟

控制運行

訪問組件和結果

組件參考