场景理解

场景理解为混合现实开发人员提供了结构化的高级别环境表示,旨在直观地为环境感知型应用程序进行开发。 场景理解通过将现有的混合现实运行时(例如高度准确但结构化较弱的空间映射)与新的 AI 驱动运行时的功能相结合来实现这一点。 通过将这些技术结合在一起,场景理解可生成 3D 环境的表示形式,这些环境类似于你在 Unity 或 ARKit/ARCore 等框架中可能用过的环境。 要使用场景理解,从场景观察程序开始,应用程序可调用它来计算新场景。 目前,该技术可生成 3 个不同但又相关的对象类别:

  • 简化的水密环境网格,它可推理平面房间结构而不导致混乱
  • 用于放置的平面区域,我们将其称为“四边形”
  • 空间映射网格快照,它与我们呈现的四边形/水密数据一致

Spatial mapping mesh, labeled planar surfaces, watertight mesh

本文档旨在提供方案概述,并阐明场景理解与空间映射共有的关系。 若要查看场景理解的实际运用情况,请查看下面“设计全息影像 - 空间感知”视频演示

此视频取自“设计全息影像”HoloLens 2 应用。 请在此处下载并畅享完整体验。

使用场景理解进行开发

本文仅用于介绍场景理解运行时和概念。 如果你在查找文档了解如何使用场景理解进行开发,可能会对以下文章感兴趣:

场景理解 SDK 概述

可从示例 GitHub 网站下载场景理解示例应用:

场景理解示例

如果你没有设备,但想要访问示例场景来尝试场景理解,示例资产文件夹中有一些场景:

场景理解示例场景

SDK 中 IsInRole 中的声明

如果你在查找有关使用场景理解进行开发的具体详细信息,请参阅场景理解 SDK 概述文档。

示例

设备支持

功能 HoloLens(第一代) HoloLens 2 沉浸式头戴显示设备
场景理解

常见使用方案

Illustrations of common Spatial mapping usage scenarios: Placement, Occlusion, Physics and Navigation
常见空间映射使用方案图示:封闭、物理和导航。


环境感知应用程序的很多核心方案可通过空间映射和场景理解来处理。 这些核心方案包括放置、封闭、物理等。 场景理解和空间映射之间的核心区别是,在最大准确性和延迟与结构和简单性之间的权衡。 如果你的应用程序需要尽可能低的延迟和只有你想要访问的网格三角形,那么请直接使用空间映射。 如果你要执行更高级别的处理,则可考虑切换到场景理解模型,因为它还提供空间映射没有的功能。 你将始终有权访问尽可能完整和准确的空间映射数据,因为场景理解在其呈现中还提供空间映射网格的快照。

以下部分将在新的场景理解 SDK 的上下文中,重新探讨核心空间映射方案。

定位

场景理解提供了旨在简化放置方案的新构造。 场景可计算被称作 SceneQuad 的图元,它描绘了可将全息影像放置到的平面。 SceneQuad 围绕放置而设计,它描绘 2D 图面并提供 API 来在该图面上放置物体。 以前,在使用三角形网格进行放置时,必须扫描四边形的所有区域,并进行空洞填充/后处理,才能识别到好的位置来放置对象。 这对于四边形来说并非总是必要的,因为场景理解运行时会推断没有扫描哪些四边形区域,并使图面上没有的区域失效。

SceneQuads with inference disabled, capturing placement areas for scanned regions.
图像 1 - 已禁用推理的 SceneQuad,捕获已扫描区的放置区域。

Quads with inference enabled, placement is no longer limited to scanned areas.
图像 2 - 已禁用推理的四边形,不再局限于放置到已扫描的区域。


如果你的应用程序计划将 2D 或 3D 全息影像放置在精确的环境结构上,那么首选利用 SceneQuad 在放置方面的简单性和便利性,根据空间映射网格计算此信息。 有关此主题的详细信息,请查看场景理解 SDK 参考

注意 对于依赖空间映射网格的传统放置,可通过设定 EnableWorldMesh 设置,连同 SceneQuad 一起计算空间映射网格。 如果场景理解 API 不满足应用程序的延迟要求,则建议继续使用空间映射 API

封闭

空间映射封闭仍然是以最低延迟捕获环境实时状态的方式。 虽然这对于在高度动态的场景中提供封闭可能很有用,但出于多种原因,你可能希望考虑使用场景理解来进行封闭。 如果使用由场景理解的空间映射网格,则可从空间映射中请求未存储在本地缓存且无法通过感知 API 使用的数据。 将空间映射连同水密网格一起用于封闭将提供额外价值,尤其是完成未扫描的房间结构。

如果你的要求可容忍场景理解造成的更高延迟,那么应用程序开发人员应考虑使用场景理解水密网格,并将空间映射网络与平面表示一起使用。 这将提供“兼具两者最佳功能”的方案,其中简化的水密封闭与更精细的非平面几何图形搭配使用,提供尽可能逼真的封闭图层。

物理

场景理解可生成水密网格,它们通过语义分解空间,特别是用来应对空间映射网格向物理特性施加的多个限制。 水密结构可确保物理射线始终命中,而语义分解使得可针对室内导航更轻松地生成导航网格。 如关于封闭的部分所述,使用 EnableSceneObjectMesh 和 EnableWorldMesh 创建场景将尽可能生成在物理上完整的网格。 环境网格的水密属性使得命中测试肯定能命中图面。 网格数据将确保物理特性与场景中的所有对象(而不仅仅是房间结构)进行交互。

按语义类进行分解的平面网格是用于导航和路径规划的最理想构造,它们减轻了空间映射导航概述中描述的很多问题。 场景中计算得到的 SceneMesh 对象按图面类型进行分解,确保仅对可在其上走动的图面生成导航网格。 由于地面结构很简单,根据实际要求,可在 3D 引擎(例如 Unity)中生成动态导航网格。

目前,要生成准确的导航网格仍然需要后处理,也就是说,应用程序仍然必须将遮挡物体投射到地面上,来确保导航不会遇到混乱/表格等等。 要做到这一点,最准确的方法是投射世界网格数据,使用 EnableWorldMesh 标志计算场景时会提供此数据。

可视化效果

虽然可使用空间映射可视化效果获得实时环境反馈,但在很多方案中,平面和水密对象的简单性提供了更高的性能或视觉质量。 如果投射到四边形或平面水密网格提供的平面图面上,那么使用空间映射描述的阴影投射和基点技术可能效果更好。 在完全预扫描并非最优方法的环境/方案中尤其如此,原因是场景将推理和补全环境,并且平面假设将使项目最小化。

此外,空间映射返回的图面总数受到内部空间缓存的限制,而场景理解的场景理解网格版本可访问没有缓存的空间映射数据。 因此,更适合使用场景理解来捕获大型空间(例如,比单个房间大的空间)的网格表示,从而获得可视化效果或进一步处理网格。 使用 EnableWorldMesh 返回的世界网格将始终具有一致的详细级别,如果以有线帧的形式呈现,这可能会得到更棒的可视化效果。

另请参阅