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.

AR / Passthrough

La realtà aumentata è supportata tramite vari metodi, a seconda delle capacità dell'hardware.

Visori come Magic Leap e occhiali come TiltFive mostrano il risultato renderizzato su display trasparenti, permettendo all'utente di vedere il mondo reale.

Visori come Quest, HTC Elite e Lynx R1 implementano questa tecnologia tramite una tecnica chiamata video passthrough, in cui le telecamere registrano il mondo reale e queste immagini sono utilizzate come sfondo su cui viene sovrapposto il risultato renderizzato.

Nota

Il passthrough è implementato molto diversamente a seconda della piattaforma.

In Godot 4.3 abbiamo implementato un approccio unificato, spiegato in questa pagina di aiuto, quindi non devi preoccuparti di queste differenze: l'implementazione di XRInterface è ora responsabile di applicare il metodo corretto dipendente dalla piattaforma [1].

Per i visori come Meta Quest e HTC Elite, bisogna utilizzare l'estensione OpenXR vendors v3.0.0 o successiva per abilitare il video passthrough.

Per retrocompatibilità, la vecchia API per il passthrough è ancora disponibile, ma si consiglia di seguire le nuove istruzioni riportate di seguito.

Modalità di fusione dell'ambiente

Per configurare la funzionalità VR o AR, impostiamo la modalità di fusione dell'ambiente. Questa modalità determina come l'ambiente (del mondo reale) è integrato con il mondo virtuale.

Modalità di fusione

Modalità di fusione

Descrizione

XR_ENV_BLEND_MODE_OPAQUE

L'immagine renderizzata è opaca, non vediamo il mondo reale. Siamo in modalità VR. Questo disattiverà il passthrough se si utilizza il video passthrough.

XR_ENV_BLEND_MODE_ADDITIVE

L'immagine renderizzata viene aggiunta al mondo reale e apparirà semi-trasparente. Questa modalità è generalmente utilizzata con i dispositivi trasparenti che non sono in grado di oscurare il mondo reale. Questa modalità attiverà il passthrough se si utilizza il video passthrough.

XR_ENV_BLEND_MODE_ALPHA_BLEND

L'immagine renderizzata viene sottoposta a fusione alfa con il mondo reale. Sui dispositivi trasparenti che supportano questa funzionalità, la fusione alfa controlla la traslucenza dell'ottica. Sui dispositivi con video passthrough, la fusione alfa viene applicata all'immagine video. Anche il passthrough sarà abilitato, se applicabile.

È possibile impostare la modalità di fusione dell'ambiente per l'applicazione tramite la proprietà environment_blend_mode dell'istanza XRInterface.

È possibile interrogare le modalità di fusione supportate sull'hardware tramite la proprietà get_supported_environment_blend_modes sulla stessa istanza.

Configurare lo sfondo

Quando si imposta la modalità di fusione su XR_ENV_BLEND_MODE_ALPHA_BLEND, è necessario impostare la proprietà transparent_bg su true nella Viewport. Quando si utilizza la modalità di fusione XR_ENV_BLEND_MODE_ADDITIVE, si dovrebbe impostare il colore di sfondo su nero.

Entrambe le soluzioni faranno in modo che il rendering dello sfondo non contribuisca all'illuminazione. Si consiglia pertanto di regolare anche le impostazioni dell'ambiente e di assicurarsi che sia impostata una luce ambientale adeguata per illuminare la scena.

Nota

Alcuni SDK per la realtà aumentata forniscono informazioni sull'illuminazione ambientale o addirittura una mappa di radianza completa per riflessi reali sugli oggetti virtuali. La funzionalità principale di Godot XR al momento non lo supporta, tuttavia è possibile esporla tramite estensioni.

Specifica OpenXR

In OpenXR è possibile configurare la modalità di fusione predefinita che si desidera utilizzare. Godot selezionerà questa modalità di fusione all'avvio, se disponibile. Se non, Godot ricorrerà alla prima modalità di fusione supportata fornita dal runtime XR.

../../_images/openxr_default_blend_mode.webp

Per i dispositivi con passthrough, OpenXR richiede di configurare impostazioni aggiuntive. Queste impostazioni dipendono dalla piattaforma e sono fornite tramite l'estensione dei fornitori OpenXR.

Ad esempio, queste sono le impostazioni richieste su Meta Quest:

../../_images/openxr_export_passthrough.webp

L'impostazione Passthrough definisce se il passthrough è supportato o addirittura obbligatorio.

The Boundary Mode allows you to define whether the guardian is needed, disabling this fully requires passthrough to be enabled at all times.

Mettendo tutto insieme

Mettendo insieme quanto sopra possiamo usare il seguente codice come base:

@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

Ombre a opacità

Ombre a opacità è una modalità di rendering per gli shader spatial di Godot, introdotta in Godot 3 specificamente per la realtà aumentata. Si tratta di una modalità di rendering speciale in cui più una superficie è in ombra, più diventa opaca. Quando una superficie è completamente illuminata, diventa completamente trasparente, mostrando così il mondo reale.

Tuttavia, la superficie è renderizzata effettivamente durante lo stato opaco. Ciò ha due conseguenze:

  • Poiché sono scritti sia il buffer di profondità sia il buffer di colore, occludiamo qualsiasi geometria dietro la nostra superficie, anche quando è completamente trasparente.

  • Poiché rendiamo opaca la superficie se è in ombra, possiamo permettere agli oggetti virtuali di proiettare ombre sugli oggetti del mondo reale [2].

Immagine che mostra l'uso delle ombre a opacità per mostrare la scrivania dell'utente.

Immagine che mostra l'uso delle ombre a opacità per mostrare la scrivania dell'utente.

Ciò ha consentito i seguenti casi d'uso:

  • È possibile renderizzare una mesh box attorno a un tavolo reale, in modo da garantire che il tavolo rimanga visibile anche se un oggetto virtuale viene posizionato sotto di esso. L'oggetto virtuale sarà occluso correttamente. Posizionando un oggetto virtuale sopra il tavolo reale, un'ombra sarà proiettata sul tavolo.

  • È possibile utilizzare uno shader con questa modalità di rendering quando si renderizza una mesh di una mano tramite la funzionalità di tracciamento delle mani e assicurarsi che le mani occludano correttamente gli oggetti virtuali.

Il seguente codice shader è una buona base per questa funzionalità:

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);
}