本节摘要:XR 第一道门槛是"知道我在哪、头转到哪"。这由 6DoF 跟踪系统解决。本节拆开视觉惯性里程计(VIO)的工作原理、Inside-out 与 Outside-in 两条工程路线、SLAM 的图优化(Pose Graph Optimization);再用一个最小代码演示如何在 Unity 里订阅头手 6DoF 数据。
阅读完本节,你应当能够:
XR 头显的"动"有三个层次:
要拿到 6DoF,必须解决"绝对位置"问题——这要靠 SLAM。
VIO(Visual-Inertial Odometry)把两个传感器合起来用:
VIO 解决的是"我这一秒到下一秒的相对运动"。它的输出是 6DoF 位姿,延迟 5-15ms,精度 1cm 以内。但它有两个失效场景:
ARCore 解决方法是"运动追踪(Motion Tracking)"和"深度(Depth)"两个 API 配合——深度图能补强低纹理场景。ARKit 用 Visual-Inertial Odometry + ARKit 自研的特征描述子。
第 2 章硬件那一节我们提过,这里展开工程细节:
Quest 3 是 Inside-out 标杆:4 颗鱼眼摄像头(前面 2 颗 + 两侧 2 颗)+ 红外泛光照明,6DoF 误差 <1cm,房间尺度漂移 <5mm/分钟。Vision Pro 用 2 颗鱼眼 + 2 颗 LiDAR,LiDAR 提供深度辅助,能在低纹理场景下更稳。
VIO 是"里程计"——只关心相对运动。SLAM(Simultaneous Localization and Mapping)在 VIO 基础上同时建图:每 10-30 秒做一次"回环检测"(Loop Closure)——当前位置和曾经到过的位置相似时,做一次图优化(Pose Graph Optimization)把累积漂移修正掉。
回环检测的关键技术:
Pose Graph Optimization 把"头转过的路径"建成一个图——每个节点是某一时刻的位姿,每条边是相邻两时刻的相对运动。回环检测发现"这两时刻在同一位置"时,新增一条边。优化求解时用 g2o / GTSAM 这类图优化库,把所有节点的位置+朝向同时优化,把累积漂移修正掉。
⚠️ 常见坑:很多团队以为用 VIO 就够了。但 VIO 的累积漂移在 10 分钟后会达到 1m 级——必须叠加 SLAM 回环检测。在 AR 锚点这种"贴在墙上过 10 分钟还要找得到"的场景,回环是必须的。
Unity + OpenXR 里订阅头部和手柄 6DoF:
using UnityEngine.XR; public class XrInputReader : MonoBehaviour { void Update() { // 1. 头部 6DoF var head = InputDevices.GetDeviceAtXRNode(XRNode.Head); if (head.TryGetFeatureValue(CommonUsages.devicePosition, out Vector3 headPos) && head.TryGetFeatureValue(CommonUsages.deviceRotation, out Quaternion headRot)) { Debug.Log($"头位置: {headPos:F3} 旋转: {headRot.eulerAngles:F1}"); } // 2. 右手 6DoF var rightHand = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); if (rightHand.TryGetFeatureValue(CommonUsages.devicePosition, out Vector3 rPos) && rightHand.TryGetFeatureValue(CommonUsages.deviceRotation, out Quaternion rRot)) { Debug.Log($"右手: {rPos:F3}"); } // 3. 手柄按键 if (rightHand.TryGetFeatureValue(CommonUsages.triggerButton, out bool trigger)) if (trigger) Debug.Log("扳机按下"); } }
把这段代码放到空场景里,戴上头显挥挥手——你就能在 Console 看到 6DoF 数据流。
把 VIO(视觉+IMU 融合)的数据流画出来——能直观看到高频 IMU 与低频视觉怎么融合。

下一节我们看第三个支柱:空间重建——SLAM 给完"我在哪"之后,怎么回答"周围是什么"。