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 使 PositionRotation 均全部为 0

此时用于遮挡的白模应该和稠密模型贴合,这是因为在数字内容创建软件中进行裁剪和减面操作时,并没有改变 Block 坐标系的定义。

遮挡模型贴合

为模型赋予遮挡材质

将模型材质修改为遮挡材质,可以使用 Unity 自带的 SpatialMappingOcclusion

遮挡模型更换材质

使用 EIF 数据模拟运行或实机运行

使用 EIF 数据模拟运行或实机运行,查看效果。

遮挡的效果预期

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

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

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

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

相关主题