Table of Contents

在 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 数据模拟运行或实机运行,查看效果。

遮挡的效果预期

遮挡的效果主要由以下几点影响:

  • 定位跟踪本身的精度
  • 模型摆放的准确程度
  • 模型本身的精度(如果不是简单的几何体)

在定位漂移时出现数公分未对齐的情况是正常的。

遮挡用的模型面数太多容易影响性能,建议只在必要区域使用,并且尽量使用简单的几何体作为遮挡。

相关主题