XRSession
XRSession 介面是 WebXR Device API 的一部分,它代表了一個正在進行的 XR 會話,提供用於與會話互動和控制會話的方法和屬性。要開啟一個 WebXR 會話,請使用 XRSystem 介面的 requestSession() 方法。
透過 XRSession 方法,你可以輪詢觀察者的位置和方向(XRViewerPose),收集使用者環境的資訊,並向用戶呈現影像。XRSession 支援內聯和沉浸式虛擬和增強現真實模式。
例項屬性
除了下面列出的屬性外,XRSession 還繼承了其父介面 EventTarget 的屬性。
depthDataFormat實驗性 只讀-
返回配置會話時使用的深度感知資料格式。
depthUsage實驗性 只讀-
返回配置會話時使用的深度感知用途。
domOverlayState實驗性 只讀-
如果 DOM 疊加功能已啟用,則提供有關它的資訊。
enabledFeatures實驗性 只讀-
返回已授予的 會話功能 陣列。
environmentBlendMode實驗性 只讀-
返回此會話的混合模式,它表示透過 XR 裝置可見的真實世界環境的程度,以及裝置如何將裝置影像與真實世界環境融合。
inputSources實驗性 只讀-
返回此會話的
XRInputSource列表,每個列表代表一個用於控制攝像頭和/或場景的輸入裝置。 interactionMode實驗性 只讀-
返回此會話的互動模式,它描述了(根據使用者代理)應用程式為當前會話繪製互動式 UI 的最佳空間。
preferredReflectionFormat實驗性 只讀-
返回此會話用於照明估算紋理資料的首選反射格式。
renderState實驗性 只讀-
一個
XRRenderState物件,其中包含影響影像渲染方式的選項。這包括近裁剪平面和遠裁剪平面(定義物件在渲染時可以有多近和多遠的距離),以及視場資訊。 visibilityState實驗性 只讀-
一個字串,指示會話的影像是否對使用者可見,如果可見,是否可見但當前不是使用者事件的目標。
例項方法
除了從其父介面 EventTarget 繼承的方法之外,XRSession 還提供了以下方法。
cancelAnimationFrame()實驗性-
根據之前呼叫
requestAnimationFrame()返回的標識控制代碼,從XRSession的動畫幀渲染回撥集中刪除動畫幀繪製回撥。 end()實驗性-
結束 WebXR 會話。返回一個
promise,該 promise 在會話關閉時解決。 requestAnimationFrame()實驗性-
安排在 使用者代理 下一次為 WebXR 裝置渲染動畫幀時呼叫指定的方法。返回一個整數值,該值可用於透過
cancelAnimationFrame()取消回撥時識別請求。此方法與Window.requestAnimationFrame()方法類似。 requestHitTestSource()實驗性-
請求一個處理命中測試訂閱的
XRHitTestSource物件。 requestHitTestSourceForTransientInput()實驗性-
請求一個處理瞬態輸入源的命中測試訂閱的
XRTransientInputHitTestSource物件。 requestLightProbe()實驗性-
請求一個
XRLightProbe,它估算使用者環境中給定點的照明資訊。 requestReferenceSpace()實驗性-
請求建立一個指定型別的新
XRReferenceSpace。返回一個 promise,該 promise 會使用所請求的XRReferenceSpace或XRBoundedReferenceSpace解決,如果裝置不支援請求的空間型別,則丟擲NotSupportedErrorDOMException。 updateRenderState()實驗性-
更新會話渲染狀態的屬性。
事件
以下事件將傳遞給 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 元素中顯示它,而無需專用的 AR 或 VR 觀看裝置(如頭戴裝置)。
const XR = navigator.xr;
if (XR) {
XR.requestSession("inline").then((xrSession) => {
xrSession.requestReferenceSpace("local").then((xrReferenceSpace) => {
xrSession.requestAnimationFrame((time, xrFrame) => {
const viewer = xrFrame.getViewerPose(xrReferenceSpace);
gl.bindFramebuffer(xrWebGLLayer.framebuffer);
for (const xrView of viewer.views) {
const xrViewport = xrWebGLLayer.getViewport(xrView);
gl.viewport(
xrViewport.x,
xrViewport.y,
xrViewport.width,
xrViewport.height,
);
}
});
});
});
} else {
/* WebXR is not available */
}
規範
| 規範 |
|---|
| WebXR Device API # xrsession-interface |
瀏覽器相容性
載入中…