WebXRInterface

Hereda: XRInterface < RefCounted < Object

Interfaz XR usando WebXR.

Descripción

WebXR es un estándar abierto que permite crear aplicaciones de RV y RA que se ejecutan en el navegador web.

Como tal, esta interfaz solo está disponible cuando se ejecuta en exportaciones web.

WebXR es compatible con una amplia gama de dispositivos, desde los muy capaces (como Valve Index, HTC Vive, Oculus Rift y Quest) hasta los mucho menos capaces (como Google Cardboard, Oculus Go, GearVR o teléfonos inteligentes comunes).

Dado que WebXR se basa en JavaScript, hace un uso extensivo de los retrollamados, lo que significa que WebXRInterface se ve obligado a usar señales, donde otras interfaces XR usarían funciones que devuelven un resultado de inmediato. Esto hace que WebXRInterface sea un poco más complicado de inicializar que otras interfaces XR.

Aquí está el código mínimo requerido para iniciar una sesión de RV inmersiva:

extends Node3D

var webxr_interface
var vr_supported = false

func _ready():
    # Asumimos que este nodo tiene un botón como hijo.
    # Este botón es para que el usuario consienta a entrar en modo VR inmersivo.
    $Button.pressed.connect(self._on_button_pressed)

    webxr_interface = XRServer.find_interface("WebXR")
    if webxr_interface:
        # WebXR usa muchas retrollamadas asíncronas, así que nos conectamos a varias
        # señales para recibirlas.
        webxr_interface.session_supported.connect(self._webxr_session_supported)
        webxr_interface.session_started.connect(self._webxr_session_started)
        webxr_interface.session_ended.connect(self._webxr_session_ended)
        webxr_interface.session_failed.connect(self._webxr_session_failed)

        # Esto regresa inmediatamente - nuestro método _webxr_session_supported()
        # (que conectamos a la señal "session_supported" arriba) será
        # llamado en algún momento posterior para hacernos saber si es soportado o no.
        webxr_interface.is_session_supported("immersive-vr")

func _webxr_session_supported(session_mode, supported):
    if session_mode == 'immersive-vr':
        vr_supported = supported

func _on_button_pressed():
    if not vr_supported:
        OS.alert("Tu navegador no soporta VR")
        return

    # Queremos una sesión de VR inmersiva, a diferencia de AR ('immersive-ar') o un
    # visor simple de 3DoF ('viewer').
    webxr_interface.session_mode = 'immersive-vr'
    # 'bounded-floor' es escala de habitación, 'local-floor' es una experiencia de pie o sentado
    # (te pone 1.6m sobre el suelo si tienes un casco de 3DoF),
    # mientras que 'local' te pone en el XROrigin.
    # Esta lista significa que primero intentará solicitar 'bounded-floor', luego
    # recurrirá a 'local-floor' y finalmente a 'local', si nada más es
    # soportado.
    webxr_interface.requested_reference_space_types = 'bounded-floor, local-floor, local'
    # Para usar 'local-floor' o 'bounded-floor' también debemos
    # marcar las características como requeridas u opcionales. Al incluir 'hand-tracking'
    # como una característica opcional, se habilitará si es compatible.
    webxr_interface.required_features = 'local-floor'
    webxr_interface.optional_features = 'bounded-floor, hand-tracking'

    # Esto devolverá falso si no podemos siquiera solicitar la sesión,
    # sin embargo, aún puede fallar asíncronamente más tarde en el proceso, así que
    # solo sabemos si realmente ha tenido éxito o ha fallado cuando nuestros
    # métodos _webxr_session_started() o _webxr_session_failed() son llamados.
    if not webxr_interface.initialize():
        OS.alert("Fallo al inicializar")
        return

func _webxr_session_started():
    $Button.visible = false
    # Esto le dice a Godot que empiece a renderizar al casco.
    get_viewport().use_xr = true
    # Este será el tipo de espacio de referencia que obtuviste finalmente, de los
    # tipos que solicitaste arriba. Esto es útil si quieres que el juego
    # funcione un poco diferente en 'bounded-floor' versus 'local-floor'.
    print("Tipo de espacio de referencia: ", webxr_interface.reference_space_type)
    # Esta será la lista de características que se habilitaron con éxito
    # (excepto en los navegadores que no soportan esta propiedad).
    print("Características habilitadas: ", webxr_interface.enabled_features)

func _webxr_session_ended():
    $Button.visible = true
    # Si el usuario sale del modo inmersivo, entonces le decimos a Godot que renderice a la
    # página web de nuevo.
    get_viewport().use_xr = false

func _webxr_session_failed(message):
    OS.alert("Fallo al inicializar: " + message)

Hay un par de formas de manejar la entrada del "controlador":

  • Usando los nodos XRController3D y sus señales XRController3D.button_pressed y XRController3D.button_released. Así es como se suelen manejar los controladores en las aplicaciones XR en Godot, sin embargo, esto solo funcionará con controladores de RV avanzados como los controladores Oculus Touch o Index, por ejemplo.

  • Usando las señales select, squeeze y señales relacionadas. Este método funcionará tanto para los controladores de RV avanzados como para las fuentes de entrada no tradicionales, como un toque en la pantalla, un comando de voz o una pulsación de botón en el propio dispositivo.

Puedes usar ambos métodos para permitir que tu juego o aplicación sea compatible con un conjunto de dispositivos y métodos de entrada más amplio o más estrecho, o para permitir interacciones más avanzadas con dispositivos más avanzados.

Tutoriales

Propiedades

String

enabled_features

String

optional_features

String

reference_space_type

String

requested_reference_space_types

String

required_features

String

session_mode

String

visibility_state

Métodos

Array

get_available_display_refresh_rates() const

float

get_display_refresh_rate() const

TargetRayMode

get_input_source_target_ray_mode(input_source_id: int) const

XRControllerTracker

get_input_source_tracker(input_source_id: int) const

bool

is_input_source_active(input_source_id: int) const

void

is_session_supported(session_mode: String)

void

set_display_refresh_rate(refresh_rate: float)


Señales

display_refresh_rate_changed() 🔗

Emitida después de que la frecuencia de actualización de la pantalla ha cambiado.


reference_space_reset() 🔗

Emitida para indicar que el espacio de referencia se ha restablecido o reconfigurado.

Cuándo (o si) se emite esto depende del navegador o dispositivo del usuario, pero puede incluir cuando el usuario ha cambiado las dimensiones de su espacio de juego (al que puede acceder a través de XRInterface.get_play_area()) o ha presionado/mantenido presionado un botón para recentrar su posición.

Véase el evento de restablecimiento XRReferenceSpace de WebXR para obtener más información.


select(input_source_id: int) 🔗

Emitida después de que una de las fuentes de entrada ha terminado su "acción primaria".

Usa get_input_source_tracker() y get_input_source_target_ray_mode() para obtener más información sobre la fuente de entrada.


selectend(input_source_id: int) 🔗

Emitida cuando una de las fuentes de entrada ha terminado su "acción primaria".

Usa get_input_source_tracker() y get_input_source_target_ray_mode() para obtener más información sobre la fuente de entrada.


selectstart(input_source_id: int) 🔗

Emitida cuando una de las fuentes de entrada ha comenzado su "acción principal".

Usa get_input_source_tracker() y get_input_source_target_ray_mode() para obtener más información sobre la fuente de entrada.


session_ended() 🔗

Emitida cuando el usuario finaliza la sesión WebXR (lo que se puede hacer usando la interfaz de usuario desde el navegador o el dispositivo).

En este punto, debes hacer get_viewport().use_xr = false para indicarle a Godot que reanude el renderizado en la pantalla.


session_failed(message: String) 🔗

Emitida por XRInterface.initialize() si la sesión no se inicia.

message puede contener opcionalmente un mensaje de error de WebXR, o una cadena vacía si no hay ningún mensaje disponible.


session_started() 🔗

Emitida por XRInterface.initialize() si la sesión se inicia correctamente.

En este punto, es seguro hacer get_viewport().use_xr = true para indicarle a Godot que comience a renderizar en el dispositivo XR.


session_supported(session_mode: String, supported: bool) 🔗

Emitida por is_session_supported() para indicar si el session_mode dado es compatible o no.


squeeze(input_source_id: int) 🔗

Emitida después de que una de las fuentes de entrada ha terminado su "acción de apretón principal".

Usa get_input_source_tracker() y get_input_source_target_ray_mode() para obtener más información sobre la fuente de entrada.


squeezeend(input_source_id: int) 🔗

Emitida cuando una de las fuentes de entrada ha terminado su "acción de apretón principal".

Utiliza get_input_source_tracker() y get_input_source_target_ray_mode() para obtener más información sobre la fuente de entrada.


squeezestart(input_source_id: int) 🔗

Emitida cuando una de las fuentes de entrada ha comenzado su "acción de apretón principal".

Utiliza get_input_source_tracker() y get_input_source_target_ray_mode() para obtener más información sobre la fuente de entrada.


visibility_state_changed() 🔗

Emitida cuando visibility_state cambia.


Enumeraciones

enum TargetRayMode: 🔗

TargetRayMode TARGET_RAY_MODE_UNKNOWN = 0

No conocemos el modo de rayo objetivo.

TargetRayMode TARGET_RAY_MODE_GAZE = 1

El rayo objetivo se origina en los ojos del visor y apunta en la dirección en la que están mirando.

TargetRayMode TARGET_RAY_MODE_TRACKED_POINTER = 2

Rayo objetivo de un puntero de mano, probablemente un mando táctil de RV.

TargetRayMode TARGET_RAY_MODE_SCREEN = 3

Rayo objetivo desde la pantalla táctil, ratón u otro dispositivo de entrada táctil.


Descripciones de Propiedades

String enabled_features 🔗

  • String get_enabled_features()

Una lista separada por comas de las características que se habilitaron correctamente mediante XRInterface.initialize() al configurar la sesión WebXR.

Esto puede incluir características solicitadas al establecer required_features y optional_features, y solo estará disponible después de que se haya emitido session_started.

Nota: Es posible que no todos los navegadores web admitan esto, en cuyo caso será una cadena vacía.


String optional_features 🔗

  • void set_optional_features(value: String)

  • String get_optional_features()

A comma-seperated list of optional features used by XRInterface.initialize() when setting up the WebXR session.

If a user's browser or device doesn't support one of the given features, initialization will continue, but you won't be able to use the requested feature.

This doesn't have any effect on the interface when already initialized.

See the MDN documentation on WebXR's session features for a list of possible values.


String reference_space_type 🔗

  • String get_reference_space_type()

El tipo de espacio de referencia (de la lista de tipos solicitados establecidos en la propiedad requested_reference_space_types), que finalmente fue utilizado por XRInterface.initialize() al configurar la sesión WebXR.

Los valores posibles provienen de ` XRReferenceSpaceType de WebXR <https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpaceType>`__. Si deseas utilizar un tipo de espacio de referencia en particular, debe aparecer en required_features o optional_features.


String requested_reference_space_types 🔗

  • void set_requested_reference_space_types(value: String)

  • String get_requested_reference_space_types()

Una lista separada por comas de los tipos de espacio de referencia utilizados por XRInterface.initialize() al configurar la sesión WebXR.

Los tipos de espacio de referencia se solicitan en orden, y se utilizará el primero que sea compatible con el dispositivo o el navegador del usuario. La propiedad reference_space_type contiene el tipo de espacio de referencia que finalmente se seleccionó.

Esto no tiene ningún efecto en la interfaz cuando ya está inicializada.

Los valores posibles provienen de XRReferenceSpaceType de WebXR. Si quieres usar un tipo de espacio de eferencia en particular, debe estar listado en required_features o en optional_features.


String required_features 🔗

  • void set_required_features(value: String)

  • String get_required_features()

Una lista separada por comas de las características requeridas utilizadas por XRInterface.initialize() al configurar la sesión WebXR.

Si el navegador o dispositivo de un usuario no admite una de las características dadas, la inicialización fallará y se emitirá session_failed.

Esto no tiene ningún efecto en la interfaz cuando ya está inicializada.

Consulta la documentación de MDN sobre las características de sesión de WebXR para una lista de valores posibles.


String session_mode 🔗

  • void set_session_mode(value: String)

  • String get_session_mode()

El modo de sesión utilizado por XRInterface.initialize() al configurar la sesión WebXR.

Esto no tiene ningún efecto en la interfaz cuando ya está inicializada.

Los valores posibles provienen de XRSessionMode de WebXR, incluyendo: "immersive-vr", `` "immersive-ar", e ``"inline".


String visibility_state 🔗

  • String get_visibility_state()

Indica si las imágenes de la sesión WebXR son visibles para el usuario.

Los valores posibles provienen de XRVisibilityState de WebXR, incluyendo "hidden", "visible", y "visible-blurred".


Descripciones de Métodos

Array get_available_display_refresh_rates() const 🔗

Devuelve las frecuencias de actualización de pantalla admitidas por el HMD actual. Solo se devuelve si esta característica es compatible con el navegador web y después de que la interfaz se haya inicializado.


float get_display_refresh_rate() const 🔗

Devuelve la frecuencia de actualización de la pantalla para el HMD actual. No es compatible con todos los HMD y navegadores. Es posible que no informe un valor preciso hasta después de usar set_display_refresh_rate().


TargetRayMode get_input_source_target_ray_mode(input_source_id: int) const 🔗

Devuelve el modo de rayo objetivo para el input_source_id dado.

Esto puede ayudar a interpretar la entrada proveniente de esa fuente de entrada. Véase XRInputSource.targetRayMode para obtener más información.


XRControllerTracker get_input_source_tracker(input_source_id: int) const 🔗

Obtiene un XRControllerTracker para el input_source_id dado.

En el contexto de WebXR, una fuente de entrada puede ser un controlador de RV avanzado como los controladores Oculus Touch o Index, o incluso un toque en la pantalla, un comando de voz hablado o una pulsación de botón en el propio dispositivo. Cuando se utiliza una fuente de entrada no tradicional, interpreta la posición y la orientación del XRPositionalTracker como un rayo que apunta al objeto con el que el usuario desea interactuar.

Utiliza este método para obtener información sobre la fuente de entrada que activó una de estas señales:


bool is_input_source_active(input_source_id: int) const 🔗

Devuelve true si se encuentra una fuente de entrada activa con el input_source_id dado.


void is_session_supported(session_mode: String) 🔗

Comprueba si el session_mode dado es compatible con el navegador del usuario.

Los valores posibles provienen de XRSessionMode de WebXR, incluyendo: "immersive-vr", "immersive-ar", e "inline".

Este método no devuelve nada, en su lugar emite la señal session_supported con el resultado.


void set_display_refresh_rate(refresh_rate: float) 🔗

Establece la frecuencia de actualización de la pantalla para el HMD actual. No es compatible con todos los HMD y navegadores. No tendrá efecto de inmediato hasta después de que se emita display_refresh_rate_changed.