XRSession

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

XRSession 接口是 WebXR Device API 的一部分,它代表了一个正在进行的 XR 会话,提供用于与会话交互和控制会话的方法和属性。要打开一个 WebXR 会话,请使用 XRSystem 接口的 requestSession() 方法。

通过 XRSession 方法,你可以轮询观察者的位置和方向(XRViewerPose),收集用户环境的信息,并向用户呈现图像。XRSession 支持内联和沉浸式虚拟和增强现实模式。

EventTarget XRSession

实例属性

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

depthDataFormat 实验性 只读

返回配置会话时使用的深度感知数据格式。

depthUsage 实验性 只读

返回配置会话时使用的深度感知用途。

domOverlayState 实验性 只读

如果 DOM 叠加功能已启用,则提供有关它的信息。

enabledFeatures 实验性 只读

返回已授予的 会话功能 数组。

environmentBlendMode 实验性 只读

返回此会话的混合模式,它表示通过 XR 设备可见的真实世界环境的程度,以及设备如何将设备图像与真实世界环境融合。

inputSources 实验性 只读

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

interactionMode 实验性 只读

返回此会话的交互模式,它描述了(根据用户代理)应用程序为当前会话绘制交互式 UI 的最佳空间。

preferredReflectionFormat 实验性 只读

返回此会话用于照明估算纹理数据的首选反射格式。

renderState 实验性 只读

一个 XRRenderState 对象,其中包含影响图像渲染方式的选项。这包括近裁剪平面和远裁剪平面(定义对象在渲染时可以有多近和多远的距离),以及视场信息。

visibilityState 实验性 只读

一个字符串,指示会话的图像是否对用户可见,如果可见,是否可见但当前不是用户事件的目标。

实例方法

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

cancelAnimationFrame() 实验性

根据之前调用 requestAnimationFrame() 返回的标识句柄,从 XRSession 的动画帧渲染回调集中删除动画帧绘制回调。

end() 实验性

结束 WebXR 会话。返回一个 promise,该 promise 在会话关闭时解决。

requestAnimationFrame() 实验性

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

requestHitTestSource() 实验性

请求一个处理命中测试订阅的 XRHitTestSource 对象。

requestHitTestSourceForTransientInput() 实验性

请求一个处理瞬态输入源的命中测试订阅的 XRTransientInputHitTestSource 对象。

requestLightProbe() 实验性

请求一个 XRLightProbe,它估算用户环境中给定点的照明信息。

requestReferenceSpace() 实验性

请求创建一个指定类型的新 XRReferenceSpace。返回一个 promise,该 promise 会使用所请求的 XRReferenceSpaceXRBoundedReferenceSpace 解决,如果设备不支持请求的空间类型,则抛出 NotSupportedError DOMException

updateRenderState() 实验性

更新会话渲染状态的属性。

事件

以下事件将传递给 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 元素中显示它,而无需专用的 AR 或 VR 观看设备(如头戴设备)。

js
const XR = navigator.xr;

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

        gl.bindFramebuffer(xrWebGLLayer.framebuffer);

        for (const xrView of viewer.views) {
          const xrViewport = xrWebGLLayer.getViewport(xrView);
          gl.viewport(
            xrViewport.x,
            xrViewport.y,
            xrViewport.width,
            xrViewport.height,
          );
        }
      });
    });
  });
} else {
  /* WebXR is not available */
}

规范

规范
WebXR Device API
# xrsession-interface

浏览器兼容性