XRSession
XRSession 接口是 WebXR Device API 的一部分,它代表了一个正在进行的 XR 会话,提供用于与会话交互和控制会话的方法和属性。要打开一个 WebXR 会话,请使用 XRSystem 接口的 requestSession() 方法。
通过 XRSession 方法,你可以轮询观察者的位置和方向(XRViewerPose),收集用户环境的信息,并向用户呈现图像。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 会使用所请求的XRReferenceSpace或XRBoundedReferenceSpace解决,如果设备不支持请求的空间类型,则抛出NotSupportedErrorDOMException。 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 观看设备(如头戴设备)。
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 |
浏览器兼容性
加载中…