XRSession - 表示正在进行的 XR 会话
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
。返回一个通过请求的 XRReferenceSpace
或 XRBoundedReferenceSpace
解析的承诺,如果设备不支持所请求的空间类型,则抛出 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 的定义 |
工作草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
cancelAnimationFrame() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
end() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
end 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
environmentBlendMode | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
inputSources | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
inputsourceschange 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
onend | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
oninputsourceschange | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
onselect | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
onselectend | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
onselectstart | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
onvisibilitychange | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
renderState | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
requestAnimationFrame() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
requestHitTestSource | 81 | 81 | 不支持 | 不支持 | 不支持 | 不支持 |
requestReferenceSpace() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
select 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
selectend 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
selectstart 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
updateRenderState() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
visibilitychange 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
visibilityState | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS 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 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |