WebVR API

已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。

非标准:此特性未标准化。我们不建议在生产环境中使用非标准特性,因为它们浏览器支持有限,并且可能会更改或被移除。但是,在没有标准选项的特定情况下,它们可以是合适的替代方案。

注意: WebVR API 已被 WebXR API 取代。WebVR 从未被批准为标准,在少数浏览器中默认实现和启用,并支持少量设备。

WebVR 为将虚拟现实设备(例如,Oculus Rift 或 HTC Vive 等头戴式显示器)暴露给 Web 应用程序提供了支持,使开发人员能够将显示器的位置和运动信息转换为 3D 场景中的运动。这有许多有趣的应用程序,从虚拟产品参观和互动培训应用程序到沉浸式第一人称游戏。

概念与用法

连接到您计算机的任何 VR 设备都将通过 Navigator.getVRDisplays() 方法返回;每个设备都将由一个 VRDisplay 对象表示。

Sketch of a person in a chair with wearing goggles labelled "Head mounted display (HMD)" facing a monitor with a webcam labelled "Position sensor"

VRDisplay 是 WebVR API 中的核心接口——通过其属性和方法,您可以访问以下功能:

  • 检索有用的信息,以帮助我们识别显示器、其功能、与之关联的控制器等。
  • 为要显示在显示器中的每一帧内容检索帧数据,并以一致的速率提交这些帧进行显示。
  • 开始和停止向显示器呈现内容。

一个典型的(简单)WebVR 应用程序将像这样工作:

  1. Navigator.getVRDisplays() 用于获取 VR 显示器的引用。
  2. VRDisplay.requestPresent() 用于开始向 VR 显示器呈现内容。
  3. WebVR 专用的 VRDisplay.requestAnimationFrame() 方法用于以显示器正确的刷新率运行应用程序的渲染循环。
  4. 在渲染循环中,您获取显示当前帧所需的数据 (VRDisplay.getFrameData()),将显示的场景绘制两次——一次用于每只眼睛的视图,然后将渲染的视图提交给显示器以显示给用户 (VRDisplay.submitFrame())。

此外,WebVR 1.1 在 Window 对象上添加了许多事件,允许 JavaScript 响应显示器状态的变化。

注意:您可以在我们的 使用 WebVR APIWebVR 概念文章中找到更多关于 API 工作原理的信息。

API 可用性

WebVR API 从未被批准为网络标准,已被弃用,取而代之的是 WebXR API,后者正在顺利完成标准化过程。因此,您应该尝试更新现有代码以使用新的 API。通常,转换应该相当顺利。

此外,在某些设备和/或浏览器上,WebVR 要求页面通过 HTTPS 连接在安全上下文中加载。如果页面不完全安全,WebVR 方法和函数将不可用。您可以通过检查 Navigator 方法 getVRDisplays() 是否为 NULL 来轻松测试这一点。

js
if (!navigator.getVRDisplays) {
  console.error("WebVR is not available");
} else {
  /* Use WebVR */
}

使用控制器:将 WebVR 与 Gamepad API 结合使用

许多 WebVR 硬件设置都配有与头戴式设备配套的控制器。这些控制器可以通过 Gamepad API,特别是 Gamepad Extensions API 在 WebVR 应用程序中使用,后者增加了用于访问控制器姿态触觉反馈器等 API 功能。

注意:我们的 将 VR 控制器与 WebVR 结合使用文章解释了如何将 VR 控制器与 WebVR 应用程序结合使用的基础知识。

WebVR 接口

VRDisplay

表示此 API 支持的任何 VR 设备。它包括通用信息,例如设备 ID 和描述,以及用于开始呈现 VR 场景、检索眼睛参数和显示功能以及其他重要功能的方法。

VRDisplayCapabilities

描述 VRDisplay 的功能——其功能可用于执行 VR 设备功能测试,例如它是否可以返回位置信息。

VRDisplayEvent

表示 WebVR 相关事件的事件对象(参见下面列出的窗口事件)。

VRFrameData

表示渲染 VR 场景单帧所需的所有信息;由 VRDisplay.getFrameData() 构建。

VRPose

表示给定时间戳下的位置状态(包括方向、位置、速度和加速度)。

VREyeParameters

提供对为每只眼睛正确渲染场景所需的所有信息的访问,包括视野信息。

VRFieldOfView

表示由描述从中心点观看的 4 个不同度数值定义的视野。

VRLayerInit

表示要显示在 VRDisplay 中的图层。

VRStageParameters

表示描述支持房间规模体验设备的舞台区域的值。

其他接口的扩展

WebVR API 扩展了以下 API,添加了列出的功能。

Gamepad

Gamepad.displayId 只读

返回关联 VRDisplayVRDisplay.displayId ——即游戏手柄正在控制其显示场景的 VRDisplay

返回一个数组,其中包含当前正在呈现的每个 VRDisplay 对象(VRDisplay.isPresentingtrue)。

返回一个 Promise,该 Promise 解析为 VRDisplay 对象数组,表示连接到计算机的任何可用 VR 显示器。

窗口事件

vrdisplaypresentchange

当 VR 显示器的呈现状态改变时触发——即从呈现到不呈现或反之。

vrdisplayconnect

当兼容的 VR 显示器连接到计算机时触发。

vrdisplaydisconnect

当兼容的 VR 显示器从计算机断开连接时触发。

vrdisplayactivate

当显示器可以呈现时触发。

vrdisplaydeactivate

当显示器不再能够呈现时触发。

示例

您可以在以下位置找到许多示例:

规范

此 API 在旧的 WebVR API 中指定,该 API 已被 WebXR Device API 取代。它不再有望成为标准。

在所有浏览器都实现新的 WebXR API 之前,建议依靠 A-FrameBabylon.jsThree.js 等框架,或 polyfill 来开发可在所有浏览器上运行的 WebXR 应用程序。有关更多信息,请阅读 Meta 的从 WebVR 移植到 WebXR 指南。

浏览器兼容性

另见