Este contenido es exclusivo para estudiantes que compraron el curso intermedio. Aqui pasamos de
una experiencia basica a un proyecto WebAR organizado, multi-target y listo para publicar.
Modulo 0
Bienvenida al curso intermedio
En el curso basico creaste una experiencia con un target. En este curso vas a construir una
experiencia multi-target con codigo separado, UI sobre camara, multimedia, optimizacion y template final.
Resultado del curso
Multi-target
Un archivo .mind con dos imagenes objetivo.
Contenido distinto
Un target muestra un modelo 3D y otro reproduce video.
Template completo
Al final tendras un ZIP con todo armado para practicar.
Modulo 1
Estructura profesional de un proyecto WebAR
Primero creamos una estructura de carpetas clara. Esto evita rutas confusas cuando el proyecto crece.
Esta primera parte no parece codigo, pero es una decision tecnica importante. En WebAR vas a trabajar con
varios tipos de archivos al mismo tiempo: una escena HTML, estilos CSS, logica JavaScript, modelos 3D,
videos, audios y targets compilados. Si todo queda mezclado en una sola carpeta, al primer error de ruta
sera dificil saber que revisar.
LineaElementoExplicacion para el estudiante
2index.htmlEs la pagina principal. Ahi vive la escena A-Frame, los targets de MindAR y la conexion con CSS y JavaScript.
3-4css/styles.cssGuarda el diseno de la interfaz: paneles, botones, colores, tamanos y posicion sobre la camara.
5-6js/app.jsGuarda el comportamiento: detectar targets, reproducir video, cambiar textos, activar audio y responder al usuario.
7-8targets/galeria.mindEs el archivo generado por el compilador de MindAR. Sin este archivo, la escena no sabe que imagenes debe reconocer.
9-10models/robot.glbContiene el modelo 3D. El formato GLB es comodo porque empaqueta geometria, materiales y a veces animaciones.
11-12videos/intro.mp4Guarda el video que se va a mostrar sobre uno de los targets. Conviene que sea corto y comprimido.
13-14audio/ambiente.mp3Es opcional. Lo usamos para explicar permisos de audio en navegadores moviles.
Error comun: escribir model/robot.glb cuando la carpeta se llama models, o guardar
galeria.mind fuera de targets. En WebAR una sola letra distinta en una ruta hace
que el recurso no cargue.
Modulo 1
Proyecto modular: HTML, CSS y JavaScript
Ahora conectamos los tres archivos principales. HTML estructura, CSS disena y JavaScript controla eventos.
Este bloque crea la base de la pagina. Todavia no hay realidad aumentada visible, pero ya estamos preparando
el navegador para cargar A-Frame, MindAR, la interfaz y nuestro archivo JavaScript. Es importante entender
esta parte porque casi todos los errores iniciales vienen de scripts mal importados o archivos conectados en
el orden incorrecto.
LineaQue ocurreExplicacion amplia
1<!doctype html>Le dice al navegador que el documento usa HTML moderno. Sin esto, algunos navegadores pueden interpretar la pagina en modo antiguo.
2lang="es"Indica que el contenido esta en espanol. Ayuda a accesibilidad, lectores de pantalla y motores de busqueda.
4charset="utf-8"Permite usar caracteres como tildes, eñes y simbolos sin que se rompan visualmente.
5viewportHace que la pagina se adapte al ancho del celular. En WebAR esto es fundamental porque casi siempre se prueba en movil.
7link rel="stylesheet"Conecta el archivo CSS. Si esta ruta falla, la experiencia puede funcionar, pero se vera sin diseno.
8aframe.min.jsCarga A-Frame. A-Frame nos permite escribir una escena 3D usando etiquetas como a-scene, a-camera y a-gltf-model.
9mindar-image-aframeConecta MindAR con A-Frame. Esta libreria agrega los componentes mindar-image y mindar-image-target.
12-14main class="ar-ui"Es la interfaz HTML que va encima de la camara. No pertenece al mundo 3D: es UI normal de pagina web.
15deferEvita que el JavaScript busque elementos antes de que existan. Si quitas defer, querySelector podria devolver null.
En el archivo app.js, document.querySelector("#status") busca en el HTML un elemento
con el id status. Guardamos ese elemento en una constante llamada statusText para
cambiar su texto desde JavaScript. Despues usamos textContent, que reemplaza el texto visible del
elemento. Finalmente console.log no cambia la pagina: solo escribe un mensaje en la consola para
comprobar que el archivo JavaScript cargo correctamente.
Modulo 1
Configuracion del proyecto
Guardamos la informacion de cada target en un arreglo para que el proyecto sea escalable.
El arreglo targets funciona como una pequena base de datos dentro del proyecto. En vez de tener
informacion regada por todo el HTML, reunimos los datos de cada marcador en un solo lugar. Esto es una practica
muy usada en proyectos reales porque facilita agregar, quitar o cambiar contenidos sin reescribir toda la escena.
LineaConceptoExplicacion amplia
6const targets = [Crea un arreglo. Un arreglo es una lista ordenada. Aqui cada elemento representa un target del proyecto.
7-15Primer objetoLas llaves { } agrupan la informacion del target 0. Este target mostrara un modelo 3D.
8id: 0Este numero debe coincidir con targetIndex: 0 en la escena. Es la forma de relacionar datos con marcador.
11type: "model"Describe el tipo de contenido. No lo usa MindAR automaticamente; lo usamos nosotros para organizar la logica.
12srcEs la ruta del archivo. Si el modelo no carga, esta es una de las primeras lineas que debes revisar.
13scaleDefine el tamano inicial del modelo. En WebAR los modelos suelen venir demasiado grandes o pequenos.
16-24Segundo objetoRepresenta el target 1. En este caso el contenido es un video y por eso incluye width y height.
Aunque en esta clase todavia escribimos algunas cosas manualmente en HTML, esta configuracion prepara al
estudiante para proyectos mas avanzados donde el contenido se puede generar dinamicamente desde JavaScript,
desde un archivo JSON o incluso desde una API.
Modulo 2
Multiples targets y compilador .mind
MindAR puede reconocer varias imagenes desde un mismo archivo .mind. El orden de carga define los indices.
1. Compila tus imagenes dentro del curso
Carga primero la imagen del robot.
Carga despues la imagen del video.
Compila y descarga el archivo como galeria.mind.
Guardalo dentro de la carpeta targets.
Herramienta practica
Compilador de targets MindAR
Sube imagenes JPG, PNG, SVG o WebP. Para este curso usa entre 2 y 5 targets.
imageTargetSrcIndica donde esta el archivo .mind.Debe existir en targets.
maxTrack: 2Define cuantos targets se pueden rastrear de forma simultanea.Usa 2 porque el proyecto final muestra robot y video al mismo tiempo.
targetIndex: 0Primera imagen compilada.Robot.
targetIndex: 1Segunda imagen compilada.Video.
3. Lectura guiada de MindAR y los targets
Esta es una de las partes mas importantes del curso intermedio. El archivo .mind no es una imagen:
es una version procesada de una o varias imagenes objetivo. MindAR analiza puntos visuales, contrastes, formas y
patrones. Cuando la camara ve algo parecido, intenta calcular la posicion del target para colocar contenido encima.
LineaCodigoExplicacion amplia
18<a-scene>Es el contenedor principal de A-Frame. Todo lo que pertenece a la escena 3D o AR vive dentro de esta etiqueta.
19mindar-imageActiva el sistema de image tracking. El parametro imageTargetSrc apunta al archivo compilado.
19maxTrack: 2Permite que MindAR intente seguir dos imagenes al mismo tiempo. Sin este parametro, la experiencia puede comportarse como si solo aceptara un target visible a la vez.
19filterMinCFAyuda a filtrar detecciones debiles. Valores pequenos pueden hacer que el tracking responda mas rapido, pero tambien puede ser mas sensible al ruido.
19filterBetaSuaviza el movimiento del contenido AR. Si el objeto tiembla mucho, este tipo de parametros se revisa.
20color-space="sRGB"Ayuda a que colores y texturas se vean mas consistentes en modelos y materiales.
21rendererConfigura el render 3D. En modelos GLB con luces y materiales, esto puede mejorar la apariencia.
22-23UI de VR y permisosOcultamos controles que no necesitamos para que la experiencia se sienta como WebAR, no como una demo de VR.
27targetIndex: 0Esta entidad se activa cuando MindAR reconoce la primera imagen compilada.
28targetIndex: 1Esta entidad se activa cuando MindAR reconoce la segunda imagen compilada.
30a-cameraRepresenta la camara virtual de A-Frame. MindAR la sincroniza con la camara real del dispositivo.
maxTrack: 2 permite que, si muestras los dos marcadores al mismo tiempo frente a la camara,
ambos puedan mantenerse activos en pantalla. Si quisieras rastrear tres imagenes simultaneas, tendrias que usar
maxTrack: 3 y tener tres entidades con sus respectivos targetIndex.
Regla de oro: si el contenido aparece en el target equivocado, casi siempre el problema esta en el orden en que
cargaste las imagenes al compilar. Primera imagen = targetIndex: 0, segunda imagen = targetIndex: 1.
Modulo 2
Contenido diferente por target
Ahora cada marcador deja de estar vacio y recibe su propio contenido.
En A-Frame, a-assets es una zona de precarga. Esto significa que el navegador intenta preparar
modelos, videos o imagenes antes de usarlos en la escena. Es mejor que cargar un archivo justo en el momento
de detectar el target, porque podria producir pausas o parpadeos.
LineaCodigoExplicacion amplia
25<a-assets>Abre el bloque de recursos. Los elementos dentro de aqui no se ven directamente; se preparan para usarse despues.
26a-asset-itemSe usa para cargar archivos externos como GLB o GLTF. El id robotModel permite referenciarlo luego.
27videoCarga el video HTML normal. Luego A-Frame lo usa como textura dentro de a-video.
27preload="auto"Le pide al navegador que prepare el video. Algunos navegadores moviles pueden limitar esta carga para ahorrar datos.
27loopHace que el video vuelva a empezar cuando termina.
27playsinlineEvita que iPhone intente abrir el video en pantalla completa. En WebAR queremos que el video siga dentro de la escena.
31mindar-image-targetTodo lo que este dentro de esta entidad aparece pegado al target correspondiente.
32a-gltf-modelMuestra el modelo 3D. El atributo src="#robotModel" no apunta a una carpeta, sino al asset precargado.
39a-videoCrea un plano 3D que reproduce video. Sus medidas se controlan con width y height.
Si el modelo no aparece, revisa tres cosas: que el archivo exista en models, que el id del asset
coincida con el src, y que la escala no sea tan grande o tan pequena que parezca invisible.
Modulo 2
Eventos por target
Los eventos permiten que cada marcador dispare acciones diferentes.
4-5Selecciona los targets.Cada marcador tiene acciones propias.
7-13Controla el target robot.Cambia el estado de la UI.
15-24Controla el target video.Reproduce y reinicia video.
2. Lectura guiada de eventos targetFound y targetLost
Los eventos son la parte que hace que la experiencia se sienta viva. MindAR emite targetFound
cuando reconoce una imagen y targetLost cuando deja de verla. Con esos eventos podemos cambiar la
interfaz, reproducir audio, pausar video, iniciar animaciones o registrar interacciones.
LineaCodigoExplicacion amplia
1querySelector("#status")Busca el texto de estado. Lo usaremos para comunicar al usuario que esta pasando.
2querySelector("#introVideo")Busca el elemento de video que cargamos en a-assets. Asi podemos reproducirlo o pausarlo.
4-5TargetsGuardamos referencias a cada entidad de MindAR. Sin estas referencias no podriamos escuchar sus eventos.
7addEventListenerRegistra una funcion que se ejecuta cuando ocurre algo. En este caso, cuando MindAR encuentra el robot.
8textContentCambia el texto visible del panel de estado para dar retroalimentacion inmediata.
11-13targetLostCuando se pierde el target, cambiamos el mensaje para que el usuario sepa que debe apuntar de nuevo.
15-18introVideo.play()Reproduce el video solo cuando el target correcto esta visible. Esto ahorra recursos y mejora la experiencia.
20-23pause() y currentTimePausar detiene el video. Poner currentTime = 0 lo devuelve al inicio para la proxima deteccion.
Error comun: si introVideo aparece como null en consola, significa que JavaScript no
encontro el elemento. Revisa que el id en HTML sea exactamente introVideo y que el script tenga
defer.
Modulo 3
UI profesional sobre la camara
La interfaz debe guiar al usuario sin bloquear la escena AR.
1. Agrega panel de estado
<main class="ar-ui">
<section class="status-panel">
<p class="eyebrow">WebAR activo</p>
<h1 id="statusTitle">Escanea una imagen</h1>
<p id="status">Apunta la camara al target para iniciar.</p>
<button id="soundButton" type="button">Activar sonido</button>
</section>
</main>
pointer-events: none evita que la UI bloquee la escena. El panel usa pointer-events: auto para permitir clics.
3. Lectura guiada de la UI sobre camara
En una experiencia WebAR hay dos mundos conviviendo: la escena 3D de A-Frame y la interfaz HTML normal.
La interfaz no debe bloquear la camara ni robar todos los toques de pantalla. Por eso usamos una capa fija
encima de todo, pero controlamos cuidadosamente los clics con pointer-events.
PropiedadExplicacion ampliaPor que se usa
position: fixedFija la UI a la ventana del navegador, no al flujo normal del documento.La camara ocupa toda la pantalla y la UI debe mantenerse encima.
inset: 0Equivale a top, right, bottom y left en cero.Hace que la capa cubra toda la pantalla.
z-index: 10Controla profundidad visual en HTML.La UI debe quedar por encima del canvas de A-Frame.
pointer-events: noneLa capa general no recibe clics.Evita que una capa invisible bloquee la interaccion con la escena.
pointer-events: autoReactiva clics dentro del panel.El boton de sonido debe seguir funcionando.
width: min(520px, 100%)Usa 520px como maximo, pero nunca se sale del ancho de pantalla.Hace que el panel funcione en celular y escritorio.
Consejo de diseno: no llenes la pantalla con instrucciones largas mientras la camara esta activa. La UI debe
orientar, no tapar el target. Para explicaciones largas usa secciones del curso; para la experiencia final usa
mensajes cortos y accionables.
Modulo 3
Animaciones GLB
Si el modelo GLB trae animaciones, A-Frame puede reproducirlas con animation-mixer.
A-Frame por si solo puede mostrar modelos GLB, pero para reproducir animaciones normalmente usamos
aframe-extras. Ese paquete agrega el componente animation-mixer, que lee las
animaciones internas del GLB. Si el modelo no trae animaciones exportadas, el componente no tendra nada que reproducir.
ParteExplicacion ampliaQue revisar si falla
aframe-extrasLibreria adicional que extiende A-Frame con componentes utiles.Debe cargarse despues de A-Frame.
animation-mixerComponente que controla clips de animacion dentro del GLB.El modelo debe tener animaciones reales.
clip: *Intenta reproducir todos los clips disponibles.Si conoces el nombre exacto, usa ese nombre.
loop: repeatHace que la animacion se repita continuamente.Util para personajes en estado idle.
timeScaleMultiplica la velocidad de reproduccion.0.5 es mas lento, 2 es mas rapido.
Si la animacion solo avanza unos frames, puede deberse al archivo GLB, al nombre del clip o al exportador usado
desde Blender/Mixamo. En ese caso prueba el modelo en un visor GLB antes de culpar a MindAR.
Modulo 3
Controles 3D: escala, posicion y rotacion
Un modelo necesita ajustes para quedar bien alineado con el target.
Las transformaciones son la forma en que le dices al navegador donde colocar el contenido AR. En image tracking,
el origen del objeto esta relacionado con el centro del target. Por eso un modelo puede aparecer centrado, pero
aun asi verse enterrado, muy grande o mirando en la direccion equivocada.
PropiedadLectura de valoresEjemplo practico
position="0 0 0"Los tres valores son X, Y y Z. X mueve horizontal, Y mueve vertical, Z mueve profundidad.0 0.1 0 sube un poco el modelo.
rotation="0 180 0"Los valores son grados de rotacion en X, Y y Z.Usa Y para girar el modelo hacia el usuario.
scale="0.35 0.35 0.35"Escala en X, Y y Z. Normalmente usamos el mismo numero en los tres ejes para no deformar.Si el modelo es enorme, prueba 0.05.
setAttributePermite cambiar atributos de A-Frame desde JavaScript.Sirve para hacer botones de prueba o controles en vivo.
Math.maxEvita que la escala baje de un minimo.Sin esto podrias llegar a escala cero y hacer invisible el modelo.
La forma profesional de ajustar es: primero corrige escala, despues posicion y al final rotacion. Si intentas
arreglar todo al tiempo, es dificil saber que cambio resolvio el problema.
Modulo 4
Audio y video
En moviles, el audio necesita una interaccion del usuario. Por eso usamos un boton para activarlo.
new AudioCrea un audio desde archivo.Debe existir la ruta.
soundEnabledGuarda si el usuario ya hizo clic.Evita bloqueos moviles.
play()Reproduce audio o video.Puede requerir permiso.
2. Lectura guiada de permisos de audio y video
Los navegadores moviles bloquean audio automatico para evitar paginas molestas. Por eso un play()
ejecutado sin interaccion del usuario puede fallar. La solucion es pedir un toque inicial con un boton. Ese toque
crea el permiso necesario para que luego la experiencia pueda reproducir sonido cuando MindAR detecta el target.
LineaCodigoExplicacion amplia
1soundButtonGuarda el boton que el usuario toca para activar sonido.
2new Audio(...)Crea un objeto de audio desde un archivo. La ruta debe existir o el navegador no podra reproducirlo.
3loop = trueHace que el audio se repita. Puedes quitarlo si solo quieres un sonido corto.
4soundEnabledEs una bandera booleana. Empieza en falso y cambia a verdadero cuando el usuario toca el boton.
6asyncIndica que dentro de la funcion podemos esperar una operacion, como reproducir audio.
8await ambience.play()Intenta reproducir y espera el resultado. Si el navegador lo permite, el audio queda desbloqueado.
9pause()Pausamos inmediatamente porque solo queriamos desbloquear el audio, no dejarlo sonando todavia.
13-20targetFoundCuando aparece el robot, verificamos si el sonido ya fue activado y entonces reproducimos.
Para video usamos la misma idea: si el video tiene sonido, probablemente requiera interaccion. Si esta silenciado
con muted, algunos navegadores permiten autoplay, pero en WebAR es mejor controlar la reproduccion con eventos.
Modulo 4
Optimizacion movil
WebAR debe ser liviano. Si pesa demasiado, el celular pierde rendimiento o cierra la pagina.
Optimizar no significa bajar calidad sin criterio. Significa preparar los recursos para que funcionen en celulares
reales. Una computadora puede mover modelos pesados, pero WebAR depende de camara, tracking, render 3D y navegador
al mismo tiempo. Todo eso compite por memoria, bateria y procesador.
RecursoQue revisarPor que afecta WebAR
GLBPeso, cantidad de poligonos, animaciones y materiales.Modelos pesados tardan en cargar y pueden bajar los FPS.
TexturasTamano en pixeles y compresion.Texturas enormes consumen memoria aunque el modelo parezca simple.
VideoResolucion, duracion y bitrate.Un video 4K puede bloquear la experiencia en moviles de gama media.
TargetsContraste, detalles y repeticion de patrones.Targets pobres hacen que el contenido tiemble o se pierda.
ConsolaErrores rojos y recursos 404.Un archivo que no carga puede romper toda la experiencia.
Una prueba seria no es solo abrir la pagina en tu computador. Debes probar en al menos un celular, con datos o Wi-Fi
normal, y observar tiempo de carga, calentamiento, estabilidad del tracking y respuesta de la interfaz.
Herramienta recomendada
Al trabajar con varios targets, modelos, videos y eventos, es normal que aparezcan errores de rutas,
permisos o rendimiento. Esta herramienta te ayuda a diagnosticar la experiencia antes de entregarla.
Para probar camara en celular necesitas HTTPS. El QR debe apuntar a la URL publicada.
1. Checklist de publicacion
Evita espacios y tildes en nombres de archivos.
Confirma que targets/galeria.mind exista.
Publica con HTTPS.
Genera un QR hacia la URL final.
URL del proyecto:
https://tudominio.com/webar-intermedio/
URL recomendada para QR:
https://tudominio.com/webar-intermedio/?v=1
2. Explicacion de HTTPS, QR y cache
La camara es un permiso sensible. Por seguridad, los navegadores solo permiten usarla en contextos seguros:
https://, localhost o algunos entornos especiales de desarrollo. Por eso un proyecto
que funciona en tu computador puede fallar cuando lo subes mal a internet.
ConceptoExplicacion ampliaEjemplo
HTTPSProtocolo seguro. Es obligatorio para camara en moviles cuando no estas en localhost.https://tudominio.com
QREs una forma rapida de abrir la URL en celular sin escribirla manualmente.Debe apuntar a la pagina publicada, no a tu archivo local.
?v=1Parametro de version. Ayuda a evitar que el navegador muestre una version vieja guardada en cache.Cambia a ?v=2 despues de actualizar.
Rutas relativasRutas como models/robot.glb dependen de la ubicacion de index.html.Si mueves el HTML, debes revisar rutas.
Cuando compartas el QR, prueba escanearlo como lo haria un estudiante o cliente. Si solo funciona en tu red local
o en tu computador, todavia no esta publicado correctamente.
Lectura recomendada
Despues de crear el proyecto intermedio, el siguiente paso es publicarlo para que otra persona pueda
abrirlo desde un celular con HTTPS. Esta guia te muestra una ruta gratuita para hacerlo.
La entrega final demuestra que puedes construir una experiencia intermedia completa.
1. Requisitos obligatorios
2. Template completo descargable
Descarga esta plantilla si quieres partir desde el proyecto intermedio ya armado. Incluye codigo final,
modelo, video, targets SVG de practica y estructura completa de carpetas.