Si vous disposez déjà d'un projet XR dans Godot, vous pouvez ajouter la prise en charge d'Android XR sans avoir à créer un projet distinct. Certaines étapes sont obligatoires pour tous les projets, tandis que d'autres sont facultatives en fonction des fonctionnalités XR utilisées par votre projet. Tout au long de ces étapes, nous avons inclus des liens vers plusieurs projets Godot XR Open Source qui ont ajouté la prise en charge d'Android XR, ainsi que des requêtes d'extraction pertinentes qui présentent les modifications nécessaires pour activer certaines fonctionnalités.
Étapes obligatoires pour tous les projets
Suivez les étapes décrites dans les rubriques suivantes, quels que soient les types de fonctionnalités XR compatibles avec votre projet. Ensuite, examinez les fonctionnalités décrites dans la liste des étapes facultatives pour déterminer si votre projet nécessite des modifications supplémentaires.
Mettre à jour Godot et le plug-in Godot OpenXR Vendors
Suivez ces étapes pour mettre à jour votre projet vers les dernières versions requises et configurer les paramètres de votre projet pour Android XR :
- Mettez à jour votre version de Godot vers la version 4.6.2 ou ultérieure. Consultez la documentation sur la migration vers une nouvelle version si vous avez besoin d'aide supplémentaire pour votre projet.
Téléchargez le plug-in Godot OpenXR Vendors version 5.1 ou ultérieure depuis l'Asset Store, l'Asset Library ou le dépôt sur GitHub.
Configurez les paramètres de votre projet pour Android XR :
- Ajoutez un préréglage d'exportation pour Android XR.
- Activez l'option Use Gradle Build (Utiliser la compilation Gradle).
- Dans la section XR Features (Fonctionnalités XR), sélectionnez OpenXR pour le XR Mode, puis sélectionnez Enable AndroidXR Plugin (Activer le plug-in AndroidXR).
Ajouter la prise en charge du suivi des mains
Bien que des manettes puissent être disponibles, la principale méthode d'entrée sur les casques et lunettes Android XR est le suivi des mains. Si possible, vous devez ajouter la prise en charge du suivi des mains à votre projet Godot.
Ajouter la prise en charge du suivi des mains : configurer les paramètres du projet
Tout d'abord, suivez ces étapes pour configurer les paramètres de votre projet afin d'activer le suivi des mains et ses extensions OpenXR associées.
- Ouvrez les paramètres de votre projet et accédez à General > XR > OpenXR (Général > XR > OpenXR).
Dans la section Extensions, sélectionnez Hand Tracking (Suivi des mains) et Hand Interaction Profile (Profil d'interaction avec les mains).
Recherchez la sous-section Meta dans la section Extensions, puis sélectionnez Hand Tracking Mesh (Mesh de suivi des mains) et Hand Tracking Aim (Visée du suivi des mains).
Ajouter la prise en charge du suivi des mains : ajouter et configurer des nœuds de manette
Plutôt que de modifier dynamiquement les nœuds XRController3D existants pour le suivi des mains, ajoutez des nœuds de manette pour suivre et afficher les modèles de mains, ainsi que pour gérer les entrées de l'extension Hand Tracking Aim (Visée du suivi des mains) :
Ajoutez trois nœuds
XRController3Dsupplémentaires à votre nœudXROrigin3D.- Nommez-en un "HandTrackingLeft" et définissez la propriété du tracker sur
/user/hand_tracker/left. - Nommez-en un autre "HandTrackingRight" et définissez la propriété du tracker sur
/user/hand_tracker/right. - Nommez le dernier "HandTrackingAimLeft" et définissez la propriété du tracker sur
/user/fbhandaim/left.
Si les nœuds
XRController3Dd'origine de votre projet étaient nommés "XRController3D_left" et "XRController3D_right", votre scène se présenterait comme suit :
- Nommez-en un "HandTrackingLeft" et définissez la propriété du tracker sur
Connectez le signal
tracking_changedsur HandTrackingLeft et HandTrackingRight à des fonctions individuelles qui mettent à jour la visibilité des trackers de manette correspondants (XRController3D_left et XRController3D_right dans l'exemple précédent).Par exemple, la fonction connectée au signal sur HandTrackingLeft peut se présenter comme suit :
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingActivez la propriété Show When Tracked (Afficher lors du suivi) sur les nœuds de manette de suivi des mains.
Votre projet peut désormais basculer visuellement entre les modèles de manette et les modèles de suivi des mains, selon que l'utilisateur utilise le suivi des mains ou des manettes.
Ajoutez des nœuds
OpenXRFbHandTrackingMeshen tant qu'enfants à vos nœuds de manette de suivi des mains.Ajoutez des nœuds
XRHandModifier3Den tant qu'enfants à ces nœudsOpenXRFbHandTrackingMesh, en vous assurant que la propriété Hand Tracker (Tracker de mains) correcte est définie, afin d'appliquer les données de suivi des mains en temps réel aux modèles.
Ajouter la prise en charge du suivi des mains : configurer un profil d'interaction avec les mains sur la carte d'actions OpenXR
Ensuite, vous allez configurer le profil Hand Interaction (Interaction avec les mains) sur la OpenXR Action Map (Carte d'actions OpenXR) :
- Ouvrez le menu OpenXR Action Map (Carte d'actions OpenXR) en bas de l'éditeur.
- Supprimez le profil Simple Controller (Manette simple) pour éviter les problèmes de compatibilité avec les manettes Galaxy XR.
- Cliquez sur Add Profile (Ajouter un profil), sélectionnez Hand Interaction (Interaction avec les mains), puis cliquez sur OK.
Associez ce profil à un ou plusieurs ensembles d'actions comme vous le souhaitez.
En fonction des exigences de votre application, vous pouvez également ajuster la façon dont votre application gère les entrées utilisateur avec le suivi des mains.
Ajouter la prise en charge du suivi des mains : configurer un geste de menu pour Android XR
Enfin, vous pouvez implémenter un geste de menu pour Android XR. Une icône s'affiche lorsque la main gauche du joueur est dans la bonne position pour effectuer le geste de menu, et le menu s'affiche ou se masque lorsque l'utilisateur effectue le geste. Pour cela, vous utiliserez le nœud HandTrackingAimLeft que vous avez ajouté précédemment.
Ajoutez un quad à panneau d'affichage au nœud de suivi des mains gauche, qui affiche une icône de votre choix (voir le nœud MenuIcon dans l'image suivante à partir des nœuds de manette que vous avez ajoutés précédemment).
Connectez-vous aux signaux
button_pressedetbutton_releasedsur HandTrackingAimLeft à des fonctions comme celle-ci :@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
Étapes facultatives pour certaines fonctionnalités
Une fois les étapes obligatoires pour votre projet terminées, vous pouvez décider si vous devez effectuer des modifications supplémentaires pour certaines fonctionnalités, en fonction des exigences et des capacités de votre application. Pour en savoir plus sur chacune de ces fonctionnalités facultatives, consultez les sections suivantes.
Enregistrer les pincements comme des appuis sur un bouton
Dans Android XR, le pincement est utilisé pour de nombreuses actions système fondamentales, telles que la sélection d'éléments, le défilement, le déplacement ou le redimensionnement de fenêtres, ainsi que le déplacement d'éléments d'interface utilisateur ou d'objets dans un espace 2D et 3D. Pour vous aligner sur ces modèles et offrir une expérience utilisateur cohérente, votre application doit enregistrer les pincements de la même manière que les appuis sur un bouton d'une manette lorsque vous utilisez le suivi des mains.
Pour configurer votre application de cette manière, utilisez les valeurs flottantes fournies par le profil d'interaction avec les mains que vous avez créé pour créer une action virtuelle :
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)
Points clés concernant le code
- Vérifie si la valeur
floatest supérieure ou inférieure à des seuils spécifiques dans les signauxXRController3Dinput_float_changed. - Crée une action virtuelle appelée
pinch_pressed.
Utiliser les fonctions XR Tools avec le suivi des mains
De nombreux projets Godot XR utilisent Godot XR Tools, y compris certains
des projets Open Source liés à cette page. Pour que certaines fonctions XR Tools fonctionnent, telles que FunctionPointer pour les interactions de menu, vous aurez besoin de code supplémentaire pour échanger l'action qu'elle recherche lorsque l'utilisateur passe au suivi des mains.
Par exemple, lorsque vous utilisez FunctionPointer pour les interactions de menu, mettez à jour la
active_button_action propriété vers l'action de suivi des mains en fonction du
tracking_changed signal des XRController3D nœuds pour le suivi des mains (ces
nœuds étaient HandTrackingLeft et HandTrackingRight dans les étapes de configuration du suivi des mains
précédentes).
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
Points clés concernant le code
- Ce code s'appuie sur une action virtuelle
pinch_pressedque vous pouvez créer pour enregistrer les pincements comme des appuis sur un bouton.
Utiliser le suivi des mains avec la locomotion artificielle
Si votre projet utilise la locomotion artificielle, la prise en charge du suivi des mains est toujours possible. Par exemple, vous pouvez créer un système de mouvement qui permet aux joueurs de tracer des chemins à parcourir avec un geste, ou vous pouvez leur permettre de lever et d'abaisser les mains pour accélérer, avec des gestes supplémentaires pour sauter, grimper et glisser.
Le Museum of All Things utilise la locomotion artificielle à l'aide des joysticks des manettes. La locomotion par suivi des mains a été implémentée en ajoutant des "joysticks virtuels" que le joueur déclenche en pinçant l'air et en déplaçant sa main dans la direction dans laquelle il souhaite que le joystick se déplace.
Voici quelques-uns des principaux points à retenir de la demande d'extraction qui a implémenté cette prise en charge :
- Une scène
XRVirtualThumbstickest instanciée lorsqu'un pincement est détecté. - Lorsque le pincement est maintenu, la distance et la direction relatives par rapport à l'emplacement de pincement d'origine sont converties en
Vector2et mappées virtuellement à l'entrée normale du joystick. - Un retour visuel de cette entrée est également fourni au joueur sous la forme de deux maillages quad à panneau d'affichage, illustrant la position du joystick.
Vous pouvez essayer une approche similaire pour que votre code de locomotion existant basé sur le joystick fonctionne avec un minimum de modifications. Toutefois, votre projet peut toujours nécessiter une solution de locomotion personnalisée pour le suivi des mains.
Ajouter la prise en charge du mode passthrough
Vous pouvez ajouter la prise en charge du mode passthrough à votre application afin que vos utilisateurs puissent voir leur environnement réel.
Pour ce faire, apportez les modifications de code suivantes à votre application :
- Définissez le
environment_blend_modede l'OpenXRXRInterfacesurXR_ENV_BLEND_MODE_ALPHA_BLEND. - Définissez le
background_modedu nœudWorldEnvironmentsurBG_COLOR. - Définissez le
background_colordu nœudWorldEnvironmentsur n'importe quelle couleur entièrement transparente. - Définissez la propriété
Viewport transparent_bgsurtrue.
Utiliser l'extension d'estimation de la lumière
Lorsque vous activez le mode passthrough, envisagez d'utiliser l'extension OpenXR d'estimation de la lumière Android XR. Cette extension ajuste les propriétés de WorldEnvironment et DirectionalLight3D pour mieux émuler l'éclairage de l'environnement réel d'un utilisateur. Les objets virtuels se fondent ainsi mieux dans les conditions d'éclairage réelles. Vous pouvez activer cette extension dans les paramètres de votre projet.
- Ouvrez les paramètres de votre projet et accédez à General > XR > OpenXR (Général > XR > OpenXR).
Dans la section Androidxr, sélectionnez Light Estimation (Estimation de la lumière).
Ajoutez un nœud
OpenXRAndroidLightEstimationà l'arborescence de votre scène et connectez-le àWorldEnvironmentetDirectionalLight3Dde votre scène.
Exemple : activer ou désactiver le mode passthrough et l'estimation de la lumière
Le code suivant active ou désactive le mode passthrough et l'estimation de la lumière :
@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
Points clés concernant le code
- Lorsque vous désactivez l'estimation de la lumière, la direction d'origine de
DirectionalLight3Ddoit être restaurée manuellement. - Pour obtenir un exemple complet de projet utilisant le mode passthrough et l'estimation de la lumière, consultez Expedition to Blobotopia sur GitLab.