3.3 空间重建:网格、语义、锚点


3.3 空间重建:网格、语义、持久锚点

本节摘要:SLAM 给完"我在哪"之后,XR 系统还要回答"周围是什么"——这是空间重建。本节讲三件套:场景网格(Mesh,环境的 3D 几何)、语义理解(Semantic,环境的物体类别)、持久锚点(Persistent Anchor,跨会话保留的虚拟物体位置)。三者合起来让虚拟物体在真实环境里"住下来"。

本节目标

阅读完本节,你应当能够:

  1. 说出场景网格、语义理解、持久锚点三件套各自解决的问题。
  2. 解释 ARKit 的 SceneReconstruction 与 ARCore 的 Scene Semantics API 的差异。
  3. 在 Unity 里启用场景网格,并用射线检测做遮挡判断。
  4. 描述持久锚点的工作原理——为什么它能跨会话保留。

一、问题与直觉

仅有 6DoF 跟踪,虚拟物体只是"贴在头显坐标系"——头一摘,物体就没了。要让虚拟物体"住"在真实环境里,需要三件事:

  • 场景网格:环境的几何结构(哪是墙、哪是地、哪是桌)。
  • 语义理解:环境的物体类别(这是椅子、这是门、这是地板)。
  • 持久锚点:跨会话保留的"挂载点"(这面墙的虚拟挂钟,下次回来还在)。

这三件事构成了 XR 系统对"周围是什么"的回答。

二、场景网格:环境的 3D 几何

场景网格(Scene Mesh)是把环境重建为 3D 三角面片的过程。Quest 3、HoloLens 2、Vision Pro 都默认开启。

// 1. Quest 3: 启用 Experimental Scene Understanding ovrManager.sceneManager.Launch(); foreach (var scene in ovrManager.sceneManager.Scene) { foreach (var mesh in scene. meshes) { // mesh 是 Unity Mesh 对象,可以做射线检测 if (Physics.Raycast(ray, out var hit, 100f)) Debug.Log($"命中网格: {hit.point}"); } }

Quest 3 的场景网格精度:1cm 三角面、50m² 范围、占用内存约 5-20MB。HoloLens 2 网格精度更高(亚厘米),范围更大(200m²)。Vision Pro 网格密度介于两者之间(2cm 三角面)。

场景网格的核心应用是遮挡——上一节渲染管线讲过,没有场景网格,MR 段的金标准"虚拟物体被真实桌角遮挡"就做不到。

三、语义理解:环境的物体类别

场景网格只回答"哪是几何",语义理解(Semantic Understanding)回答"哪是物体"。当前 XR 的语义理解分两类:

  • 平面语义:把场景网格里的水平面分类为"地板/桌面/床/沙发"等。ARCore 的 Scene Semantics API 输出每像素的"地板概率"(0-1)。
  • 物体语义:识别"这有一把椅子""这有一扇门"。HoloLens 2 的 Spatial Mapping + Object Recognition 输出物体 bounding box。

Quest 3 当前没有公开的物体语义 API(Meta 在 2024 年逐步开放 Experimental Scene Understanding API)。Vision Pro 通过 ARKit 的 RoomPlan API 输出"房间"级别的语义结构——能识别出墙、门、家具、装饰物,并生成 USDZ 格式的 3D 房间模型。

四、持久锚点:让虚拟物体"住"在真实环境

持久锚点(Persistent Anchor)是 AR 体验能"长期保留"的关键。一个锚点包含两件事:

  1. 位姿:在空间中的 6DoF 位置。
  2. 特征描述:锚点附近环境的特征描述子(ORB/SIFT)。

锚点保存到云端或本地。下次回到同一位置,XR 系统提取当前位置的特征描述子,与已保存的锚点描述子做匹配——找到匹配后,把锚点位姿重新映射回当前会话的坐标系,虚拟物体就回到了原位。

Vision Pro 的"持久锚点"能力是它在 MR 段领先的关键:

  • 锚点可以跨设备共享(同一 Apple ID 下);
  • 锚点可以附带"元数据"(USDZ 资产、自定义 JSON);
  • 锚点可以由用户在 Vision Pro 里手动放置,也可以由应用自动放置。

ARCore 的 Persistent Cloud Anchor API 也提供类似能力,但精度和跨设备体验略弱。

五、动手演示:在 Unity 里做场景网格遮挡

// 1. 启用 Quest 3 场景理解 public class QuestSceneMesh : MonoBehaviour { void Start() { OVRSceneManager sceneManager = GetComponent<OVRSceneManager>(); sceneManager.VerboseLogging = true; sceneManager.SceneModelLoaded += OnSceneLoaded; } void OnSceneLoaded(OVRSceneModel scene) { // 2. 把场景网格的每个 MeshFilter 加到 Physics 引擎 foreach (var filter in scene. meshes) { filter.gameObject.AddComponent<MeshCollider>(); } } }

跑起来后:你在客厅走一遍,Quest 3 自动建出 50m² 的场景网格。然后放一只虚拟蝴蝶在桌角附近——把头转向桌角另一侧时,蝴蝶会被桌角正确遮挡。

💡 关键直觉:场景网格是 MR 的"基础设施"——没有它,"虚拟物体被真实物体遮挡"做不到;"虚拟物体能识别真实物体并与之交互"也做不到。

本节要点回顾

  • 空间重建三件套:场景网格(几何)、语义理解(物体类别)、持久锚点(跨会话保留)。
  • 场景网格是 MR 的基础设施——没有它,遮挡和碰撞都做不出来。
  • 语义理解分平面语义和物体语义两层,Vision Pro 的 RoomPlan 输出最完整。
  • 持久锚点通过"位姿+特征描述子"匹配,让虚拟物体"住"在真实环境里。
  • 在 Unity 里启用场景网格 5 行代码搞定,再加 MeshCollider 就能做射线检测。

下一节我们看第四个支柱:交互——手势、眼动、语音。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U