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 |
瀏覽器相容性
載入中…