在上一篇有稍微提到這個功能,很明顯要用Babylon.js開發一定少不了WebXRExperienceHelper
WebXRExperienceHelper是一個高度整合的 WebXR 功能套件組包含很多功能。但這裡面的功能都不會單獨被使用,而是都會透過WebXRExperienceHelper
來呼叫使用,因為他們不是只是單純被放在一起而是功能間可能會比次互相影響,因此WebXRExperienceHelper
需要來擔任一個協調的角色。他會確保所有核心元件以正確的順序被啟動,以及生命週期和狀態都能正確的連接起來。他主要可以分成四個主要類別:
這是Babylon.js與瀏覽器的原生WebXR API進行通訊的橋樑。它負責處理XR Session的生命週期和狀態。
WebXRSessionManager核心職責是XR功能的容器,,所有XR功能都依附在這個Session上。
XR Session啟動有3個步驟:檢查支援性 -> 初始化原生和設定參考空間 -> 準備渲染目標
Step 1: 檢查支援性
// 使用靜態方法(通用)或實例方法(當前 Session Manager)
const supported = await BABYLON.WebXRSessionManager.IsSessionSupportedAsync("immersive-vr");
if (supported) {
// XR 可用,可以進入下一步
}
Step 2: 初始化和設定參考空間
// 初始化 注意:沒呼叫這個,XR體驗將無法運作!
await sessionManager.initializeSessionAsync("immersive-vr" /*, xrSessionInit */);
// 設置參考空間
const referenceSpace = await sessionManager.setReferenceSpaceTypeAsync('local-floor');
要初始化前我們要用Session模式(immersive-vr / immersive-ar)
先決定體驗類型是VR還是AR。
然後設置參考空間模式來決定場景如何計算使用者位置和移動的座標系統。這個參考空間物件會定義所有後續的座標計算(頭盔、控制器、傳送)。
什麼是參考空間(Reference Space)?
在WebXR中,你就是世界中心。
你的頭盔和身體永遠都是房間的中心。要讓你在虛擬世界中移動,不是移動你的頭盔,而是移動整個虛擬世界,讓它繞著你轉。而參考空間(Reference Space)是這個虛擬世界的座標系統。
因為使用者就是世界中心,因此參考空間(Reference Space)就是WebXR座標系統的錨點,定義了使用者在虛擬世界中的 原點 (0,0,0) 和 初始方向。就像是你乘坐在阿拉丁飛毯的上,飛毯就是參考空間 (Reference Space),而你就在這塊飛毯上移動,飛毯是世界中心,所有的空間都會依照飛毯為原點的相對位置來做計算。
WebXRSessionManager會依據我們設定的參考空間,託管和維護當前使用的參考空間的計算,並負責與XR裝置連線、接收追蹤數據的溝通。
常用的參考空間
模式名稱 | 說明 | 適用情境 |
---|---|---|
local |
房間級別追蹤。將原點設在裝置啟動時的頭部位置。不保證 Y=0 是地板高度。 | 適用於坐姿或不需精確知道地板高度的體驗。 |
local-floor |
地板級別追蹤(最常用)。將原點設在裝置啟動時的地板中心。保證 Y=0 始終位於地板。 | 適用於所有 VR Room-Scale 應用(允許使用者在實體房間內走動)。 |
viewer |
頭部追蹤。不允許在空間中平移,只能轉頭。原點是頭盔,通常用於 AR。 | 適用於手機 AR 或固定視角的體驗。 |
Step 3: 準備渲染目標
const renderTarget = sessionManager.getWebXRRenderTarget(/*outputCanvasOptions*/);
const xrWebGLLayer = await renderTarget.initializeXRLayerAsync(sessionManager.session);
// 這樣,Session Manager 就準備好用 XR Session 來渲染場景了。
Session Manager準備好後,就可以啟動專屬的 XR 渲染循環。
sessionManager.runXRRenderLoop();
而要結束XR體驗時,必須呼叫 exitXRAsync()。
await sessionManager.exitXRAsync();
而Session的生命週期常見的如下:
觀察者 (Observable) | 觸發時機 | 典型用途 |
---|---|---|
onXRFrameObservable |
每一幀 XR 畫面渲染時。 | 執行 XR 模式下的動態更新、物理模擬等。 |
onXRSessionInit |
Session 成功初始化後(requestSession 成功返回)。 |
執行 VR 特定的一次性設定,例如加載 VR 介面。 |
onXRSessionEnded |
Session 結束後(使用者退出或意外終止)。 | 執行場景清理,將應用程式恢復到標準 3D 模式。 |
onXRReferenceSpaceChanged |
場景套用了一個新的參考空間時(例如使用者傳送後)。 | 偵測使用者是否移動了位置。 |