Parte: 13 — VR, AR y experiencias inmersivas · Fuente: Documentación de ARCore (Google), ARKit (Apple) y de plugins XR para Godot 4 ⏱️ Duración estimada: 85 min · Nivel: Avanzado
ARCore (Android) y ARKit (iOS) son los motores de AR de cada plataforma: detectan planos, siguen la pose del dispositivo y ofrecen hit-test para saber dónde apoya un rayo en el mundo real. Godot accede a ellos mediante plugins/addons que registran una interfaz XR y exponen los planos detectados y las anclas como nodos. En esta clase pasarás de la teoría de la clase anterior a una app funcional: tocar la pantalla, lanzar un hit-test sobre un plano y colocar un objeto anclado que se mantiene fijo al moverte.
Aprenderás la estructura típica del plugin, cómo iterar los planos detectados, cómo crear una ancla desde un hit-test y qué limitaciones aceptar (rendimiento, calidad del tracking, dependencia del dispositivo). El código es representativo del patrón que exponen estos plugins; el nombre exacto de algunos métodos puede variar según el addon.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Plugins ARCore/ARKit en Godot | Conectan el AR nativo con el motor. |
| 2 | Inicializar la sesión AR | Sin ella no hay tracking ni passthrough. |
| 3 | Planos detectados como nodos | Dan superficies reales donde apoyar objetos. |
| 4 | Hit-test desde el toque | Traduce un tap 2D a un punto 3D real. |
| 5 | Crear anclas | Fijan el objeto al mundo con corrección de tracking. |
| 6 | Colocar y parentar objetos | El objeto sigue a la ancla al moverse. |
| 7 | Export a Android/iOS | AR solo corre en el dispositivo, no en editor. |
| 8 | Limitaciones y buenas prácticas | Marcan qué esperar y qué evitar. |
XRServer. Clave: sin él, find_interface devuelve null.XRAnchor3D: nodo cuya pose la mantiene el sistema de tracking. Clave: parenta objetos que deben quedar fijos al mundo.Necesitas: un móvil Android con ARCore o un iPhone con ARKit, los export templates de Godot para esa plataforma, y un plugin AR para Godot 4 (busca addons de ARCore/ARKit en el Asset Library o repositorios de la comunidad). Instala el plugin en res://addons/ y actívalo en Project → Project Settings → Plugins. Ten el SDK de Android (o Xcode en Mac) configurado para exportar. En el editor de escritorio el AR no funciona: se prueba exportando al dispositivo.
Referencias: ARCore en https://developers.google.com/ar, ARKit en https://developer.apple.com/augmented-reality/ y exportación en https://docs.godotengine.org/en/stable/tutorials/export/index.html.
Detectaremos un plano y colocaremos un objeto anclado tocando la pantalla.
Activa el plugin AR y confirma que aparece en la lista de Plugins. Reutiliza el árbol de la clase 235: XROrigin3D → XRCamera3D, más el contenedor Anclas.
Inicializa la sesión AR en _ready. Al inicializarse, la cámara empieza a mostrar el passthrough:
extends Node3D
@onready var anclas: Node3D = $Anclas
@onready var objeto_a_colocar: PackedScene = preload("res://escenas/objeto_ar.tscn")
var interfaz_ar: XRInterface
func _ready() -> void:
interfaz_ar = XRServer.find_interface("ARCore") # "ARKit" en iOS
if interfaz_ar and interfaz_ar.initialize():
get_viewport().use_xr = true
print("Sesion AR activa: mueve el dispositivo para detectar planos.")
else:
push_error("No se pudo iniciar AR. Revisa plugin y dispositivo.")
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventScreenTouch and event.pressed:
_colocar_en_toque(event.position)
func _colocar_en_toque(posicion_pantalla: Vector2) -> void:
# El plugin expone el hit-test contra los planos rastreados.
var resultado := interfaz_ar.hit_test(posicion_pantalla)
if resultado.is_empty():
print("El toque no impacto ningun plano detectado.")
return
var pose: Transform3D = resultado[0] # pose del impacto mas cercano
_anclar_objeto(pose)
XRAnchor3D, el sistema lo mantendrá fijo al mundo real:func _anclar_objeto(pose: Transform3D) -> void:
var ancla := XRAnchor3D.new()
anclas.add_child(ancla)
ancla.global_transform = pose
var objeto := objeto_a_colocar.instantiate()
ancla.add_child(objeto)
print("Objeto anclado en ", pose.origin)
Prepara la escena objeto_ar.tscn: un MeshInstance3D con un BoxMesh de 0.1 m y un material visible. Mantenlo simple para no penalizar el rendimiento en el móvil.
Exporta al dispositivo (APK en Android o build en Xcode para iOS). Instala, abre la app y mueve el teléfono despacio sobre una mesa con textura hasta que se detecte un plano.
Toca sobre el plano: debe aparecer el cubo apoyado en la superficie real. Camina alrededor: el cubo permanece en su sitio gracias a la ancla. Si "deriva", el tracking es pobre (poca luz o textura): mejora las condiciones.
Ya tienes AR funcional: detección de planos, hit-test y anclas. En la próxima clase atacamos el rendimiento, crítico en XR.
Construye una app AR que detecte planos horizontales y, al tocar la pantalla sobre uno, coloque un objeto anclado mediante hit-test. La app debe manejar el caso de toque sin impacto (mensaje claro, sin crash) y mantener los objetos fijos al mundo al desplazarse el dispositivo.
Criterio de aceptación: exportada al dispositivo, la app detecta un plano, coloca un objeto sobre él al tocar, el objeto permanece anclado al caminar alrededor, y un toque fuera de un plano no coloca nada ni provoca error.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
find_interface devuelve null |
Plugin no activado o dispositivo incompatible. Actívalo en Plugins y verifica ARCore/ARKit. |
| Nada ocurre al probar en el editor | AR no corre en escritorio. Exporta al dispositivo real. |
| El objeto aparece en el aire | El hit-test no impactó un plano; usaste una pose de punto suelto. Filtra por planos. |
| El objeto deriva al moverse | Tracking pobre por poca luz/textura. Mejora las condiciones del entorno. |
| Crash al tocar sin planos | No comprobaste resultado.is_empty(). Valida antes de usar la pose. |
❓ ¿Los nombres de los métodos del plugin son siempre estos? Varían según el addon. find_interface, initialize y XRAnchor3D son estándar de Godot; el hit_test concreto lo define el plugin, revisa su documentación.
❓ ¿Puedo depurar AR sin dispositivo? No de forma realista. Puedes validar la lógica de escena en escritorio, pero el tracking y el passthrough exigen el móvil.
❓ ¿Por qué mi objeto se ve gigante o diminuto? El hit-test devuelve metros reales; modela el objeto a escala 1:1 como en VR.
❓ ¿Cuántos objetos puedo anclar? Depende del rendimiento del dispositivo. Cada ancla consume tracking; limita el número y usa mallas simples.
Clase 235 - Realidad aumentada: fundamentos y tracking