Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
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.
Each supported XR platform is implemented as an XRInterface.
A list of supported platforms can be found on the list of features page here.
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.
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.
Welche Renderer zu verwenden
Godot has 3 renderer options for projects: Compatibility, Mobile, and Forward+. The current recommendation is to use the Mobile renderer for any desktop VR project, and use the Compatibility renderer for any project running on a standalone headset like the Meta Quest 3. XR projects will run with the Forward+ renderer, but it isn't well optimized for XR right now compared to the other two.
OpenXR
OpenXR is a new industry standard that allows different XR platforms to present themselves through a standardized API to XR applications. This standard is an open standard maintained by the Khronos Group and thus aligns very well with Godot's interests.
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.
This also means OpenXR needs to be enabled when Godot starts in order to set things up correctly. Check the Enabled setting in your project settings under XR > OpenXR.
You can find several other settings related to OpenXR here as well. These can't be changed while your application is running. The default settings will get us started, but for more information on what's here see OpenXR-Einstellungen.
You'll also need to go to XR > Shaders in the project settings and check the Enabled box to enable them. Once you've done that click the Save & Restart button.
Warnung
Many post process effects have not yet been updated to support stereoscopic rendering. Using these will have adverse effects.
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:
Die Warnungen sollten verschwinden nachdem Sie die Controller konfiguriert haben. Wählen Sie die linke Hand und richten Sie sie wie folgt ein:
Und die rechte Hand:
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")
using Godot;
public partial class MyNode3D : Node3D
{
private XRInterface _xrInterface;
public override void _Ready()
{
_xrInterface = XRServer.FindInterface("OpenXR");
if(_xrInterface != null && _xrInterface.IsInitialized())
{
GD.Print("OpenXR initialized successfully");
// Turn off v-sync!
DisplayServer.WindowSetVsyncMode(DisplayServer.VSyncMode.Disabled);
// Change our main viewport to output to the HMD
GetViewport().UseXR = true;
}
else
{
GD.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.