Si tienes un proyecto de realidad extendida existente en Godot, puedes agregar compatibilidad con Android XR sin iniciar un proyecto nuevo y separado. Algunos pasos son obligatorios para todos los proyectos, mientras que otros son opcionales según las funciones de realidad extendida que use tu proyecto. A lo largo de los pasos, incluimos vínculos a varios proyectos de realidad extendida de Godot de código abierto que agregaron compatibilidad con Android XR, junto con solicitudes de extracción pertinentes que muestran los cambios necesarios para habilitar ciertas funciones.
Pasos obligatorios para todos los proyectos
Completa los pasos de los siguientes temas, sin importar qué tipos de funciones de realidad extendida admita tu proyecto. Luego, revisa las funciones que se describen en la lista de pasos opcionales para determinar si tu proyecto requiere trabajo adicional.
Actualiza Godot y el complemento de proveedores de OpenXR de Godot
Sigue estos pasos para actualizar tu proyecto a las versiones obligatorias más recientes y configurar los parámetros de configuración de tu proyecto para Android XR:
- Actualiza tu versión de Godot a 4.6.2 o una posterior. Consulta la documentación sobre la migración a una versión nueva si necesitas ayuda adicional para tu proyecto.
Descarga el complemento de proveedores de OpenXR de Godot versión 5.1 o posterior desde Asset Store, Asset Library o el repositorio en GitHub.
Configura los parámetros de configuración de tu proyecto para Android XR:
- Agrega un ajuste predeterminado de exportación para Android XR.
- Habilita Usar compilación de Gradle.
- En la sección Funciones de realidad extendida, selecciona OpenXR para el Modo de realidad extendida, y selecciona Habilitar complemento de AndroidXR.
Agrega compatibilidad con el monitoreo de manos
Si bien los controles pueden estar disponibles, el método de entrada principal en los visores de realidad extendida y los lentes de realidad extendida de Android XR es el monitoreo de manos. Si es posible, debes agregar compatibilidad con el seguimiento de manos a tu proyecto de Godot.
Agrega compatibilidad con el monitoreo de manos: Configura los parámetros de configuración del proyecto
Primero, sigue estos pasos para configurar los parámetros de configuración de tu proyecto para habilitar el seguimiento de manos y sus extensiones de OpenXR relacionadas.
- Abre los parámetros de configuración de tu proyecto y navega a General > XR > OpenXR.
En la sección Extensiones, selecciona Seguimiento de manos y Perfil de interacción con las manos.
Busca la subsección Meta en la sección Extensiones y selecciona Malla de seguimiento de manos y Objetivo de seguimiento de manos.
Agrega compatibilidad con el monitoreo de manos: Agrega y configura nodos de control
En lugar de modificar de forma dinámica los nodos XRController3D existentes para el seguimiento de manos, agrega nodos de control para realizar un seguimiento y mostrar los modelos de manos, así como para controlar la entrada de la extensión Objetivo de seguimiento de manos:
Agrega tres nodos
XRController3Dadicionales a tu nodoXROrigin3D.- Asigna el nombre "HandTrackingLeft" a uno y establece la propiedad del rastreador en
/user/hand_tracker/left. - Asigna el nombre "HandTrackingRight" a otro y establece la propiedad del rastreador en
/user/hand_tracker/right. - Asigna el nombre "HandTrackingAimLeft" al último y establece la propiedad del rastreador en
/user/fbhandaim/left.
Si los nodos
XRController3Doriginales de tu proyecto se llamaban "XRController3D_left" y "XRController3D_right", tu escena se vería de la siguiente manera:
- Asigna el nombre "HandTrackingLeft" a uno y establece la propiedad del rastreador en
Conecta la señal
tracking_changeden HandTrackingLeft y HandTrackingRight a funciones individuales que actualicen la visibilidad de los rastreadores de control correspondientes (XRController3D_left y XRController3D_right en el ejemplo anterior).Por ejemplo, la función conectada a la señal en HandTrackingLeft podría verse de la siguiente manera:
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingHabilita la propiedad Mostrar cuando se monitorea en los nodos de control de monitoreo de manos.
Ahora, tu proyecto puede intercambiar visualmente entre modelos de control y modelos de monitoreo de manos, según si el usuario usa el monitoreo de manos o los controles.
Agrega algunos nodos
OpenXRFbHandTrackingMeshcomo elementos secundarios a los nodos de control de monitoreo de manos.Agrega nodos
XRHandModifier3Dcomo elementos secundarios a estos nodosOpenXRFbHandTrackingMeshy asegúrate de que se establezca la propiedad Hand Tracker correcta para aplicar datos de monitoreo de manos en tiempo real a los modelos.
Agrega compatibilidad con el monitoreo de manos: Configura un perfil de interacción con las manos en el mapa de acciones de OpenXR
A continuación, configurarás el perfil de interacción con las manos en el mapa de acciones de OpenXR :
- Abre el menú Mapa de acciones de OpenXR en la parte inferior del editor.
- Borra el perfil Controlador simple para evitar problemas de compatibilidad con los controles de Galaxy XR.
- Haz clic en Agregar perfil, selecciona Interacción con las manos y, luego, haz clic en Aceptar.
Asigna este perfil a uno o más conjuntos de acciones como quieras.
Según los requisitos de tu app, es posible que también quieras ajustar la forma en que tu app controla la entrada del usuario con el monitoreo de manos.
Agrega compatibilidad con el monitoreo de manos: Configura un gesto de menú para Android XR
Por último, puedes implementar un gesto de menú para Android XR. Esto muestra un ícono cuando la mano izquierda del jugador está en la posición correcta para realizar el gesto de menú, además de mostrar u ocultar el menú cuando el usuario realiza el gesto. Usarás el nodo HandTrackingAimLeft que agregaste antes para controlar esto.
Agrega un quad con cartelera al nodo de monitoreo de manos izquierdo que muestre un ícono que elegiste (consulta el nodo MenuIcon en la siguiente imagen de los nodos de control que agregaste antes).
Conéctate a las señales
button_pressedybutton_releaseden HandTrackingAimLeft a funciones como esta:@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
Pasos opcionales para ciertas funciones
Después de completar los pasos obligatorios para tu proyecto, decides si necesitas realizar trabajo adicional para ciertas funciones, según los requisitos y las capacidades de tu app. Para obtener más información sobre cada una de estas funciones opcionales, consulta las siguientes secciones.
Registra los pellizcos como presiones de botones
En Android XR, el pellizco se usa para muchas acciones fundamentales del sistema, como seleccionar elementos, desplazarse, mover o cambiar el tamaño de las ventanas, y mover elementos o objetos de la IU en espacios 2D y 3D. Para alinearse con estos patrones y promover una experiencia del usuario coherente, tu app debe registrar los pellizcos de manera similar a las presiones de botones en un control cuando se usa el monitoreo de manos.
Para configurar tu app de esta manera, usa los valores de número de punto flotante que proporciona el perfil de interacción con las manos que creaste para crear una acción virtual:
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)
Puntos clave sobre el código
- Verifica si el valor
floates mayor o menor que los umbrales específicos en las señalesXRController3Dinput_float_changed. - Crea una acción virtual llamada
pinch_pressed.
Usa las funciones de XR Tools junto con el monitoreo de manos
Muchos proyectos de realidad extendida de Godot utilizan XR Tools de Godot, incluidos algunos
de los proyectos de código abierto que se vinculan en esta página. Para que funcionen algunas funciones de XR Tools, como FunctionPointer para las interacciones de menú, necesitarás código adicional para intercambiar la acción que busca cuando el usuario cambia al monitoreo de manos.
Por ejemplo, cuando uses FunctionPointer para las interacciones de menú, actualiza la
active_button_action propiedad a la acción de monitoreo de manos según la
tracking_changed señal de los XRController3D nodos para el monitoreo de manos (estos
nodos eran HandTrackingLeft y HandTrackingRight en los pasos anteriores de configuración del monitoreo de manos).
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
Puntos clave sobre el código
- Este código se basa en una acción virtual
pinch_pressedque puedes crear para registrar los pellizcos como presiones de botones.
Usa el monitoreo de manos junto con la locomoción artificial
Si tu proyecto usa la locomoción artificial, aún es posible la compatibilidad con el monitoreo de manos. Por ejemplo, puedes crear un sistema de movimiento que permita a los jugadores dibujar rutas para atravesar con un gesto, o puedes permitir que los jugadores bombeen sus manos hacia arriba y hacia abajo para acelerar, con gestos adicionales para saltar, escalar y deslizarse.
El Museo de todas las cosas tiene locomoción artificial con los joysticks de los controles. La locomoción de monitoreo de manos se implementó agregando "joysticks virtuales" que el jugador activa pellizcando en el aire y moviendo la mano en la dirección en la que quiere que se mueva ese joystick.
Estos son algunos de los puntos clave de la solicitud de extracción que implementó esta compatibilidad:
- Se crea una instancia de una escena
XRVirtualThumbstickcuando se detecta un pellizco. - Mientras se mantiene el pellizco, la distancia y la dirección relativas desde la ubicación original del pellizco se convierten en un
Vector2y se asignan virtualmente a la entrada normal del joystick. - También se le proporciona al jugador feedback visual de esta entrada en forma de dos mallas quad con cartelera, que ilustran la posición del joystick.
Puedes probar un enfoque similar para que tu código de locomoción existente basado en joystick funcione con cambios mínimos. Sin embargo, es posible que tu proyecto aún requiera una solución de locomoción personalizada para el monitoreo de manos.
Agrega compatibilidad con el modo de transmisión
Puedes agregar compatibilidad con el modo de transmisión a tu app para que los usuarios puedan ver su entorno del mundo real.
Para hacerlo en tu app, realiza los siguientes cambios de código:
- Establece el
environment_blend_modede OpenXRXRInterfaceenXR_ENV_BLEND_MODE_ALPHA_BLEND. - Establece el
background_modedel nodoWorldEnvironmentenBG_COLOR. - Establece el
background_colordel nodoWorldEnvironmenten cualquier color que sea completamente transparente. - Establece la propiedad
Viewport transparent_bgentrue.
Usa la extensión de estimación de luz
Cuando habilites el modo de transmisión, considera usar la extensión de OpenXR de estimación de luz de Android XR. Esta extensión ajusta las propiedades de WorldEnvironment y DirectionalLight3D para emular mejor la iluminación del entorno del mundo real de un usuario, de modo que los objetos virtuales se combinen mejor con las condiciones de iluminación del mundo real. Puedes habilitar esta extensión en la configuración de tu proyecto.
- Abre los parámetros de configuración de tu proyecto y navega a General > XR > OpenXR.
En la sección Androidxr, selecciona Estimación de luz.
Agrega un nodo
OpenXRAndroidLightEstimational árbol de escena y conéctalo aWorldEnvironmentyDirectionalLight3Dde tu escena.
Ejemplo: Habilita o inhabilita el modo de transmisión y la estimación de luz
El siguiente código habilita o inhabilita el modo de transmisión y la estimación de luz:
@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
Puntos clave sobre el código
- Cuando se inhabilita la estimación de luz, se debe restablecer manualmente la dirección original de
DirectionalLight3D. - Para obtener un ejemplo completo de un proyecto que usa el modo de transmisión y la estimación de luz, consulta Expedition to Blobotopia en GitLab.