Table of Contents

在 Unity 中使用 EasyAR Mega 實現遮擋

遮擋 (Occlusion) 是提升 AR 虛實融合沉浸感的關鍵技術。本文將介紹如何在 Unity 中通過 EasyAR Mega 實現遮擋效果。

開始之前

遮擋的實現方式

  • 離線建模:在 Block 座標系下,針對現實世界中的實體(如牆體、立柱、大型設備)創建 1:1 匹配的幾何體;或通過對 Block 稠密模型進行裁剪與減面處理得到優化後的模型。

  • 運行時對齊:在運行時,通過雲定位將 Block 座標系與現實空間對齊,並加載對應的幾何體。

  • 材質替換:爲這些幾何體賦予特殊的遮擋材質。

  • 視覺效果:當 GPU 渲染其他虛擬物體時,會因深度測試未通過而自動剔除被遮擋部分的像素,從而使虛擬物體遵循現實物理空間的遮擋邏輯。

使用建圖結果中的遮罩文件

根據以下步驟,通過雲定位庫的 遮罩文件下載 入口下載建圖結果中的遮罩文件作爲遮擋白模,並導入場景。遮罩文件可以直接使用,也可以按需裁剪後使用。

附註

此下載方式僅適用於建圖版本 9.6 及以上的建圖結果。

下載遮罩文件

將 Block 添加到雲定位庫後,在該 Block 所在行的 操作 列中點擊 遮罩文件下載。

遮罩文件下載入口

在彈窗中根據需要選擇標準精度或低精度,點擊對應的 下載 按鈕,下載遮罩文件壓縮包(zip 格式)。下載完成後,解壓獲取模型文件。

下載遮罩文件

附註

壓縮包中可能包含一個或多個 glb 模型文件。多個模型可以分別導入 Unity 使用,也可以在數字內容創建軟件(例如 Blender)中合併後使用。

[可選] 對模型進行裁剪

下載的模型共同覆蓋整個 Block。如果需要對整個 Block 進行遮擋,可以跳過本步驟,直接導入 Unity;如果只需要對部分區域進行遮擋,可以按以下步驟裁剪模型。

在數字內容創建軟件(例如 Blender)中導入解壓後的模型文件。

裁剪前

裁剪模型,只保留需要用於遮擋的部分,並導出爲 glb 格式。如果導入了多個模型,可以根據需要合併後再導出。處理過程中應保持模型在 Block 座標系中的位置、朝向和大小不變,以便導入 Unity 後與 Block 對齊。

裁剪後

將模型導入 Unity

將模型導入 Unity,並掛載至場景中對應的 Block 節點下,作爲其子節點。如果使用多個模型,請分別導入並掛載至同一個 Block 節點下。

附註

將 glb 模型導入 Unity 需要安裝 com.unity.cloud.gltfast 包,版本不低於 6.8。若項目中沒有安裝該包或版本過低,請通過 Package Manager 安裝或升級。

在 Inspector 面板中修改每個遮擋模型的 Transform,設置其相對 Block 節點的位置、旋轉和縮放:

  • Position 設置爲 (0, 0, 0)。
  • Rotation 設置爲 (0, 180, 0)。
  • Scale 設置爲 (1, 1, 1)。

完成後,遮擋模型應與 Block 稠密模型的對應部分貼合。

導入遮擋模型

附註

從雲定位庫下載的遮罩文件與 Unity 的座標系定義不同,需要將 Rotation 的 Y 分量設置爲 180 才能對齊。此設置適用於本節從建圖結果下載的遮罩文件,後文通過 Mega 編輯器工具導出的稠密模型使用不同的旋轉設置。

爲模型賦予遮擋材質

將每個模型的材質修改爲遮擋材質,可以使用 Unity 自帶的 SpatialMappingOcclusion。

遮擋模型更換材質

使用 EIF 數據模擬運行或實機運行

使用 EIF 數據模擬運行或實機運行,檢查虛擬物體是否被對應的實景區域遮擋。

使用幾何體作爲遮擋

根據以下步驟可以在場景中添加作爲遮擋使用的幾何體並驗證效果。

擺放遮擋幾何體

根據 Mega Block 的稠密模型使用內置幾何體或自建幾何體作爲遮擋擺放在 Block 座標系下的正確位置。 擺放遮擋幾何體

[可選]根據全景圖微調幾何體的位置

根據全景圖微調遮擋

爲幾何體賦予遮擋材質

將幾何體材質修改爲遮擋材質,可以使用 Unity 自帶的 SpatialMappingOcclusion。 根據全景圖微調遮擋

使用 EIF 數據模擬運行或實機運行

可以根據運行效果微調遮擋模型的擺放。

使用裁剪並減面的稠密模型作爲遮擋

根據以下步驟將導出後的 Mega Block 稠密模型裁剪並減面得到用於遮擋的白模,並導入場景作爲遮擋。

在 Mega Blocks 中導出

點擊 Mesh 右邊的 Export 按鈕導出稠密模型。

導出稠密模型

修改導出選項

在導出時注意修改導出選項。

圖中 1 爲 LOD 層級,層級越低模型越簡單,面數越少,若需要最高的精度選擇最高層級。

圖中 2 爲導出貼圖選項,這裏只需要白模作爲遮擋,不需要貼圖。

對模型進行裁剪並減面

將導出後的模型在數字內容創建軟件(例如 Blender)中進行裁剪,減面,保存爲 glb 格式。

提示

例子中使用的是 Blender 的 Decimate Modifier。

裁剪前

裁剪並減面後:

裁剪後

將遮擋模型導入 Unity 並掛載到場景中 Block 節點下方

附註

將 glb 模型導入 Unity 需要安裝 com.unity.cloud.gltfast 包,版本不低於 6.8。若項目中沒有安裝該包或版本過低,請通過 Package Manager 安裝或升級。

導入遮擋模型

修改模型的 Transform

修改模型的 Transform 使 Position,Rotation 均全部爲 0。

此時用於遮擋的白模應該和稠密模型貼合,這是因爲在數字內容創建軟件中進行裁剪和減面操作時,並沒有改變 Block 座標系的定義。

遮擋模型貼合

爲模型賦予遮擋材質

將模型材質修改爲遮擋材質,可以使用 Unity 自帶的 SpatialMappingOcclusion。

遮擋模型更換材質

使用 EIF 數據模擬運行或實機運行

使用 EIF 數據模擬運行或實機運行,查看效果。

遮擋的效果預期

遮擋的效果主要由以下幾點影響:

  • 定位跟蹤本身的精度
  • 模型擺放的準確程度
  • 模型本身的精度(如果不是簡單的幾何體)

在定位漂移時出現數公分未對齊的情況是正常的。

遮擋用的模型面數太多容易影響性能,建議只在必要區域使用,並且儘量使用簡單的幾何體作爲遮擋。

相關主題