XRSession - 表示正在进行的 XR 会话

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

XRSession 是 WebXR 设备 API 的接口,表示正在进行的 XR 会话,提供用于与会话进行交互和控制会话的方法和属性。要打开 WebXR 会话,请使用 XRSystem 接口的 requestSession() 方法。

使用 XRSession 的方法,您可以轮询查看者的位置和方向(XRViewerPose),收集有关用户环境的信息以及向用户展示图像。XRSession 支持内联和沉浸式虚拟以及增强现实模式。

属性

除了下面列出的属性外,XRSession 还从其父接口 EventTarget 继承了属性。

environmentBlendMode 只读

返回此会话的混合模式,该模式表示可以通过 XR 设备看到多少实际环境,以及设备如何将设备图像与其混合在一起。

注意: environmentBlendMode()WebXR 增强现实模块的一部分,目前尚未完成。

inputSources 只读

返回此会话的 XRInputSource 的列表,每个列表代表用于控制摄像机和 / 或场景的输入设备。

renderState 只读

一个 XRRenderState 对象,其中包含影响图像呈现方式的选项。这包括诸如近和远裁剪平面(定义对象可以被渲染和仍然被渲染到多远和多远的距离)之类的东西,以及视野信息。

visibilityState 只读

一个 DOMString,其值为 XRVisibilityState,表示用户是否可以看到会话的图像,如果可见,则表明该图像是可见的,但当前不是用户事件的目标。

方法

XRSession 除了从其父接口 EventTarget 继承的方法外,还提供了以下方法。

cancelAnimationFrame()

给定上一次调用 requestAnimationFrame() 返回的标识句柄,从 XRSession 的动画帧渲染回调集合中该回调。

end()

结束 WebXR 会话。返回一个 promise,它将在会话关闭时进行解析。

requestAnimationFrame()

在下一次用户代理为 WebXR 设备渲染动画帧时,将调用指定的方法。返回一个整数值,该值可用于标识请求,以使用 cancelAnimationFrame(). 取消回调。该方法类似于 Window.requestAnimationFrame() 方法。

requestReferenceSpace()

请求创建指定类型的新 XRReferenceSpace。返回一个通过请求的 XRReferenceSpaceXRBoundedReferenceSpace 解析的承诺,如果设备不支持所请求的空间类型,则抛出 NotSupportedError

updateRenderState()

更新会话的呈现状态的属性,以匹配在指定的 XRRenderStateInit 字典中指定的值。给定字典中未包括的所有属性均与其当前值保持不变。

事件

以下事件将传递给 XRSession 对象。

end

在 WebXR 会话结束和所有硬件相关功能完成后发送到 XRSession 对象。该事件由类型为 XRSessionEvent 的对象表示。
也可以通过 onend 事件处理程序属性处理。

inputsourceschange

当活动的 XR 输入源的列表发生更改时,将类型为 XRInputSourcesChangeEvent 的事件发送到 XRSession
也可以通过 oninputsourceschange 事件处理程序属性处理。

select

一个类型为 XRInputSourceEvent 的事件,当会话的输入源之一成功完成主要操作时,将发送到该会话。它通常对应于用户按下触发器,触摸板或按钮,说出命令或执行可识别的手势。select 事件在 selectstart 事件发送之后发送,紧接在 selectend 事件发送之前发送。如果 select 事件发送,那么选择操作在完成之前就被终止了。也可以通过 onselect 事件处理程序属性处理。

selectend

一个类型为 XRInputSourceEvent 的事件,当其输入设备之一完成其主要操作时将发送到会话对象,或者在处理主要操作的过程中将其断开连接。例如:对于按钮或触发操作,这意味着按钮已释放;对于语音命令,这表示用户已完成语音。这是要发送的三个 select* 事件中的最后一个。
也可以通过 onselectend 事件处理程序属性处理。

selectstart

一个类型为 XRInputSourceEvent 的事件,当用户首先使用其输入设备之一时,将其发送到会话对象,从而使主要动作开始。这是要发送的 session* 事件中的第一个。
也可以通过 onselectstart 事件处理程序属性处理。

squeeze

一个类型为 XRInputSourceEvent 的事件,发送时表示主要挤压操作已成功完成。例如,它表示被挤压的设备已释放,并且可能表示丢弃一个抓住的对象。例如。它会在发送 squeezeend 事件之前立即发送,以指示挤压操作结束。也可以通过 onsqueeze 事件处理程序属性获得。

squeezeend

一个类型为 XRInputSourceEvent 的事件,当主要挤压操作结束时,无论该操作是否成功,都会将其发送到 XRSession
也可以使用 onsqueezeend 事件处理程序属性处理。

squeezestart

一个类型为 XRInputSourceEvent 的事件,在用户开始挤压可挤压控制器时发送到 XRSession。例如,它可能是用于表示抓取物体的触发器,或者可能表示戴着触觉手套时的实际挤压。
也可以通过 onsqueezestart 事件处理程序属性处理。

visibilitychange

一个 XRSessionEvent,当 visibilityState 指示的可见性状态更改时,将发送到会话。
也可以通过 onvisibilitychange 事件处理程序属性处理。

实例

本实例以 inline 模式建立新的 XRSession,以便可以在 HTML 元素中显示该 XRSession,而无需使用专用的 AR 或 VR 观看设备,例如头戴式耳机。

const XR = navigator.xr;

if (XR) {
  XR.requestSession("inline").then((xrSession) => {
    xrSession.requestReferenceSpace("local").then((xrReferenceSpace) => {
      xrSession.requestAnimationFrame((time, xrFrame) => {
        let viewer = xrFrame.getViewerPose(xrReferenceSpace);

        gl.bindFramebuffer(xrWebGLLayer.framebuffer);

        for (xrView of viewer.views) {
          let xrViewport = xrWebGLLayer.getViewport(xrView);
          gl.viewport(xrViewport.x, xrViewport.y,
                      xrViewport.width, xrViewport.height);
        }
      });
    });
  });
} else {
  /* WebXR 不可用 */
}

规范

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

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持7979 不支持 不支持 不支持 不支持
cancelAnimationFrame()7979 不支持 不支持 不支持 不支持
end()7979 不支持 不支持 不支持 不支持
end 事件7979 不支持 不支持 不支持 不支持
environmentBlendMode7979 不支持 不支持 不支持 不支持
inputSources7979 不支持 不支持 不支持 不支持
inputsourceschange 事件7979 不支持 不支持 不支持 不支持
onend7979 不支持 不支持 不支持 不支持
oninputsourceschange7979 不支持 不支持 不支持 不支持
onselect7979 不支持 不支持 不支持 不支持
onselectend7979 不支持 不支持 不支持 不支持
onselectstart7979 不支持 不支持 不支持 不支持
onvisibilitychange7979 不支持 不支持 不支持 不支持
renderState7979 不支持 不支持 不支持 不支持
requestAnimationFrame()7979 不支持 不支持 不支持 不支持
requestHitTestSource8181 不支持 不支持 不支持 不支持
requestReferenceSpace()7979 不支持 不支持 不支持 不支持
select 事件7979 不支持 不支持 不支持 不支持
selectend 事件7979 不支持 不支持 不支持 不支持
selectstart 事件7979 不支持 不支持 不支持 不支持
updateRenderState()7979 不支持 不支持 不支持 不支持
visibilitychange 事件7979 不支持 不支持 不支持 不支持
visibilityState7979 不支持 不支持 不支持 不支持

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持 不支持79 未知 不支持 未知 不支持 不支持
cancelAnimationFrame() 不支持79 未知 不支持 未知 不支持 不支持
end() 不支持79 未知 不支持 未知 不支持 不支持
end 事件 不支持79 未知 不支持 未知 不支持 不支持
environmentBlendMode 不支持79 未知 不支持 未知 不支持 不支持
inputSources 不支持79 未知 不支持 未知 不支持 不支持
inputsourceschange 事件 不支持79 未知 不支持 未知 不支持 不支持
onend 不支持79 未知 不支持 未知 不支持 不支持
oninputsourceschange 不支持79 未知 不支持 未知 不支持 不支持
onselect 不支持79 未知 不支持 未知 不支持 不支持
onselectend 不支持79 未知 不支持 未知 不支持 不支持
onselectstart 不支持79 未知 不支持 未知 不支持 不支持
onvisibilitychange 不支持79 未知 不支持 未知 不支持 不支持
renderState 不支持79 未知 不支持 未知 不支持 不支持
requestAnimationFrame() 不支持79 未知 不支持 未知 不支持 不支持
requestHitTestSource 不支持81 未知 不支持 未知 不支持 不支持
requestReferenceSpace() 不支持79 未知 不支持 未知 不支持 不支持
select 事件 不支持79 未知 不支持 未知 不支持 不支持
selectend 事件 不支持79 未知 不支持 未知 不支持 不支持
selectstart 事件 不支持79 未知 不支持 未知 不支持 不支持
updateRenderState() 不支持79 未知 不支持 未知 不支持 不支持
visibilitychange 事件 不支持79 未知 不支持 未知 不支持 不支持
visibilityState 不支持79 未知 不支持 未知 不支持 不支持