XRReferenceSpace: 重置事件

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在某些或所有支持的浏览器中可用。

当在原生原点或有效原点中检测到不连续性时,将向XRReferenceSpace对象发送reset事件,这会导致使用参考空间定向的对象的位置或方向发生跳跃。当用户校准或重新校准 XR 设备时,或者设备在丢失对用户的跟踪后自动更改其原点,然后重新获得跟踪时,这种情况很常见。

对于XRBoundedReferenceSpace对象,当boundsGeometry发生更改时,也会触发reset事件。

在任何情况下,事件都将在执行任何使用新原点的 WebXR 动画帧之前发送。

此事件不可取消。

语法

addEventListener()等方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("reset", (event) => {});

onreset = (event) => {};

事件类型

一个XRReferenceSpaceEvent。继承自Event.

事件属性

除了下面列出的属性外,父接口Event的属性也可以使用。

referenceSpace 只读

一个XRReferenceSpace,指示生成事件的参考空间。

transform 只读

一个XRRigidTransform对象,指示事件后指定referenceSpace对象的原生原点的位置和方向,相对于事件前的坐标系定义。

描述

reset事件表明,坐标系已通过更改参考空间的原点、移动和旋转(如事件的transform属性所指示)进行了重置或重新配置。该事件在执行任何用于渲染挂起帧的动画帧回调之前发送,以确保这些回调可以使用更新后的坐标系。

重置可能发生的原因有很多。其中最常见的是以下几种

  • 用户已手动重置了坐标系,例如,通过要求耳机重新校准自身以确保正视方向和手柄与用户的实际位置和正视方向同步。这主要针对locallocal-floor参考空间。
  • 对于bounded-floor参考空间,如果用户离开参考空间的边界并进入新的边界(例如,在游戏中从一个级别跨越到另一个级别,其中每个级别都有自己的地图和自己的坐标系),则坐标系可以被重置。
  • 跟踪系统暂时丢失了用户,然后重新找到了用户,但直到用户移动到离开上次已知位置的附近范围后才重新找到。这主要针对unbounded参考空间。
  • 用户位于unbounded参考空间中,并且已经从起始位置(参考空间的原点)移动了足够远的距离,以至于浮点数或其他形式的错误或漂移成为问题。因此,坐标系被重置,其新原点位于或靠近用户当前位置。
  • WebXR 基础设施或硬件驱动程序检测到设备暂时丢失了跟踪,导致硬件和软件在位置和方向方面不同步。

注意:如果参考空间能够重新获得对其先前原点的跟踪,则不会发生reset事件,因为这意味着原点没有被迫重新定位。此事件仅在必须重新定位原点以从跟踪丢失中恢复时才会触发。

手动重置

如果您使用过 VR 耳机,您就会遇到过这样的情况:您启动了耳机,虽然您正视前方,但耳机却认为您在看天空或地板;或者您将手柄指向前方,但它却认为您将它指向某个地方的向上方和右方。当这种情况发生时,您通常需要按住某个按钮,它会导致世界重新同步到设备的当前方向。这是通过向基于耳机方向的参考空间或参考空间发送reset事件来实现的。

处理不连续性

您可以通过观察布尔XRPose属性emulatedPosition来处理观看者位置的跳跃。如果观看者位置的跳跃与emulatedPositiontrue切换到false重合,则观看者已重新获得跟踪,并且他们的新位置代表了先前模拟值的校正。如果您的网站或应用程序不通过明确更改观看者的位置和/或方向来模拟空间中的运动(而是使用 XR 设备来引入用户的身体运动),这通常是期望的行为。

但是,如果使用这种“传送”方式,您实际上希望在跟踪恢复后避免观看者位置跳跃,因为这会导致额外的、可能令人不适的跳跃。为了防止这种情况发生,您可以将emulatedPosition集成到在调用getOffsetReferenceSpace()之前计算的传送偏移量中,以创建一个新的参考空间,其更新后的有效原点根据观看者位置自前一帧以来跳跃的距离进行调整。这样,观看者的位置只改变一次,而不是两次。

不连续性大小的影响

当不连续性足够小时,设备能够在同一个跟踪区域内重新获得跟踪时,不会触发reset事件。当无界参考空间随着时间的推移对其原生原点进行微调以维持空间在用户附近的稳定性时,也不会触发该事件;只有大的不连续性才会触发重置。

示例

要为reset事件添加处理程序,您可以使用以下两种方法之一。首先,您可以使用addEventListener()方法

js
viewerRefSpace.addEventListener("reset", (event) => {
  /* perform reset related tasks */
});

第二个选项是设置 XRReferenceSpace 对象的 onreset 事件处理程序属性。

js
viewerRefSpace.onreset = (event) => {
  /* perform reset related tasks */
};

规范

规范
WebXR 设备 API
# eventdef-xrreferencespace-reset
WebXR 设备 API
# dom-xrreferencespace-onreset

浏览器兼容性

BCD 表格仅在浏览器中加载