3.4 交互:手势、眼动、语音


3.4 交互:手势、眼动、语音

本节摘要:渲染、跟踪、空间重建解决了"看见可信的虚拟",但要"操作虚拟"还需要输入识别。本节讲 XR 三大输入模态:手势(21 节点骨骼模型)、眼动(注视点估计)、语音(前端信号处理)。每一模态讲原理+工程挑战+一段最小代码。最后给出一个"多模态融合"的设计框架——Vision Pro 的"看+捏"组合是该框架的标杆。

读完你能掌握

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

  1. 解释 21 节点手部骨骼模型,并说出手势识别的 3 个工程难点。
  2. 描述眼动注视点估计的工作原理和精度。
  3. 解释语音识别在前端信号处理上的工程挑战。
  4. 在 Unity 里写一段代码同时订阅手势捏合+眼动注视+语音指令。

一、问题与直觉

XR 交互和传统 GUI 交互最大的差异是"输入模态"——传统 GUI 用"鼠标+键盘"二维输入,XR 用"手势+眼动+语音+手柄"三维输入。每一模态都解决一种"原语":

  • 手势:原语是"操作"——抓、捏、推、拉。
  • 眼动:原语是"选择"——看哪儿、停多久。
  • 语音:原语是"指令"——命令、提问、命名。

把这三原语组合起来,可以覆盖几乎所有 XR 交互场景。

二、手势:21 节点骨骼模型

XR 手势识别的目标是"实时估计 21 个手部关节点的 6DoF 位置"。这 21 个节点是:手腕 1 个、手掌 4 个(每指根 1 个)、每根手指 4 个关节 × 5 根手指。

工程实现:

  • 基于摄像头的方案:头显鱼眼摄像头拍手部图片,AI 模型(CNN 或 Transformer)回归 21 个 3D 关键点。Quest 3、HoloLens 2、Vision Pro 都用这一派。延迟 30-50ms,精度 1-2cm。
  • 基于 EMG 的方案:前臂肌电传感器识别肌肉电信号,预测手指动作。延迟 <10ms,但识别种类有限(通常 6-8 种)。
  • 基于深度摄像头的方案:用深度信息直接重建手部 mesh。HoloLens 2 早期用 Intel RealSense。

手势识别的 3 个工程难点:

  1. 遮挡:手背对摄像头时,5 根手指互相遮挡——需要靠 IMU 或预测补全。
  2. 光线敏感:强光/弱光下手部特征点提取失败。
  3. 精度不稳:快速手势下,AI 模型的 21 节点回归抖动——需要卡尔曼滤波平滑。

三、眼动:注视点估计

上一章讲过,眼动追踪用红外照明+红外摄像头拍瞳孔+角膜反射斑,由 AI 模型估计注视点。

工程实现分三步:

  1. 瞳孔检测:CNN 模型定位瞳孔中心(精度 0.5°)。
  2. 角膜反射:定位红外 LED 在角膜上的反射斑(精度 0.1°)。
  3. 注视点估计:瞳孔-反射斑的向量经几何变换得到注视点。

精度与延迟:

  • Quest Pro: 0.5-1°,延迟 10-15ms。
  • Vision Pro: 0.5°,延迟 12ms。
  • PSVR2: 0.5°,延迟 10ms。

眼动有两个关键应用:

  • 注视点渲染:用注视点区域做全分辨率渲染,省 GPU 30-50%。
  • UI 选择:用户"看哪儿"就"选哪儿",用捏合或语音确认。

四、语音:前端信号处理

XR 语音识别和手机/智能音箱的差异是"近场+强噪声"。XR 头显离嘴 5-15cm,距离近;周围又有头显电机噪声+环境噪声。前端处理要做:

  • 回声消除(AEC):去掉头显外放的声音被麦克风重新拾取的部分。
  • 降噪(NS):用神经网络(如 DeepFilterNet)滤掉稳态噪声。
  • 波束成形(Beamforming):用 2-4 麦克风阵列做空间滤波,指向嘴部。

识别引擎方面,Vision Pro 用设备内置 ASR(on-device);Quest 3 默认接 Meta AI 云端;HoloLens 2 接 Azure 认知服务。

五、动手演示:多模态融合交互

下面这段代码在 Quest 3 上订阅"手势捏合 + 眼动注视 + 语音指令"三种输入,让一个虚拟按钮同时支持三种触发方式:

using UnityEngine.XR; public class MultiModalButton : MonoBehaviour { [SerializeField] private Transform gazeTarget; private float _gazeDuration = 0f; void Update() { // 1. 眼动注视检测 var eye = InputDevices.GetDeviceAtXRNode(XRNode.EyeGaze); if (eye.TryGetFeatureValue(EyeGazeUsages.gazePosition, out Vector3 gazePos)) { // 计算注视点在场景中 var ray = new Ray(Camera.main.transform.position, (gazePos - Camera.main.transform.position).normalized); if (Physics.Raycast(ray, out var hit, 10f) && hit.transform == transform) _gazeDuration += Time.deltaTime; else _gazeDuration = 0; } // 2. 手势捏合(Vision Pro / Quest 3 都有) var hand = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); if (hand.TryGetFeatureValue(CommonUsages.gripButton, out bool grip) && grip && _gazeDuration > 0.5f) { Debug.Log("注视 + 捏合 → 触发按钮"); _gazeDuration = 0; } // 3. 语音指令(需要 ASR 服务,简化示例) // if (SpeechRecognizer.IsActive && SpeechRecognizer.Text == "click") // Trigger(); } }

跑起来后:用眼动注视虚拟按钮 0.5 秒 + 捏合手势 → 触发;或者注视 + 语音 "click" → 触发。这就是 Vision Pro 的"看+捏"组合的核心范式。

本节要点回顾

  • 手势、眼动、语音是 XR 三大输入模态,分别对应"操作、选择、指令"原语。
  • 手势识别的三大难点:遮挡、光线敏感、精度抖动。
  • 眼动精度 0.5-1°,延迟 10-15ms,核心应用是注视点渲染+UI 选择。
  • XR 语音前端处理的核心是 AEC+降噪+波束成形。
  • Vision Pro 的"看+捏"组合是多模态融合的标杆——同一交互用眼动+手势双通道冗余,可靠性最高。

下一章我们从算法层进入工程层——Unity/Unreal/OpenXR/SDK 选型与一条 XR 项目的完整流水线。


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