在 Unity 中使用 EasyAR Mega 实现遮挡
遮挡 (Occlusion) 是提升 AR 虚实融合沉浸感的关键技术。本文将介绍如何在 Unity 中通过 EasyAR Mega 实现遮挡效果。
开始之前
遮挡的实现方式
离线建模:在 Block 坐标系下,针对现实世界中的实体(如墙体、立柱、大型设备)创建 1:1 匹配的几何体;或通过对 Block 稠密模型进行裁剪与减面处理得到优化后的模型。
运行时对齐:在运行时,通过云定位将 Block 坐标系与现实空间对齐,并加载对应的几何体。
材质替换:为这些几何体赋予特殊的遮挡材质。
视觉效果:当 GPU 渲染其他虚拟物体时,会因深度测试未通过而自动剔除被遮挡部分的像素,从而使虚拟物体遵循现实物理空间的遮挡逻辑。
使用建图结果中的遮罩文件
根据以下步骤,通过云定位库的 遮罩文件下载 入口下载建图结果中的遮罩文件作为遮挡白模,并导入场景。遮罩文件可以直接使用,也可以按需裁剪后使用。
注意
此下载方式仅适用于建图版本 9.6 及以上的建图结果。
下载遮罩文件
将 Block 添加到云定位库后,在该 Block 所在行的 操作 列中点击 遮罩文件下载。

在弹窗中根据需要选择标准精度或低精度,点击对应的 下载 按钮,下载 glb 格式的遮罩文件。

[可选] 对模型进行裁剪
遮罩文件覆盖整个 Block,如果其覆盖范围已经满足遮挡需要,可以直接使用,跳过本步骤;如果只需要使用部分区域进行遮挡,再按以下步骤裁剪。
在数字内容创建软件(例如 Blender)中打开下载的模型。

裁剪模型,只保留需要用于遮挡的部分,保存为 glb 格式。裁剪时保持模型的位置、旋转和缩放不变,以便导入 Unity 后与 Block 对齐。

将模型导入 Unity
将模型导入 Unity,并挂载至场景中对应的 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 数据模拟运行或实机运行,查看效果。
遮挡的效果预期
遮挡的效果主要由以下几点影响:
- 定位跟踪本身的精度
- 模型摆放的准确程度
- 模型本身的精度(如果不是简单的几何体)
在定位漂移时出现数公分未对齐的情况是正常的。
遮挡用的模型面数太多容易影响性能,建议只在必要区域使用,并且尽量使用简单的几何体作为遮挡。


