XRSession

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

XRSession 介面是 WebXR Device API 的一部分,它代表了一個正在進行的 XR 會話,提供用於與會話互動和控制會話的方法和屬性。要開啟一個 WebXR 會話,請使用 XRSystem 介面的 requestSession() 方法。

透過 XRSession 方法,你可以輪詢觀察者的位置和方向(XRViewerPose),收集使用者環境的資訊,並向用戶呈現影像。XRSession 支援內聯和沉浸式虛擬和增強現真實模式。

EventTarget 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 會使用所請求的 XRReferenceSpaceXRBoundedReferenceSpace 解決,如果裝置不支援請求的空間型別,則丟擲 NotSupportedError DOMException

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 觀看裝置(如頭戴裝置)。

js
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

瀏覽器相容性