开发

同时使用手和控制器(多模态)

更新时间: 2026年2月17日
多模态输入可以同时追踪手和控制器。它还能识别控制器是否在手中。多模态输入让用户能够享受两全其美的体验:不仅可以使用手势获得沉浸感,还能借助控制器实现精准操控和触感反馈。系统会自动检测控制器是握在手中还是已经离手(例如,放在桌子上),从而实现手势追踪和控制器输入之间的无缝切换。启用多模态输入后,它会覆盖其他切换方法,包括自动切换和双击。
如果您是使用 Unity 开发 Quest 体验的新手,请查看 Hello World 指南来创建您的第一个 VR 应用。

多模态输入的优点

  • 手 + 控制器的游戏玩法:一只手使用控制器,将其作为工具或武器(精准度高、有触感、视野宽),同时腾出另一只手与对象互动或施法(沉浸感高)。
  • 单控制器游戏玩法:如果体验中的大多数互动都只需要一个控制器,则允许用户只拿一个控制器,并在需要时用另一只手来进行沉浸式和随意的互动(例如,将控制器用作球拍,然后腾出另一只手来捡球和操作菜单)。
  • 交替使用手和控制器来提高舒适度:一只手与控制器进行直接互动,另一只手将控制器作为“遥控器”拿着,进行不费力的间接互动。
  • 在手和控制器之间即时切换:启用手势追踪后,控制器一离开手我们就能够识别出来。这可以最大程度地减少手动切换的需求,解决自动切换缓慢或失败的问题。
  • 找到我的控制器:现在使用双手时可以追踪控制器,用户想要拿起控制器时,应用可以向他们显示控制器的位置。这让用户可以更顺畅地切换回控制器,不必再打开透视或摘下头戴设备,从而进一步提高了沉浸感。

已知限制

  • “在手中”状态信号基于各种有瑕疵的信号,包括手势和控制器姿势以及控制器信号。因此,在某些追踪丢失或不准确的情况下,系统可能会显示控制器不在手中,或控制器在手中一动不动。建议在设计时考虑这一限制(例如,避免从控制器到手的瞬时切换错误,导致对象从手中掉落)。
  • 在调用暂停功能时,应用程序将切换回传统用手和控制器运行应用的“非同时”模式,即用户可以在给定时间使用手或控制器。追踪系统可能需要几秒时间来识别并决定是否启用正确的输入,具体取决于这种情况发生时用户是否手持控制器。
  • 在电脑上使用 Link 时,如果您不主动使用控制器(如控制器放在桌子上),则无法获得控制器的姿势数据。

兼容性

硬件兼容性

  • Quest 2
  • Quest Pro
  • Quest 3
  • Quest 3S

软件兼容性

  • Unity 2022.3.15f1 及以上版本 (建议使用 Unity 6 以上版本)
  • Meta XR 核心 SDK v62 及以上版本

功能兼容性

  • 多模态输入与内向外身体追踪 (IOBT) 和全身合成 (FBS) 不兼容。您不能同时启用它们。
  • 多模态输入无法与快速运动模式 (FMM) 同时启用。如果两者都启用了,将优先运行多模态。由于 FMM 已在清单中定义,因此您可以先在应用层面启用 FMM,然后仅在 FMM 不那么重要的特定体验中打开多模态。
  • 在 Quest 2 上,多模态无法与对口型功能一同启用
  • 透视、多模态输入和宽运动模式 (WMM) 无法一同启用。如果同时启用它们,系统将禁用 WMM。
  • 与触摸感应手完全兼容。
  • 与触感反馈完全兼容。

设置

  1. 安装 Meta XR 核心 SDK 包 V74 或更高版本
  2. 请遵循适用于 Meta Quest VR 头戴设备的 Unity Hello World 中的说明,设置相机装备和控制器。
  3. 找到附加至 OVRCameraRigOVR Manager 脚本。在 Quest Features(Quest 功能)下,将 Simultaneous Hands And Controllers(同时使用手和控制器)设置为 Supported(支持)或 Required(必需)。
    Enable concurrent hands and controllers
  4. Window(窗口)> Package Management(包管理)> Package Manager(包管理工具)下,找到 Meta XR Core SDK(Meta XR 核心 SDK),然后在 Samples(示例)选项卡下,点击 Import(导入)。这将导入多模态示例场景。
    Import the sample scene
  5. Project(项目)下,搜索 OVRControllerPrefab
  6. 将搜索结果中的 OVRControllerPrefab 拖动到新 GameObject LeftHandAnchorDetachedRightHandAnchorDetachedHierarchy(层级结构)中。演示请见 Assets/Samples/Meta XR Core SDK/<version>/Sample Scenes/SimultaneousHandsAndControllers.unity
    Add OVRControllerPrefab objects
  7. 对于新 GameObject OVRControllerPrefab,将它们的 ShowState(显示状态)设置为 Controller Not In Hand(控制器不在手中),并将 Controller(控制器)设置为 Touch(触摸)。
    Set ShowState
  8. Project(项目)下,搜索 OVRControllerPrefab
  9. 将搜索结果中的 OVRControllerPrefab 拖动到 LeftControllerInHandAnchor
  10. Hierarchy(层级结构)下,选择 OVRControllerPrefab
  11. Inspector(检查器)下,将 Controller(控制器)设置为匹配手,将 Show State(显示状态)设置为 Controller In Hand(控制器在手中)。
    Anchor setup for controllers
  12. RightControllerInHandAnchor 重复第 9 到 11 步。
  13. Project(项目)下,搜索 OVRHandPrefab
  14. 将搜索结果中的 OVRHandPrefab 拖动到 LeftHandOnControllerAnchor
  15. Inspector(检查器)下,确保将 Hand Type(手的类型)设置为匹配手,并将 Show State(显示状态)设置为 Controller In Hand(控制器在手中)。
    Anchor setup for hands
  16. RightHandOnControllerAnchor 重复第 14 到 15 步。

更改 Prefab

OVRControllerHelper 和 OVRHand 有 enumShowState,提供以下选项:
  • Always(总是):该对象不会根据控制器和手的状态自动禁用。
  • Controller in Hand or no Hand(控制器在手中或无手):这意味着如果控制器不在用户手中,或手势追踪被完全禁用,则将禁用该对象。
  • Controller in Hand(控制器在手中):这意味着如果控制器当前不在用户手中,则将禁用该对象。
  • Controller Not in Hand(控制器不在手中):这意味着如果控制器在用户手中,则将禁用该对象。这用于控制器与人分离的情况,例如,放在桌子上。
  • No Hand(无手):如果启用手势追踪且检测到手部,则将停止渲染对象。
OVRControllerPrefab:OVRControllerHelper
  • Show State(显示状态)
  • Show When Hands Are Powered By Natural Controller Poses(手由自然的控制器姿势驱动时显示):此复选框用于控制,即使手部姿势处于自然状态,是否仍可渲染控制器。这适用于控制器离手的情形。
OVRHandPrefab:OVRHand
  • Show State(显示状态)

多模态功能的新锚点

  • LeftHandAnchorDetachedRightHandAnchorDetached:在启用“同时使用手和控制器 API”时,这些锚点可用于不在用户手中的控制器。默认的 CameraRig prefab 不包含这些锚点下的控制器 prefab,因此需要添加它们才能使用。这些 Prefab 的显示状态应设置为 Controller Not In Hand(控制器不在手中)。

离手状态控制器配置文件

启用多模态后,SDK 会使用专门的离手状态控制器配置文件来追踪当前不在用户手中的控制器。这些配置文件会自动注册到以下类型的控制器:
  • Oculus Touch 控制器 - 标准 Touch 控制器
  • Meta Quest Touch Pro 控制器 - 增强功能版 Touch Pro 控制器
  • Meta Quest Touch Plus 控制器 - Touch Plus 控制器
SDK 会根据 OpenXR 运行时检测到的当前互动配置文件,自动在标准控制器配置文件(控制器在手上时)和离手状态控制器配置文件(控制器放下时)之间进行切换。这样,系统便可以同时追踪您的手部和离手的控制器的实际位置。

疑难解答

如何确认我的头戴设备正在运行多模态?

确认离手控制器操作路径正在提供数据。

我能否在不修改代码的情况下,在头戴设备上评测该功能?

不能。

示例中,控制器与手之间无法切换。

请确保您使用的设备是 Quest 2(使用与头戴设备配对的 Meta Quest Pro 控制器)、Quest 3、 Quest 3S 或 Quest Pro。
Using OVRCameraRig -> TrackingSpace to get positions of hands and controllers simultaneously
OVRCameraRig 的 Tracking Space(追踪空间)对象层级结构让它难以通过旧锚点同时提供手部和控制器数据。这要求我们在 Tracking Space(追踪空间)上创建多个新锚点,并在控制器和手势 Prefab 上添加是否要渲染的门控逻辑。