AR / Passthrough

Augmented Reality wird durch verschiedene Methoden unterstützt, die von den Fähigkeiten der Hardware abhängen.

Headsets wie die Magic Leap und Brillen wie die TiltFive zeigen das gerenderte Ergebnis auf Durchsichts-Displays, so dass der Nutzer die reale Welt sehen kann.

Headsets wie das Quest, das HTC Elite und das Lynx R1 setzen dies durch eine Technik namens Video Passthrough um, bei der die Kameras die reale Welt aufnehmen und diese Bilder als Hintergrund verwendet werden, auf dem unser gerendertes Ergebnis liegt.

Bemerkung

Passthrough wird auf den verschiedenen Plattformen sehr unterschiedlich umgesetzt.

In Godot 4.3 we have implemented a unified approach that is explained on this help page so you don't need to worry about these differences, the XRInterface implementation is now responsible for applying the correct platform-dependent method [1].

Für Headsets wie das Meta Quest und HTC Elite müssen Sie das OpenXR vendors plugin v3.0.0 oder höher verwenden, um Video-Passthrough zu aktivieren.

Aus Gründen der Abwärtskompatibilität ist die alte API für Passthrough weiterhin verfügbar, es wird jedoch empfohlen, die neuen Anweisungen unten zu befolgen.

Environment-Blending-Modi

Die Konfiguration der VR- oder AR-Funktionen erfolgt über die Einstellung des Environment-Blending-Modus. Dieser Modus bestimmt, wie die (reale) Umgebung mit der virtuellen Welt überblendet wird.

Blending-Modi

Blending-Modus

Beschreibung

XR_ENV_BLEND_MODE_OPAQUE

Das gerenderte Bild ist undurchsichtig, wir sehen die reale Welt nicht. Wir befinden uns im VR-Modus. Dies schaltet den Passthrough aus, wenn Video-Passthrough verwendet wird.

XR_ENV_BLEND_MODE_ADDITIVE

Das gerenderte Bild wird der realen Welt hinzugefügt und sieht halbtransparent aus. Dieser Modus wird im Allgemeinen bei Durchsicht-Geräten verwendet, welche die reale Welt nicht verdecken können. Damit wird der Passthrough aktiviert, wenn Video-Passthrough verwendet wird.

XR_ENV_BLEND_MODE_ALPHA_BLEND

Das gerenderte Bild wird mit der realen Welt überblendet. Bei Durchsicht-Geräten, die dies unterstützen, steuert Alpha die Lichtdurchlässigkeit der Optik. Bei Video-Passthrough-Geräten wird Alpha-Blending mit dem Videobild angewendet. Passthrough wird ebenfalls aktiviert, falls anwendbar.

Sie können den Environment-Blending-Modus für Ihre Anwendung durch die Property environment_blend_mode der XRInterface-Instanz festlegen.

Sie können die unterstützten Überblend-Modi auf der Hardware mit der Property get_supported_environment_blend_modes auf derselben Instanz abfragen.

Konfigurieren Ihres Hintergrunds

Wenn Sie den Überblendmodus XR_ENV_BLEND_MODE_ALPHA_BLEND einstellen, müssen Sie die Property transparent_bg im Viewport auf true setzen. Wenn Sie den Überblendmodus XR_ENV_BLEND_MODE_ADDITIVE verwenden, sollten Sie die Hintergrundfarbe auf schwarz setzen.

Beide Lösungen führen dazu, dass das Hintergrund-Rendering nicht zur Beleuchtung beiträgt. Es wird daher empfohlen, die Umgebungseinstellungen entsprechend anzupassen und sicherzustellen, dass das Umgebungslicht ausreichend ist, um die Szene zu beleuchten.

Bemerkung

Einige AR-SDKs bieten Informationen zur Umgebungsbeleuchtung oder sogar eine vollständige Strahlungskarte, um Reflexionen der realen Welt in Ihren virtuellen Objekten zu ermöglichen. Die Kernfunktionalität von Godot XR bietet dafür derzeit keine Unterstützung, aber diese Funktionalität kann durch Plugins bereitgestellt werden.

OpenXR-spezifisch

In OpenXR können Sie den Default-Blending-Modus konfigurieren, den Sie verwenden möchten. Godot wählt diesen Überblendungsmodus beim Start aus, wenn er verfügbar ist. Wenn er nicht verfügbar ist, wählt Godot standardmäßig den ersten von der XR-Runtime unterstützten Überblendungsmodus.

../../_images/openxr_default_blend_mode.webp

For passthrough devices OpenXR requires additional settings to be configured. These settings are platform-dependent and provided through the OpenXR vendors plugin.

Dies sind zum Beispiel die erforderlichen Einstellungen für Meta Quest:

../../_images/openxr_export_passthrough.webp

Die Passthrough-Einstellung definiert, ob Passthrough unterstützt wird oder sogar erforderlich ist.

Mit der Option Grenzmodus können Sie festlegen, ob der Wächter benötigt wird. Wenn Sie diese Option deaktivieren, ist Passthrough immer aktiviert.

Fügen wir alles zusammen

Wenn wir das obige zusammenfügen, erhalten wir nun den folgenden Code als Basis:

@onready var viewport : Viewport = get_viewport()
@onready var environment : Environment = $WorldEnvironment.environment

func switch_to_ar() -> bool:
    var xr_interface: XRInterface = XRServer.primary_interface
    if xr_interface:
        var modes = xr_interface.get_supported_environment_blend_modes()
        if XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND in modes:
            xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
            viewport.transparent_bg = true
        elif XRInterface.XR_ENV_BLEND_MODE_ADDITIVE in modes:
            xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ADDITIVE
            viewport.transparent_bg = false
    else:
        return false

    environment.background_mode = Environment.BG_COLOR
    environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
    environment.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
    return true

func switch_to_vr() -> bool:
    var xr_interface: XRInterface = XRServer.primary_interface
    if xr_interface:
        var modes = xr_interface.get_supported_environment_blend_modes()
        if XRInterface.XR_ENV_BLEND_MODE_OPAQUE in modes:
            xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
        else:
            return false

    viewport.transparent_bg = false
    environment.background_mode = Environment.BG_SKY
    environment.ambient_light_source = Environment.AMBIENT_SOURCE_BG
    return true

Shadow to Opacity

Shadow to Opacity ist ein Rendering-Modus für räumliche Godot-Shader, der in Godot 3 speziell für AR eingeführt wurde. Es ist ein spezieller Rendermodus, bei dem eine Oberfläche umso undurchsichtiger wird, je mehr sie im Schatten liegt. Wenn eine Fläche vollständig beleuchtet ist, wird die Fläche vollständig transparent und zeigt somit die reale Welt.

Allerdings wird die Oberfläche im undurchsichtigen Zustand effektiv gerendert. Dies hat zwei Konsequenzen:

  • Da sowohl in den Tiefenpuffer als auch in den Farbpuffer geschrieben wird, verdecken wir jegliche Geometrie hinter unserer Oberfläche, selbst wenn sie vollständig transparent ist.

  • Da wir die Oberfläche undurchsichtig machen, wenn sie im Schatten liegt, können wir virtuelle Objekte Schatten auf reale Objekte werfen lassen [2].

Das Bild zeigt Shadow to Opacity, das verwendet wird, um den Schreibtisch des Benutzers anzuzeigen.

Das Bild zeigt Shadow to Opacity, das verwendet wird, um den Schreibtisch des Benutzers anzuzeigen.

Dies ermöglichte die folgenden Anwendungsfälle:

  • Sie können ein Box-Mesh um einen realen Tisch rendern. Dadurch wird sichergestellt, dass der Tisch sichtbar bleibt, auch wenn ein virtuelles Objekt darunter platziert wird. Das virtuelle Objekt wird korrekt verdeckt. Wird ein virtuelles Objekt auf dem realen Tisch platziert, so wird ein Schatten auf den Tisch geworfen.

  • Sie können einen Shader mit diesem Rendermodus verwenden, wenn Sie ein Hand-Mesh mit der Hand-Tracking-Funktionalität rendern und sicherstellen, dass Ihre Hände virtuelle Objekte richtig verdecken.

Der folgende Shader-Code ist eine gute Grundlage für diese Funktionalität:

shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, shadow_to_opacity;

void fragment() {
    ALBEDO = vec3(0.0, 0.0, 0.0);
}