Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

設定 XR

建置系統簡介

Godot 提供了一個模組化 XR 系統,該系統將許多不同的 XR 平台細節從使用者手中抽象化。核心是 XRServer <class_xrserver>`,它充當 XR 系統的中央接口,允許使用者發現接口並與 XR 系統的組件進行互動。

Each supported XR platform is implemented as an XRInterface. Supported interfaces register themselves with the XRServer and can be queried with the find_interface method on the XRServer. When the desired interface is found it can be initialized by calling initialize on the interface.

警告

已註冊的接口僅表示該接口可用,如果主機系統不支援該接口,則初始化可能會失敗並返回“false”。這可能有許多原因,遺憾的是,不同平台的原因有所不同。這可能是因為使用者尚未安裝所需的軟體,或者使用者根本沒有插入耳機。因此,作為開發人員,您必須對無法初始化的介面做出正確的反應。

由於 XR 中輸出的特殊要求,特別是對於向每隻眼睛提供不同影像的頭戴式裝置,Godot 中的 XRServer <class_xrserver>` 將覆蓋渲染系統中的各種功能。對於獨立裝置,這意味著最終輸出由 XRInterface <class_xrinterface>` 處理,並且 Godot 的常用輸出系統被停用。對於用作第二個螢幕的桌面 XR 裝置,可以專用一個單獨的 Viewport <class_viewport>` 來處理 XR 輸出,從而使主 Godot 視窗可用於顯示替代內容。

備註

請注意,只有一個接口可以負責處理 XR 裝置的輸出,這稱為主接口,預設情況下將是第一個初始化的接口。因此,Godot 目前僅支援使用單一耳機的實作。擁有輔助介面是可能的,但越來越不常見,例如向其他僅 3DOF 的裝置新增追蹤。

您幾乎可以在所有 XR 應用程式中找到三種 XR 特定節點型別:

  • XROrigin3D 代表了所有意圖和目的,您的遊戲空間的中心點。這是一個過於簡單的說法,但我們稍後會更詳細地討論。 XR 平台在物理空間中追蹤的所有物件都相對於該點進行定位。

  • XRCamera3D 表示為 XR 裝置渲染輸出時所使用的(立體)相機。此節點的定位由XR系統控制,並使用XR平台提供的追蹤資訊自動更新。

  • XRController3D 代表玩家使用的控制器,通常有兩個,每隻手握一個。這些節點可以存取這些控制器上的各種狀態,並在玩家按下它們上的按鈕時發出訊號。此節點的定位由XR系統控制,並使用XR平台提供的追蹤資訊自動更新。

還有其他與 XR 相關的節點,關於這三個節點還有很多要說的,但我們稍後會詳細介紹。

Godot 4 中 XR 的先決條件

雖然 Godot 3 中的大多數功能都是開箱即用的,但 Godot 4 需要更多設定。這主要是由於 Vulkan 渲染器更加先進。 XR 系統使用的 Vulkan 中有許多渲染功能預設未啟用。它們非常容易打開,只需打開專案設定並勾選 XR 部分中的 XR 著色器複選框即可:

../../_images/xr_shaders.png

警告

由於Godot 4仍處於開發階段,許多後製效果尚未更新以支援立體渲染。使用這些會產生不良影響。

備註

Godot 還可以在桌面和行動 Vulkan 渲染器之間進行選擇。在移動渲染器中新增了許多優化,有利於 XR 應用程式。即使在桌面上,您也可能想要啟用此功能。

OpenXR

OpenXR is a new industry standard that allows different XR platforms to present themselves through a standardised API to XR applications. This standard is an open standard maintained by the Khronos Group and thus aligns very well with Godot's interests.

OpenXR 的 Vulkan 實作與 Vulkan 緊密整合,接管了 Vulkan 系統的一部分。這需要在設定 XR 系統之前將某些核心圖形功能緊密整合到 Vulkan 渲染器中。這是將 OpenXR 作為核心介面的主要決定因素之一。

這也意味著當 Godot 啟動時需要啟用 OpenXR 才能正確設定。所需的設定可以在您的專案設定中找到:

../../_images/openxr_settings.png

由於 OpenXR 提供了設定功能,因此您還可以在此處找到與 OpenXR 相關的其他幾個設定。當您的應用程式運作時,這些無法更改。預設設定將幫助我們開始,我們將在檔案的另一部分中詳細介紹。

設定主要場景

每個 XR 應用程式至少需要一個 XROrigin3D <class_xrorigin3d>` 和一個 XRCamera3D <class_xrcamera3d>` 節點。大多數都會有兩個 XRController3D <class_xrcontroller3d>`,一個用於左手,一個用於右手。請記住,相機和控制器節點應該是原始節點的子節點。將這些節點新增至新場景並將控制器節點重新命名為“LeftHand”和“RightHand”,您的場景應如下所示:

../../_images/xr_basic_scene.png

接下來您需要配置控制器,選擇左手並進行以下設定:

../../_images/xr_left_hand.png

將腳本附加到節點。

../../_images/xr_right_hand.png

Right now all these nodes are on the floor, they will be positioned correctly in runtime. To help during development, it can be helpful to move the camera upwards so its y is set to 1.7, and move the controller nodes to -0.5, 1.0, -0.5 and 0.5, 1.0, -0.5 for respectively the left and right hand.

現在給主節點新增一個腳本, 並新增以下程式碼:

extends Node3D

var xr_interface: XRInterface

func _ready():
    xr_interface = XRServer.find_interface("OpenXR")
    if xr_interface and xr_interface.is_initialized():
        print("OpenXR initialized successfully")

        # Turn off v-sync!
        DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)

        # Change our main viewport to output to the HMD
        get_viewport().use_xr = true
    else:
        print("OpenXR not initialized, please check if your headset is connected")

此程式碼片段假設我們使用 OpenXR,如果您希望使用任何其他接口,您可以更改“find_interface”呼叫。

警告

正如您在上面的程式碼片段中看到的,我們關閉了垂直同步。使用 OpenXR 時,您將渲染結果輸出到 HMD,這通常要求我們以 90Hz 或更高的頻率運作。如果您的顯示器是 60hz 顯示器並且開啟了垂直同步,您會將輸出限制為每秒 60 影格。

OpenXR 等 XR 介面執行自己的同步。

另請注意,預設情況下實體引擎也以 60Hz 運作,這可能會導致物理效果不穩定。您應該將“Engine.physicals_ticks_per_second”設定為更高的值。

如果你在這個時間點運作你的專案,一切都會正常,但你將處於一個黑暗的世界。因此,為了完成我們的起點,請在場景中新增一個:ref:DirectionalLight3D <class_directionlight3d> 和一個:ref:WorldEnvironment <class_worldenvironment> 節點。您可能還想將網格實例作為子級新增到每個控制器節點,只是為了暫時可視化它們。確保您在世界環境中配置了天空。

現在運作您的專案,您應該漂浮在太空中的某個位置並且能夠環顧四周。

備註

雖然傳統的關卡切換絕對可以與 XR 應用程式一起使用,其中該場景設定在每個關卡中重複,但大多數人發現更容易設定一次並將關卡載入為子場景。如果您確實切換場景並在每個場景中複製 XR 設定,請確保不要多次執行“初始化”。根據所使用的 XR 接口,效果可能無法預測。

在本基本教學系列的其餘部分中,我們將建立一個使用單一場景的遊戲。