WebXR 游戏手柄模块 - 第 1 级

W3C 工作草案,

关于本文档的更多信息
该版本:
https://www.w3.org/TR/2025/WD-webxr-gamepads-module-1-20250707/
最新发布版本:
https://www.w3.org/TR/webxr-gamepads-module-1/
编辑草案:
https://immersive-web.github.io/webxr-gamepads-module/
以往版本:
历史记录:
https://www.w3.org/standards/history/webxr-gamepads-module-1/
反馈:
GitHub
编辑者:
(Google)
(Google [Mozilla 至 2020])
(Meta)
前任编辑:
(Amazon [2018年前为Microsoft])
参与方式:
提交问题 (开放问题)
邮件列表存档
W3C 的 #immersive-web IRC

摘要

本规范模块描述了在 Web 上访问与虚拟现实(VR)和增强现实(AR)设备相关的按钮、扳机、拇指杆和触控板数据的支持。

本文档状态

本节描述了本文档在发布时的状态。当前 W3C 发布物列表以及本技术报告的最新修订版可在 W3C 标准与草案索引中找到。

沉浸式 Web 工作组维护着 尚未处理的所有问题报告列表。本草案突出显示了工作组仍需讨论的一些待决问题。对于这些问题的结果,包括其是否有效,尚未作出决定。 强烈鼓励针对未解决问题的规范文本提出拉取请求。

本文档由 沉浸式 Web 工作组 作为工作草案,通过 推荐 路线 发布。本文档拟成为 W3C 推荐标准。

作为工作草案发布并不代表 W3C 及其成员的认可。本文档为草稿,可能随时被其他文档更新、替换或废弃。不应将本文档引用为除开发中工作之外的其他用途。

本文档由遵循 W3C 专利政策运作的小组制作。 W3C 维护着关于小组交付物的任何专利公开的公共列表;该页面也包含专利披露说明。任何实际知晓某项所含 必要声明的个人,必须按照 W3C 专利政策第6节进行披露。

本文档受 2023年11月3日W3C流程文档管理。

本 WebXR 游戏手柄模块设计为可在 WebXR 设备 API 之外实现的模块,最初包含在 WebXR 设备 API 中,后被拆分为核心和模块。

1. 简介

现在,支持虚拟现实(VR)和增强现实(AR)应用的硬件已广泛面向消费者,为用户带来沉浸式计算平台,既有新的机遇也伴随新的挑战。直接与沉浸式硬件交互的能力对于确保 Web 能够成为该环境中的一等公民至关重要。WebXR 游戏手柄模块为 WebXR Device API 及 Gamepads API 增加了接口与行为,以便查询许多兼容 WebXR 设备上可用的按钮、扳机、拇指杆和触控板的状态。

该模块是对 WebXR 设备 API 的补充。

1.1. 术语

本文档全篇采用缩写 XR 指代用于虚拟现实、增强现实及相关技术的硬件、应用和技术方案。例如,包括但不限于:

它们的重要共性在于都能实现一定程度的空间追踪,用于模拟虚拟内容的视图。

像“XR 设备”,“XR 应用”等术语一般适用于上述任何一种设备。仅适用于部分设备的内容将在文档中做出说明。

XR 设备通常会配备额外的控制器硬件,允许用户通过按钮、扳机、拇指杆或触控板输入与沉浸式体验交互。这些设备通常也会被空间追踪,被称为“运动控制器”、“手持控制器”或“追踪控制器”。

2. WebXR 设备 API 集成

WebXR 设备 API 中所定义,XRInputSource 表示一个 XR 输入源,也就是允许用户在与 viewer 相同虚拟空间中执行定向操作的任何输入机制。XR 输入源 的示例包括(但不限于)手持控制器、光学追踪手势输入,以及基于视线的输入方式等。

本文档概述了 XRInputSource 在可报告按钮、扳机、拇指杆或触控板数据时的行为。这通常是运动控制器,也可以是带有按钮、扳机、拇指杆或触控板的头显 XR 设备。如 WebXR 设备 API 所述,与 XR 设备 并无明确关联的输入机制(如传统手柄)不得视为 XR 输入源

2.1. XRInputSource

按钮、扳机、拇指杆和触控板数据通过关联于 XRInputSourceGamepad 对象进行报告。

partial interface XRInputSource {
  [SameObject] readonly attribute Gamepad? gamepad;
};

gamepad 属性是一个 Gamepad ,用于描述 XR 输入源 上所有按钮和轴的状态。如果 XR 输入源 不具备下列至少一项,则 gamepad 属性必须为 null

2.2. XRSession

XRInputSource 会在 inputSources 数组中作为设备连接或断开时汇报。当 gamepad 的存在性在 inputSources 数组的任何条目上发生变化时,User Agent 必须调用 WebXR Device API 的“响应输入源属性变化”算法。

帧更新列表 被更新为包含 应用游戏手柄帧更新

XRFrame frame 应用游戏手柄帧更新 时,User Agent 必须运行以下步骤:

  1. XRInputSource 拥有与 framesession 关联的 gamepad gamepad ,执行以下步骤:

    1. gamepad 更新为反映 frametime 时刻的游戏手柄数据。

注意:gamepad 对象是“活”的,所有内部状态应当在每一帧中就地更新。因此,将某帧的 XRInputSourcegamepad 引用后,与后续帧中的同一 XRInputSourcegamepad 直接作对象比较以判断状态变化会失败,因为它们总是同一个对象。想要实现帧到帧的输入状态比对,开发者应缓存相关状态值。

3. Gamepad API 集成

Gamepad 实例由 XRInputSourcegamepad 属性返回,其行为遵循 Gamepad API,并有额外的行为限制说明。

XRInputSource 关联的 Gamepad 可由 User Agent 选择暴露于 navigator.getGamepads() ,即使没有活跃的 XR 会话。这使得 XR 设备可以按常规手柄方式供使用,只要 User Agent 允许。

注意:[WEBXR-HAND-INPUT-1] 所述的手势追踪 XRInputSource 若 User Agent 允许,可带有 Gamepad 以支持基于手势的内容与基于手柄的内容兼容。

Gamepad API 说明可以通过调用 navigator.getGamepads() 获取 Gamepad 数据快照。但 XRInputSourcegamepad 属性返回的 Gamepad 实例不得包含在 navigator.getGamepads() 返回的数组中。

3.2. Gamepad

下列 Gamepad 属性当 GamepadXRInputSourcegamepad 返回时,必须满足如下行为约束:

3.3. "xr-standard" 手柄映射

"xr-standard" 映射定义于 Gamepad API,专供本规范使用。该映射表明 gamepad 的按钮和轴布局与下列表格尽可能一致。

欲上报 mapping"xr-standard" ,设备必须上报 targetRayMode"tracked-pointer" ,且 gripSpacenull。设备必须至少有一个独立于触控板或拇指杆的 主扳机主扳机必须触发该输入源的主操作。设备可选带有 主握持按钮,如有,此按钮必须触发该输入源的主握持操作。若设备不符合 "xr-standard" 映射要求,则可上报 gamepad ,其 mapping 为空字符串("")。仅允许 Gamepad 实例上报 "xr-standard" 映射,且该实例必须由 XRInputSource 上报。

按钮 xr-standard 映射 必选
buttons[0] 主扳机
buttons[1] 主握持按钮
buttons[2] 主触控板
buttons[3] 主拇指杆

xr-standard 映射 必选
axes[0] 主触控板 X
axes[1] 主触控板 Y
axes[2] 主拇指杆 X
axes[3] 主拇指杆 Y

缺失上述表格中任一可选输入的设备,必须保留其在 buttonsaxes 数组中的位置,依次上报 占位按钮占位轴占位按钮 必须上报 0valuefalsepressedfalsetouched占位轴 必须上报 0占位按钮占位轴 若为最后元素,或后续均为占位,则应省略。

允许在这些保留索引之后暴露更多按钮或轴,且应按重要性降序排列。相关轴(如拇指杆的两个轴)必须成组,并按 X、Y(Z)顺序表示。

3.4. UA/平台保留按钮

User Agent 应尽可能保留至少一个物理按钮,用于执行不可伪造的 可信 UI 操作。例如,User Agent 可指定许多控制器上都有的“菜单”或“应用”按钮为退出沉浸模式的专用键。

此外,许多 XR 平台还会为平台专属操作(如返回主页)保留一个按钮。

由 UA 或平台保留的按钮不得暴露于 Gamepad。 User Agent 还应协调 XR 平台应保留哪些按钮。推荐在 WebXR Input Profiles Registry 协调按钮的保留情况。

3.5. 示例映射

该图示演示了两种示例控制器用 "xr-standard" 映射暴露的方式。图片仅作参考,不代表任何实际设备。Simple 'xr-standard' controller and Advanced 'xr-standard' controller

4. 安全与隐私

WebXR 设备 API 提供了强大的新功能,同时也带来了多种独特的隐私、安全与舒适性风险,User Agent 必须采取措施加以防范。详见 WebXR 设备 API。本模块在此基础上补充说明,但不改变 WebXR 的基本安全与隐私原则

4.1. 指纹识别

由于 API 描述用户可用的硬件及其能力,因此不可避免地增加了指纹识别面。虽然无法彻底避免,User Agent 仍应采取措施降低风险。就如 WebXR 设备 API 所定义,XRInputSource 仅在建立 XRSession 后才会汇报,从而能在暴露 敏感信息 时采取额外保护措施。此外,本模块要求 XRInputSourcegamepad.id 不得返回字符串标识符。

变更

源自 2019年10月10日首次公开工作草案 的变更

5. 致谢

以下人员为 WebXR 设备 API 规范设计做出过贡献:

特别感谢 Vladimir Vukicevic (Unity),助力本项目的启动!

一致性

文档约定

一致性要求通过描述性断言和 RFC 2119 术语结合表达。 在本规范规范性部分中出现的 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY” 和 “OPTIONAL” 这些关键词,应按照 RFC 2119 的说明进行解释。 但为便于阅读,本规范中这些词不会全部用大写字母表示。

本规范的所有文本均为规范性内容,除非明确标记为非规范性、示例或注释。[RFC2119]

本规范中的示例以“例如”开头,或使用 class="example" 与规范性文本分开,格式如下:

这是一个信息性示例。

信息性注释以“注”开头,并使用 class="note" 与规范性文本分开,格式如下:

注:这是一个信息性注释。

一致性算法

算法部分用祈使句表述的要求(如“去除所有前导空格字符”或“返回 false 并中止这些步骤”),其含义应结合引入算法时所用关键词(如“must”、“should”、“may”等)理解。

以算法或具体步骤形式表述的规范性要求,可以通过任意方式实现,只要最终结果等效即可。特别是,本规范中定义的算法旨在便于理解,并未考虑高性能,实现者可自由优化。

索引

本规范定义的术语

引用中定义的术语

参考文献

规范性参考文献

[GAMEPAD]
Steve Agoston; Matthew Reynolds. Gamepad. 2025 年 6 月 12 日. WD. URL: https://www.w3.org/TR/gamepad/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997 年 3 月. 最佳实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 实时标准. URL: https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. 2025 年 4 月 17 日. CRD. URL: https://www.w3.org/TR/webxr/

信息性参考文献

[WEBXR-HAND-INPUT-1]
Manish Goregaokar. WebXR Hand Input Module - Level 1. 2024 年 6 月 5 日. WD. URL: https://www.w3.org/TR/webxr-hand-input-1/

IDL 索引

partial interface XRInputSource {
  [SameObject] readonly attribute Gamepad? gamepad;
};