XRSystem - 提供了方法用于访问代表 WebXR 会话的 XRSession 对象

安全上下文
该功能仅在部分或所有支持的浏览器中的安全上下文(HTTPS)中可用。

XRSystemWebXR 设备 API 的接口, 提供了方法用于访问代表 WebXR 会话的 XRSession 对象。有了 XRSession,您就可以使用它与增强现实(AR)或虚拟现实(VR)设备进行交互。

属性

虽然 XRSystem 直接不提供属性,但是从其父接口 EventTarget 继承了属性。

方法

除了从其父接口 EventTarget 继承的方法之外,XRSystem 接口还包括以下方法:

isSessionSupported()

返回一个 Promise,如果浏览器支持给定的 XRSessionMode,则将其解析为 true。如果不支持指定的模式,则解析为 false

requestSession()

返回一个 Promise,使用指定的 XRSessionMode 解析为新的 XRSession

事件

devicechange

当可用的 XR 设备集合已更改时触发。
也可以使用 ondevicechange 事件处理程序绑定。

使用注意

在规范的早期版本中,该接口以前名称为 XR。如果在代码或文档中看到对 XR 的引用,则将其替换为 XRSystem

实例

以下实例显示如何同时使用 isSessionSupported()requestSession()

if (navigator.xr) {
  immersiveButton.addEventListener("click", onButtonClicked);
  navigator.xr.isSessionSupported('immersive-vr')
  .then((isSupported) => {
    if (isSupported) {
      immersiveButton.disabled = false;
    } else {
      immersiveButton.disabled = true;
    }
  });
}

function onButtonClicked() {
  if (!xrSession) {
    navigator.xr.requestSession('immersive-vr')
    .then((session) => {
      // 为了简洁起见,未显示 onSessionStarted() 的代码。
      onSessionStarted(session);
    });
  } else {
    // 关闭已经运行的 XRSession
    xrSession.end()
    .then(() => {
      // 由于在某些情况下未发送结束事件,因此也请在此处调用处理程序。
      onSessionEnded();
    });
  }
}

这段代码首先通过查找 navigator.xr 属性来检查 WebXR 是否可用。如果找到它,我们就知道存在 WebXR,因此我们将为按钮建立一个处理程序,用户可以单击该按钮以打开和关闭沉浸式 VR 模式。

但是,我们尚不知道所需的沉浸模式是否可用。为了确定这一点,我们调用 isSessionSupported(),在启用 immersiveButton 按钮之前将所需的会话选项传递给它。然后,只有在沉浸式 VR 模式可用时,用户才能使用该选项切换到沉浸式模式。如果沉浸式 VR 不可用,则禁用该按钮以阻止被使用。

onButtonClicked() 函数检查是否已在运行会话。如果没有,我们使用 requestSession() 方法来启动一个会话,一旦返回的 Promise 解析,我们就调用 requestSession() 函数来建立会话进行渲染等等。

另一方面,如果已经有正在进行的 XR 会话,则改为调用 end() 来结束当前会话。当前会话结束时,将发送 end 事件,因此在其处理程序中将 xrSession 设置为 null 以记录我们不再有正在进行的回话。这样,如果用户再次单击该按钮,将开始新的会话。

规范

规范 状态 备注
WebXR Device API
XRSystem 的定义
工作草案 初始定义。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持791791 不支持 不支持 不支持 不支持
devicechange 事件7979 不支持 不支持 不支持 不支持
isSessionSupported()7979 不支持 不支持 不支持 不支持
ondevicechange7979 不支持 不支持 不支持 不支持
requestSession()7979 不支持 不支持 不支持 不支持

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持 不支持791 未知 不支持 未知 不支持 不支持
devicechange 事件 不支持79 未知 不支持 未知 不支持 不支持
isSessionSupported() 不支持79 未知 不支持 未知 不支持 不支持
ondevicechange 不支持79 未知 不支持 未知 不支持 不支持
requestSession() 不支持79 未知 不支持 未知 不支持 不支持

1. 通过 XR 支持。