XRReferenceSpace: reset 事件
当在本机原点或有效原点检测到不连续性时,会向 XRReferenceSpace 对象发送 reset 事件,这会导致使用该参考空间定向的对象的位置或方向发生跳跃。当用户校准或重新校准 XR 设备时,或者在设备丢失用户跟踪后又重新获得跟踪而自动更改其原点时,这种情况很常见。
对于 XRBoundedReferenceSpace 对象,当 boundsGeometry 更改时,也可能触发 reset 事件。
无论哪种情况,该事件都会在利用新原点的任何 WebXR 动画帧执行之前发送。
此事件不可取消。
语法
在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。
addEventListener("reset", (event) => { })
onreset = (event) => { }
事件类型
这是一个 XRReferenceSpaceEvent。继承自 Event。
事件属性
除了下面列出的属性之外,父接口 Event 的属性也可使用。
referenceSpace只读-
一个
XRReferenceSpace,指示生成事件的参考空间。 transform只读-
一个
XRRigidTransform对象,指示事件发生后指定referenceSpace对象的本机原点的位置和方向,相对于事件发生前的坐标系定义。
描述
reset 事件表示坐标系已通过更改参考空间的原点进行重置或重新配置,并根据事件的 transform 属性进行移动和旋转。在执行动画帧回调以渲染待处理帧之前发送此事件,以确保这些回调具有可用的更新后的坐标系。
可能导致重置的原因有很多。其中最常见的包括:
- 用户手动重置了坐标系,例如通过请求头显自行重新校准,以确保面部方向和手部控制器与用户的实际位置和面部对齐。这主要是
local或local-floor参考空间的问题。 - 对于
bounded-floor参考空间,如果用户离开参考空间的边界并进入新的边界(例如,在游戏中从一个级别穿越到另一个级别,每个级别都有自己的地图和自己的坐标系),则可以重置坐标系。 - 跟踪系统暂时丢失了用户,然后又重新找回了用户,但在此期间用户移动了足够的距离,离开了最后一个已知位置的附近。这主要是
unbounded参考空间的问题。 - 用户处于
unbounded参考空间中,并且已从起始位置(参考空间的原点)移动了足够远的距离,以至于浮点数或其他形式的误差或漂移变得有问题。因此,坐标系会进行重置,其新原点位于用户当前位置或其附近。 - WebXR 基础结构或硬件驱动程序检测到设备暂时丢失了跟踪,导致硬件和软件在位置和方向上不同步。
注意:如果参考空间能够恢复对其先前原点的跟踪,则不会发生 reset 事件,因为这意味着原点没有被迫重新定位。仅当必须重新定位原点以从跟踪丢失中恢复时,才会触发此事件。
手动重置
如果您花时间使用过 VR 头显,您就会遇到这样的情况:启动后,即使您正对着前方,头显却认为您在看天空或地板;或者您将手部控制器指向前方,但它认为您将其指向了某个向上偏右的方向。发生这种情况时,通常需要按住某个按钮,这会导致世界与设备当前的方向重新同步。这是通过向基于头显方向的参考空间或参考空间发送 reset 事件来实现的。
处理不连续性
您可以通过监视布尔值 XRPose 属性 emulatedPosition 来处理查看器位置的跳跃。如果查看器位置的跳跃与 emulatedPosition 从 true 切换到 false 相吻合,则表示查看器已恢复跟踪,并且其新位置代表了对先前模拟值的修正。如果您的网站或应用不通过明确更改查看器的位置和/或方向(而不是使用 XR 设备通过用户的物理移动来引入运动)来模拟空间中的运动,那么这通常是所需的行为。
但是,如果使用了这种“传送”行为,您实际上希望避免在跟踪恢复后跳转用户的位置,因为这会引入额外的、可能令人不适的跳转。为了避免这种情况,您可以在调用 getOffsetReferenceSpace() 来创建新的参考空间之前,将 emulatedPosition 集成到传送偏移量中,该新参考空间的有效原点会根据查看器位置自上一帧以来跳跃的距离进行调整。这样,用户的位置只会改变一次,而不是两次。
不连续性大小的影响
当不连续性足够小,设备能够在同一跟踪区域内恢复跟踪时,不会触发 reset 事件。在无边界参考空间中,当其随着时间的推移对本机原点进行微小调整以维持用户附近空间的稳定性时,也不会触发。只有大的不连续性才会触发重置。
示例
要为 reset 事件添加处理程序,可以使用以下两种方法之一。首先,您可以使用 addEventListener() 方法
viewerRefSpace.addEventListener("reset", (event) => {
/* perform reset related tasks */
});
第二个选项是设置 XRReferenceSpace 对象的 onreset 事件处理程序属性
viewerRefSpace.onreset = (event) => {
/* perform reset related tasks */
};
规范
| 规范 |
|---|
| WebXR Device API # eventdef-xrreferencespace-reset |
| WebXR Device API # dom-xrreferencespace-onreset |
浏览器兼容性
加载中…