场景理解为 MRMesh 提供了根据其解释用途(如墙壁、地板、天花板和桌子)分类的平面。 用例类似于空间映射,但网格具有此附加的元数据,并将呈现为平面而不是粗略网格。
有关详细信息,请参阅场景理解文档。
注意
从全息远程处理版本 2.8.0 开始,场景理解完全受支持。
先决条件
重要
场景理解需要 Microsoft OpenXR 插件和 Unreal 4.27.1 或更高版本。
必须使用 Microsoft OpenXR 插件,可从 Unreal Marketplace 或 GitHub 获得。
或者,首先查看 OpenXR 示例应用程序,了解如何使用场景理解。
安装
启用 HoloLens 上的场景理解:
- 打开“编辑”>“项目设置”,并向下滚动到“平台”部分。
- 选择“HoloLens”,然后选择“空间感知”。
在 HoloLens 游戏中选择加入场景理解并使用 MRMesh:
- 打开“ARSessionConfig”并展开“ARSettings”>“世界映射”部分。
- 选中“从跟踪几何生成网格数据”,可指示 HoloLens 插件开始异步获取场景理解数据,并通过 MRMesh 将其呈现给 Unreal。
- 或者,选中“在线框中呈现网格数据”,以显示 MRMesh 中每个三角形的白色线框轮廓。
- 在第二个 arsettings 下拉列表中,找到“水平平面检测”和“垂直平面检测”复选框。 如果你的体验只需要水平或垂直平面,则可以有选择地禁用这些功能。 默认情况下,将同时使用水平和垂直平面。
可选的 ini 设置
可以修改以下参数以更新空间映射运行时行为:
- 打开“编辑”>“项目设置”,向下滚动到“平台”部分,并选择“HoloLens” >“空间映射”:
- “空间网格体积大小”是在玩家周围渲染和更新场景理解数据的球体的直径。
- 如果预期的应用程序运行时环境很大,那么这个值可能需要很大才能匹配实际空间。 如果应用程序只需要将全息影像直接放置在用户周围的表面上,那么这个值可能会较小。 当用户在世界内走动时,空间映射卷将随之移动。
使用场景理解时,较大的扫描体积可能会影响性能,因为生成的网格比空间映射要多。 为了降低绘图调用,可使用额外的 ini 设置来限制体积高度:
- 在游戏的 Config/DefaultGame.ini 文件中,添加一个具有可选设置的节 [/Script/HoloLensSettings.SceneUnderstanding]:
[/Script/HoloLensSettings.SceneUnderstanding]
SceneUnderstandingVolumeHeight=4
ShouldDoSceneUnderstandingMeshDetection=true
SceneUnderstandingVolumeHeight 会将场景理解扫描体积限制为具有此高度且两边长度为空间网格体积大小的矩形棱柱。
ShouldDoSceneUnderstandingMeshDetection 将为每个标识的平面添加网格。 网格在重叠某些表面(例如桌子)时将比平面更准确,但会产生额外的绘制和计算调用。 默认情况下,将只检测平面。
使用 MRMesh
首先需要启动 ARSession:
然后,需要启动场景理解:
在此示例中,我们将检查 CanDetectPlanes 函数以检查是否应切换场景理解或空间映射。 这将允许代码在远程处理和 HoloLens 设备上运行。 否则,当远程处理不返回任何平面时,可切换场景理解。
若要在运行时访问 MRMesh,请执行以下操作:
- 将“ARTrackableNotify”组件添加到蓝图角色。
- 选择“ARTrackableNotify”组件,然后在“详细信息”面板中展开“事件”部分。
- 在要监视的事件上,选择 按钮+。
可以在 UARTrackableNotify 组件 API 中找到事件的完整列表。
在此示例中,由于标识了 MRMeshes,因此会查询其对象分类,并根据表面所属类型设置不同的材料。
若要对场景理解网格执行冲突测试,可以使用 LineTraceTrackedObjects3D:
禁用“测试平面区”以对仅场景理解网格执行命中测试,否则将使用网格和平面。 平面并不能总是涵盖真实的几何,因此,如果使用,则会导致错误的冲突。 例如,打开的门廊将被它周围的墙壁覆盖。
可从跟踪结果中查询跟踪的几何和对象分类,因此,可根据你是撞到了墙还是桌子来执行不同的功能。
在此示例中,调试坐标系统绘制在最近的场景理解网格上的冲突点上。