Se hai un progetto XR esistente in Godot, puoi aggiungere il supporto per Android XR senza avviare un nuovo progetto separato. Alcuni passaggi sono obbligatori per tutti i progetti, mentre altri sono facoltativi a seconda delle funzionalità XR utilizzate dal progetto. Nel corso dei passaggi, abbiamo incluso link a più progetti Godot XR open source che hanno aggiunto il supporto per Android XR, insieme a pull request pertinenti che mostrano le modifiche necessarie per abilitare determinate funzionalità.
Passaggi obbligatori per tutti i progetti
Completa i passaggi descritti negli argomenti seguenti, indipendentemente dai tipi di funzionalità XR supportati dal tuo progetto. Dopodiché, esamina le funzionalità descritte nell'elenco dei passaggi facoltativi per determinare se il tuo progetto richiede un lavoro aggiuntivo.
Aggiornare Godot e il plug-in Godot OpenXR Vendors
Segui questi passaggi per aggiornare il progetto alle versioni richieste più recenti e configurare le impostazioni del progetto per Android XR:
- Aggiorna Godot alla versione 4.6.2 o successive. Consulta la documentazione sulla migrazione a una nuova versione se hai bisogno di ulteriore assistenza per il tuo progetto.
Scarica la versione 5.1 o successive del plug-in Godot OpenXR Vendors dall'Asset Store, dalla libreria di asset o dal repository su GitHub.
Configura le impostazioni del progetto per Android XR:
- Aggiungi un preset di esportazione per Android XR.
- Attiva Usa build Gradle.
- Nella sezione Funzionalità XR, seleziona OpenXR per la Modalità XR e seleziona Attiva plug-in AndroidXR.
Aggiungere il supporto per il tracciamento delle mani
Sebbene i controller possano essere disponibili, il metodo di immissione principale sui visori e sugli occhiali Android XR è il tracciamento delle mani. Se possibile, dovresti aggiungere il supporto del tracciamento delle mani al tuo progetto Godot.
Aggiungere il supporto per il tracciamento delle mani: configura le impostazioni del progetto
Innanzitutto, segui questi passaggi per configurare le impostazioni progetto in modo da attivare il tracciamento della mano e le relative estensioni OpenXR.
- Apri le impostazioni del progetto e vai a Generali > XR > OpenXR.
Nella sezione Estensioni, seleziona Rilevamento della mano e Profilo di interazione con le mani.
Trova la sottosezione Meta nella sezione Estensioni e seleziona Mesh del tracciamento della mano e Puntamento del tracciamento della mano.
Aggiungere il supporto del tracciamento della mano: aggiungi e configura i nodi del controller
Anziché modificare dinamicamente i nodi XRController3D esistenti per il tracciamento delle mani, aggiungi nodi del controller per tracciare e visualizzare i modelli delle mani, nonché per gestire l'input dall'estensione Hand Tracking Aim:
Aggiungi altri tre nodi
XRController3Dal nodoXROrigin3D.- Assegna il nome "HandTrackingLeft" e imposta la proprietà del tracker su
/user/hand_tracker/left. - Assegna un nome a un altro "HandTrackingRight" e imposta la proprietà del tracker su
/user/hand_tracker/right. - Assegna all'ultimo il nome "HandTrackingAimLeft" e imposta la proprietà del tracker su
/user/fbhandaim/left.
Se i nodi
XRController3Doriginali del tuo progetto erano denominati "XRController3D_left" e "XRController3D_right", la scena avrebbe un aspetto simile a questo:
- Assegna il nome "HandTrackingLeft" e imposta la proprietà del tracker su
Collega il segnale
tracking_changedsu HandTrackingLeft e HandTrackingRight a singole funzioni che aggiornano la visibilità dei tracker dei controller corrispondenti (XRController3D_left e XRController3D_right nell'esempio precedente).Ad esempio, la funzione connessa al segnale su HandTrackingLeft potrebbe essere simile a questa:
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingAttiva la proprietà Mostra quando tracciato sui nodi del controller di tracciamento della mano.
Ora il tuo progetto può passare visivamente da un modello di controller a un modello di tracciamento delle mani, a seconda che l'utente utilizzi il tracciamento delle mani o i controller.
Aggiungi alcuni nodi
OpenXRFbHandTrackingMeshcome figli ai nodi del controller di tracciamento delle mani.Aggiungi nodi
XRHandModifier3Dcome figli di questi nodiOpenXRFbHandTrackingMesh, assicurandoti che sia impostata la proprietà Hand Tracker corretta, per applicare i dati di tracciamento delle mani in tempo reale ai modelli.
Aggiungi il supporto per il tracciamento delle mani: configura un profilo di interazione manuale nella mappa delle azioni OpenXR
Successivamente, configurerai il profilo Interazione con le mani nella mappa delle azioni OpenXR:
- Apri il menu OpenXR Action Map nella parte inferiore dell'editor.
- Elimina il profilo Simple Controller per evitare problemi di compatibilità con i controller Galaxy XR.
- Fai clic su Aggiungi profilo, seleziona Interazione con le mani e poi fai clic su Ok.
Mappa questo profilo a uno o più set di azioni come preferisci.
A seconda dei requisiti della tua app, potresti anche voler modificare il modo in cui l'app gestisce l'input utente con il tracciamento delle mani.
Aggiungere il supporto per il tracciamento delle mani: configura un gesto del menu per Android XR
Infine, puoi implementare un gesto del menu per Android XR. Mostra un'icona quando la mano sinistra del giocatore si trova nella posizione corretta per eseguire il gesto del menu, nonché mostra o nasconde il menu quando l'utente esegue il gesto. Per gestire questa operazione, utilizzerai il nodo HandTrackingAimLeft che hai aggiunto in precedenza.
Aggiungi un quad pubblicitario al nodo di tracciamento delle mani a sinistra che mostra un'icona che hai scelto (vedi il nodo MenuIcon nell'immagine seguente dei nodi del controller che hai aggiunto in precedenza).
Connettiti ai segnali
button_pressedebutton_releasedsu HandTrackingAimLeft a funzioni come questa:@onready var menu_icon: MeshInstance3D = $XROrigin3D/HandTrackingLeft/MenuIcon func _on_hand_tracking_aim_left_button_pressed(p_name): if p_name == "menu_pressed": toggle_menu() elif p_name == "menu_gesture": if OS.has_feature("androidxr"): menu_icon.visible = true func _on_hand_tracking_aim_left_button_released(p_name): if p_name == "menu_gesture": menu_icon.visible = false
Passaggi facoltativi per alcune funzionalità
Dopo aver completato i passaggi richiesti per il tuo progetto, decidi se devi svolgere un lavoro aggiuntivo per determinate funzionalità, a seconda dei requisiti e delle funzionalità della tua app. Per ulteriori informazioni su ciascuna di queste funzionalità opzionali, consulta le sezioni seguenti.
Registrare i pizzichi come pressioni dei pulsanti
In Android XR, il pizzico viene utilizzato per molte azioni di base del sistema, ad esempio per selezionare elementi, scorrere, spostare o ridimensionare finestre e spostare elementi o oggetti dell'interfaccia utente nello spazio 2D e 3D. Per allinearsi a questi pattern e promuovere un'esperienza utente coerente, la tua app deve registrare i pizzichi in modo simile alla pressione dei pulsanti su un controller quando si utilizza il tracciamento delle mani.
Per configurare l'app in questo modo, utilizza i valori float forniti dal profilo di interazione con le mani che hai creato per creare un'azione virtuale:
const PRESSED_THRESHOLD := 0.8
const RELEASED_THRESHOLD := 0.6
@onready var left_controller: XRController3D = $XROrigin/XRController3D_left
func _on_xr_controller_3d_left_input_float_changed(p_name: String, value: float):
if p_name == "pinch":
var xr_tracker = XRServer.get_tracker(left_controller.tracker)
if _left_hand_pinching:
if value < RELEASED_THRESHOLD:
_left_hand_pinching = false
xr_tracker.set_input("pinch_pressed", false)
else:
if value > PRESSED_THRESHOLD:
_left_hand_pinching = true
xr_tracker.set_input("pinch_pressed", true)
Punti chiave sul codice
- Controlla se il valore di
floatè maggiore o minore di soglie specifiche negli indicatoriXRController3Dinput_float_changed. - Crea un'azione virtuale denominata
pinch_pressed.
Utilizzare le funzioni di XR Tools insieme al tracciamento delle mani
Molti progetti Godot XR utilizzano Godot XR Tools, inclusi alcuni
dei progetti open source collegati in questa pagina. Per il funzionamento di alcune funzioni di XR Tools, ad esempio FunctionPointer per le interazioni con il menu, è necessario un codice aggiuntivo per scambiare l'azione che cerca quando l'utente passa al tracciamento delle mani.
Ad esempio, quando utilizzi FunctionPointer per le interazioni con i menu, aggiorna la proprietà
active_button_action all'azione di tracciamento delle mani in base all'indicatore
tracking_changed dei nodi XRController3D per il tracciamento delle mani (questi
nodi erano HandTrackingLeft e HandTrackingRight nei precedenti passaggi di
configurazione del tracciamento delle mani).
const TRIGGER_POINTER_ACTION = "trigger_click"
const PINCH_POINTER_ACTION = "pinch_pressed"
@onready var func_point_left: XRToolsFunctionPointer = %FunctionPointerLeft
func _on_hand_tracking_left_tracking_changed(tracking: bool) -> void:
if tracking:
func_point_left.active_button_action = PINCH_POINTER_ACTION
else:
func_point_left.active_button_action = TRIGGER_POINTER_ACTION
Punti chiave sul codice
- Questo codice si basa su un'azione virtuale
pinch_pressedche puoi creare per registrare i pizzichi come pressioni di pulsanti.
Utilizzare il tracciamento della mano insieme al movimento artificiale
Se il tuo progetto utilizza la locomozione artificiale, il supporto del tracciamento della mano è comunque possibile. Ad esempio, puoi creare un sistema di movimento che consenta ai giocatori di disegnare percorsi da attraversare con un gesto oppure puoi consentire ai giocatori di muovere le mani su e giù per accelerare, con gesti aggiuntivi per saltare, arrampicarsi e planare.
The Museum of All Things, ha una locomozione artificiale che utilizza i thumbstick sui controller. La locomozione con il tracciamento delle mani è stata implementata aggiungendo "levette virtuali" che il giocatore attiva pizzicando l'aria e muovendo la mano nella direzione in cui vuole che si muova la levetta.
Ecco alcuni dei punti chiave della richiesta di pull che ha implementato questo supporto:
- Una scena
XRVirtualThumbstickviene istanziata quando viene rilevato il pizzico. - Mentre il pizzico è mantenuto, la distanza e la direzione relative dalla
posizione originale del pizzico vengono trasformate in un
Vector2e mappate virtualmente all'input normale dello stick analogico. - Il giocatore riceve anche un feedback visivo di questo input sotto forma di due mesh quad con cartelloni pubblicitari, che illustrano la posizione dello stick analogico.
Puoi provare un approccio simile per far funzionare il codice di locomozione esistente basato su joystick con modifiche minime. Tuttavia, il tuo progetto potrebbe comunque richiedere una soluzione di locomozione personalizzata per il tracciamento delle mani.
Aggiungere il supporto passthrough
Puoi aggiungere il supporto passthrough alla tua app in modo che gli utenti possano vedere l'ambiente reale che li circonda.
Per farlo per la tua app, apporta le seguenti modifiche al codice:
- Imposta
environment_blend_modedi OpenXRXRInterfacesuXR_ENV_BLEND_MODE_ALPHA_BLEND. - Imposta
background_modedel nodoWorldEnvironmentsuBG_COLOR. - Imposta il
background_colordel nodoWorldEnvironmentsu un colore completamente trasparente. - Imposta la proprietà
Viewport transparent_bgsutrue.
Utilizzare l'estensione di stima della luce
Quando attivi la modalità Passthrough, valuta la possibilità di utilizzare l'estensione OpenXR per la stima della luce di Android XR. Questa estensione modifica le proprietà di WorldEnvironment e
DirectionalLight3D per emulare meglio l'illuminazione dell'ambiente reale di un utente, in modo che gli oggetti virtuali si integrino meglio con le condizioni di illuminazione del mondo reale. Puoi attivare questa estensione nelle impostazioni del progetto.
- Apri le impostazioni del progetto e vai a Generali > XR > OpenXR.
Nella sezione Androidxr, seleziona Light Estimation.
Aggiungi un nodo
OpenXRAndroidLightEstimationall'albero delle scene e collegalo aWorldEnvironmenteDirectionalLight3Ddella scena.
Esempio: attivare o disattivare il passthrough e la stima della luce
Il codice seguente attiva o disattiva il passthrough e la stima della luce:
@onready var world_environment = $WorldEnvironment
@onready var directional_light = $DirectionalLight3D
@onready var directional_light_orig_transform: Transform3D = directional_light.transform
func set_passthrough_enabled(p_enabled: bool) -> void:
var xr_interface = XRServer.find_interface("OpenXR")
if xr_interface == null:
return
var supported_blend_modes = xr_interface.get_supported_environment_blend_modes()
if not supported_blend_modes.has(XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND):
return
# Passthrough
if p_enabled:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_STAGE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
world_environment.environment.background_mode = Environment.BG_COLOR
world_environment.environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
get_viewport().transparent_bg = true
else:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_ROOMSCALE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
world_environment.environment.background_mode = Environment.BG_SKY
get_viewport().transparent_bg = false
# Light Estimation
if OS.has_feature("androidxr"):
var light_estimation = Engine.get_singleton("OpenXRAndroidLightEstimationExtension")
if p_enabled and light_estimation.is_light_estimation_supported():
light_estimation.start_light_estimation()
elif light_estimation.is_light_estimation_started():
light_estimation.stop_light_estimation()
directional_light.transform = directional_light_orig_transform
Punti chiave sul codice
- Quando disattivi la stima della luce, la direzione originale del
DirectionalLight3Ddeve essere ripristinata manualmente. - Per un esempio completo di un progetto che utilizza passthrough e Light Estimation, consulta Expedition to Blobotopia su GitLab.