Up to date

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

Einrichten von XR

Einführung in das XR-System in Godot

Godot bietet ein modulares XR-System, das viele der verschiedenen XR-Plattformspezifika für den Benutzer abstrahiert. Den Kern bildet der XRServer, der als zentrale Schnittstelle zum XR-System fungiert und es den Benutzern ermöglicht, Schnittstellen zu entdecken und mit den Komponenten des XR-Systems zu interagieren.

Jede unterstützte XR-Plattform ist als XRInterface implementiert. Unterstützte Schnittstellen registrieren sich beim XRServer und können mit der Methode find_interface auf dem XRServer abgefragt werden. Wenn das gewünschte Interface gefunden wurde, kann es durch den Aufruf von initialize auf dem Interface initialisiert werden.

Warnung

Ein registriertes Interface bedeutet nichts weiter, als dass das Interface verfügbar ist. Wenn das Interface vom Hostsystem nicht unterstützt wird, kann die Initialisierung fehlschlagen und false zurückgeben. Dies kann viele Gründe haben und leider sind die Gründe von Plattform zu Plattform unterschiedlich. Es kann daran liegen, dass der Benutzer die erforderliche Software nicht installiert hat, oder dass der Benutzer einfach sein Headset nicht angeschlossen hat. Sie als Entwickler müssen also richtig reagieren, wenn die Schnittstelle nicht initialisiert werden kann.

Aufgrund der besonderen Anforderungen an die Ausgabe in XR, insbesondere bei auf dem Kopf getragenen Geräten, die für jedes Auge ein anderes Bild liefern, überschreibt der XRServer in Godot verschiedene Funktionen des Rendering-Systems. Für eigenständige Geräte bedeutet dies, dass die endgültige Ausgabe vom XRInterface gehandhabt wird und das übliche Ausgabesystem von Godot deaktiviert ist. Für Desktop-XR-Geräte, die als zweiter Bildschirm arbeiten, ist es möglich, einen separaten Viewport für die XR-Ausgabe zu verwenden, so dass das Godot-Hauptfenster für die Anzeige alternativer Inhalte verfügbar bleibt.

Bemerkung

Beachten Sie, dass nur ein Interface für die Verarbeitung der Ausgabe an ein XR-Gerät zuständig sein kann. Dieses Interface wird als primäres Interface bezeichnet und ist standardmäßig das erste Interface, das initialisiert wird. Godot unterstützt daher derzeit nur Implementierungen mit einem einzigen Headset. Es ist möglich, aber zunehmend unüblich, ein sekundäres Interface zu haben, z.B. um Tracking zu einem ansonsten nur 3DOF-Gerät hinzuzufügen.

Es gibt drei XR-spezifische Node-Typen, die Sie in fast allen XR-Anwendungen finden werden:

  • XROrigin3D stellt in jeder Hinsicht den Mittelpunkt deines Spielbereichs dar. Das ist eine stark vereinfachte Aussage, aber wir werden später mehr ins Detail gehen. Alle Objekte, die von der XR-Plattform im physischen Raum verfolgt werden, werden im Verhältnis zu diesem Punkt positioniert.

  • XRCamera3D stellt die (Stereo-)Kamera dar, die beim Rendern der Ausgabe für das XR-Gerät verwendet wird. Die Positionierung dieses Nodes wird durch das XR-System gesteuert und automatisch anhand der von der XR-Plattform bereitgestellten Tracking-Informationen aktualisiert.

  • XRController3D stellt einen Controller dar, der vom Spieler benutzt wird, üblicherweise sind es zwei, einer in jeder Hand. Diese Nodes ermöglichen den Zugriff auf verschiedene Zustände dieser Controller und senden Signale aus, wenn der Spieler Tasten auf ihnen drückt.

Es gibt noch weitere XR-bezogene Nodes und es gibt noch viel mehr über diese drei Nodes zu sagen, aber dazu kommen wir später.

Voraussetzungen für XR in Godot 4

Während bei Godot 3 die meisten Dinge sofort funktionierten, ist bei Godot 4 etwas mehr Einarbeitungszeit erforderlich. Das liegt vor allem an der fortschrittlicheren Natur des Vulkan-Renderers. Es gibt viele Rendering-Funktionen in Vulkan, die das XR-System verwendet, die standardmäßig nicht aktiviert sind. Sie sind sehr einfach einzuschalten: Öffnen Sie einfach Ihre Projekteinstellungen und aktiveren Sie die Checkbox "XR-Shader" im Abschnitt XR:

../../_images/xr_shaders.png

Warnung

Da sich Godot 4 noch in der Entwicklung befindet, sind viele Nachbearbeitungseffekte noch nicht für das stereoskopische Rendering aktualisiert worden. Die Verwendung dieser Effekte hat nachteilige Auswirkungen.

Bemerkung

Godot 4 has 3 renderer options, Compatibility, Mobile, and Forward+. In the future XR desktop projects should use Forward+, and projects for stand-alone headsets should use Mobile. However Compatibility is the recommended renderer for now due to it having the best XR performance.

OpenXR

OpenXR ist ein neuer Industriestandard, der es verschiedenen XR-Plattformen ermöglicht, sich über eine standardisierte API für XR-Anwendungen zu präsentieren. Dieser Standard ist ein offener Standard, der von der Khronos Group gepflegt wird und somit sehr gut mit den Interessen von Godot übereinstimmt.

Die Vulkan-Implementierung von OpenXR ist eng mit Vulkan gekoppelt und übernimmt einen Teil des Vulkan-Systems. Dies erfordert eine enge Integration bestimmter Kerngrafikfunktionen in den Vulkan-Renderer, die erforderlich sind, bevor das XR-System eingerichtet wird. Dies war einer der wichtigsten Entscheidungsfaktoren für die Aufnahme von OpenXR als Kernschnittstelle.

Das bedeutet auch, dass OpenXR beim Starten von Godot aktiviert sein muss, um die Dinge korrekt einzurichten. Die erforderliche Einstellung finden Sie in Ihren Projekteinstellungen:

../../_images/openxr_settings.png

Während die Einrichtung mit OpenXR voranschreitet, können Sie hier verschiedene andere OpenXR-Einstellungen finden. Diese können nicht geändert werden, während Ihre Anwendung läuft. Die Default-Einstellungen sind für den Anfang ausreichend und werden in einem anderen Abschnitt der Dokumentation näher erläutert.

Einrichten der XR-Szene

Jede XR Anwendung benötigt mindestens einen XROrigin3D und einen XRCamera3D-Node. Die meisten werden zwei XRController3D haben, einen für die linke Hand und einen für die rechte. Denken Sie daran, dass die Kamera- und Controller-Nodes Child-Nodes des "origin"-Nodes sein sollten. Fügen Sie diese Nodes zu einer neuen Szene hinzu und benennen Sie die Controller Nodes in LeftHand und RightHand um, Ihre Szene sollte etwa so aussehen:

../../_images/xr_basic_scene.png

Als Nächstes müssen Sie die Controller konfigurieren. Wählen Sie die linke Hand und richten Sie sie wie folgt ein:

../../_images/xr_left_hand.png

Und die rechten Hand:

../../_images/xr_right_hand.png

Im Moment befinden sich alle diese Nodes auf dem Boden, sie werden zur Laufzeit richtig positioniert sein. Um bei der Entwicklung zu helfen, kann es hilfreich sein, die Kamera nach oben zu verschieben, so dass ihr y auf 1.7 gesetzt wird, und die Controller-Nodes auf -0.5, 1.0, -0.5 und 0.5, 1.0, -0.5 für die linke bzw. rechte Hand zu verschieben.

Als nächstes müssen wir ein Skript zu unserem Root-Node hinzufügen. Fügen Sie den folgenden Code in dieses Skript ein:

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")

Dieses Codefragment geht davon aus, dass wir OpenXR verwenden. Wenn Sie eine der anderen Schnittstellen verwenden möchten, können Sie den Aufruf find_interface ändern.

Warnung

Wie Sie im obigen Codeschnipsel sehen können, schalten wir V-Sync aus. Wenn Sie OpenXR verwenden, geben Sie die Rendering-Ergebnisse an ein HMD aus, das oft eine Bildwiederholfrequenz von 90 Hz oder mehr erfordert. Wenn Ihr Monitor ein 60-Hz-Monitor ist und V-Sync eingeschaltet ist, wird die Ausgabe auf 60 Frames pro Sekunde begrenzt.

XR-Interfaces wie OpenXR führen ihre eigene Synchronisierung durch.

Beachten Sie auch, dass die Physik-Engine standardmäßig mit 60Hz läuft, was zu einer ruckeligen Physik führen kann. Sie sollten Engine.physics_ticks_per_second auf einen höheren Wert setzen.

Wenn Sie Ihr Projekt zu diesem Zeitpunkt starten, wird alles funktionieren, aber Sie werden sich in einer dunklen Welt befinden. Um unseren Ausgangspunkt zu vervollständigen, fügen Sie einen DirectionalLight3D und einen WorldEnvironment-Node zu Ihrer Szene hinzu. Vielleicht möchten Sie auch eine Mesh-Instanz als Child-Node zu jedem Controller-Node hinzufügen, nur um sie vorübergehend zu visualisieren. Stellen Sie sicher, dass Sie einen Himmel in Ihrer World Environment konfigurieren.

Starten Sie nun Ihr Projekt. Sie sollten irgendwo im Raum schweben und sich umsehen können.

Bemerkung

Während der traditionelle Level-Wechsel durchaus mit XR-Anwendungen verwendet werden kann, bei denen diese Szeneneinrichtung in jeder Ebene wiederholt wird, finden es die meisten einfacher, dies einmal einzurichten und Level als Unterszene zu laden. Wenn Sie die Szenen wechseln und das XR-Setup in jeder Szene wiederholen, stellen Sie sicher, dass Sie initialize nicht mehrfach ausführen. Der Effekt kann unvorhersehbar sein, abhängig von der verwendeten XR-Schnittstelle.

Im weiteren Verlauf dieser grundlegenden Tutorial-Reihe werden wir ein Spiel erstellen, das eine einzige Szene verwendet.