Este curso es para estudiantes que ya construyeron experiencias WebAR basicas e intermedias.
Aqui convertimos MindAR en una experiencia comercial: datos, UI de producto, analitica, leads,
rendimiento y publicacion profesional.
Modulo 0
Bienvenida al curso avanzado
En este curso vas a crear un catalogo WebAR comercial. La experiencia reconoce tres marcadores,
muestra contenido diferente por producto, actualiza una interfaz de compra, registra eventos de
analitica y captura leads de clientes interesados.
Que vas a construir
Catalogo WebAR
Tres productos con targets simultaneos y modelos 3D.
Datos dinamicos
La informacion no queda quemada en el HTML: vive en data/products.js.
Flujo comercial
UI, CTA, analitica, formulario de lead y template descargable.
Requisitos
Entender mindar-image-target, targetFound y targetLost.
Haber usado maxTrack para varios targets.
Saber editar HTML, CSS y JavaScript en archivos separados.
Poder probar desde servidor local y publicar con HTTPS.
Modulo 1
Arquitectura comercial del proyecto
En nivel avanzado no queremos un demo aislado. Queremos una base que puedas adaptar a marcas,
catalogos, vitrinas, ferias, empaques, museos o activaciones comerciales.
Esta organizacion separa responsabilidades. El HTML define la escena, CSS define la interfaz,
JavaScript controla comportamiento, data/products.js guarda informacion editable,
y analytics.js centraliza los eventos de medicion.
ArchivoResponsabilidadPor que importa
index.htmlEscena AR y estructura de UI.Debe mantenerse claro para evitar errores de targets y assets.
products.jsDatos de producto.Permite cambiar textos, precios y modelos sin tocar toda la escena.
analytics.jsRegistro de eventos.Te ayuda a medir que targets se escanean y que botones se presionan.
Lectura guiada
La diferencia entre un proyecto intermedio y uno avanzado no es solo tener mas codigo. Es tener
separacion de responsabilidades. Si manana un cliente quiere cambiar el precio del producto, no
deberias buscar dentro de la escena 3D; deberias ir a un archivo de datos. Si quiere medir conversiones,
no deberias mezclar toda la logica con el tracking; deberias tener una capa de analitica.
Modulo 1
Datos de productos en JavaScript
En lugar de escribir textos de producto directamente dentro del HTML, vamos a crear una lista de objetos.
Esto hace que el proyecto sea mas facil de mantener y escalar.
1window.PRODUCTSDeja la lista disponible para otros archivos JavaScript sin usar imports avanzados.
4targetIndexRelaciona el producto con la imagen compilada en catalogo.mind.
8modelApunta al id del asset 3D en A-Frame, no a una ruta directa.
10ctaTexto del boton comercial que cambia segun el producto detectado.
Codigo acumulado hasta aqui
Ya tienes una fuente de datos. Mas adelante app.js leera esta lista para actualizar la UI
cuando MindAR encuentre un target.
2. Explicacion linea por linea avanzada: data/products.js
Este archivo es el centro de datos del catalogo. La idea es que el estudiante aprenda a separar
contenido de estructura: el HTML no deberia guardar todos los nombres, precios y descripciones.
Si una marca cambia un precio o un texto, lo ideal es editar un dato, no reescribir la escena.
LineaCodigoQue hace y por que importa
1window.PRODUCTS = [Crea una lista global de productos. Usamos window para que app.js pueda leerla despues sin configurar modulos.
2{Abre el primer objeto de producto. Un objeto agrupa datos relacionados: id, nombre, precio, modelo y texto comercial.
3id: "robot"Identificador interno del producto. No es el texto visible; es una clave corta que JavaScript usa para conectar target, datos y UI.
4targetIndex: 0Relaciona este producto con la primera imagen compilada en MindAR. Si el orden de compilacion cambia, este numero debe revisarse.
5nameNombre comercial que se mostrara en el panel cuando el target sea detectado.
6categoryCategoria o contexto del producto. Sirve para que el usuario entienda rapidamente que tipo de producto esta viendo.
7pricePrecio visible. En un proyecto real podria venir desde una API para mantenerlo actualizado.
8model: "#robotModel"Referencia al asset 3D cargado en A-Frame. El simbolo # indica que se busca un elemento por id dentro de a-assets.
9descriptionTexto descriptivo que alimenta la UI. Debe ser corto porque el usuario esta mirando la camara.
10ctaTexto del boton de accion. Cambia segun el producto para que la experiencia se sienta personalizada.
12-22Segundo productoRepite la misma estructura. Esta repeticion ordenada permite agregar mas productos copiando el patron.
23-33Tercer productoDemuestra que el catalogo puede crecer sin cambiar la logica principal de app.js.
35];Cierra la lista. Si falta este cierre, todo el archivo JavaScript fallara.
Error comun: cambiar el id del producto pero no cambiar el data-product-id del target.
En ese caso MindAR detecta el marcador, pero la UI no encuentra los datos correctos.
Modulo 2
Escena multi-target avanzada
En el curso intermedio usamos dos targets. Ahora vamos a preparar tres targets simultaneos para un catalogo.
1. Compila tres imagenes
Usa el compilador de MindAR para cargar tres imagenes objetivo. El orden debe coincidir con los productos:
robot primero, tech segundo y nature tercero.
Herramienta practica
Compilador de targets MindAR
Sube tres imagenes de producto y descarga el archivo como catalogo.mind.
maxTrack: 3Permite rastrear hasta tres targets al mismo tiempo.Ideal para comparar productos en pantalla.
data-product-idAtributo propio para conectar entidad AR con datos.Permite actualizar UI segun producto.
targetIndexDepende del orden de compilacion.Si el orden falla, el producto mostrado no coincide.
3. Explicacion linea por linea avanzada: escena multi-target
Esta seccion conecta MindAR, A-Frame y los modelos 3D. En el curso avanzado usamos tres targets
simultaneos para simular un catalogo comercial donde varios productos pueden estar sobre la mesa
al mismo tiempo.
LineaCodigoQue hace y por que importa
20<a-scene>Contenedor principal de A-Frame. Todo lo que sea escena 3D o AR debe vivir dentro.
21imageTargetSrcIndica donde esta el archivo catalogo.mind. Si la ruta esta mal, MindAR no sabra que imagenes reconocer.
21maxTrack: 3Permite rastrear hasta tres imagenes al mismo tiempo. Esto es clave para comparar productos simultaneamente.
21filterMinCFFiltra detecciones debiles. Ayuda a evitar falsos positivos cuando la imagen no esta clara.
21filterBetaSuaviza el movimiento del contenido AR para reducir temblores visuales.
22color-space="sRGB"Ayuda a que colores y texturas del modelo se vean mas consistentes.
23rendererConfigura el render WebGL. Es importante cuando trabajas con materiales y luces de modelos GLB.
24vr-mode-ui="enabled: false"Oculta el boton de modo VR porque esta experiencia es WebAR, no realidad virtual.
28-30a-asset-itemPrecarga modelos GLB. Cada modelo recibe un id para poder usarlo despues con src="#robotModel".
33targetIndex: 0Este bloque se activa con la primera imagen compilada en MindAR.
33data-product-id="robot"Atributo personalizado. JavaScript lo lee para saber que producto mostrar en la UI.
34a-gltf-modelMuestra el modelo 3D dentro del target. Si esta fuera del target, no seguira la imagen.
34scaleAjusta el tamano del modelo. En AR casi siempre necesitas probar varias escalas.
34animation-mixerReproduce animaciones internas del GLB si el modelo las tiene.
37-47Targets tech y natureRepiten el mismo patron para otros productos. Lo avanzado es que la logica puede leerlos de forma generica.
Regla profesional: el orden de compilacion, el targetIndex y el data-product-id
deben revisarse juntos. Si uno no coincide, la experiencia puede mostrar contenido correcto sobre el
marcador equivocado.
Modulo 2
UI dinamica de producto
La UI avanzada no solo dice "target detectado". Debe mostrar informacion util para vender o explicar.
1. Agrega panel comercial en HTML
<main class="ar-ui">
<section class="product-panel">
<p class="eyebrow">Catalogo WebAR</p>
<h1 id="productName">Escanea un producto</h1>
<p id="productCategory">Apunta la camara a un marcador del catalogo.</p>
<p id="productDescription">La informacion del producto aparecera aqui.</p>
<strong id="productPrice">-</strong>
<div class="panel-actions">
<button id="leadButton" type="button">Me interesa</button>
<button id="resetButton" type="button">Limpiar</button>
</div>
</section>
</main>
Cada id de este panel sera usado por JavaScript. Si cambias un id en HTML, debes cambiarlo tambien
en app.js. Esa relacion es directa.
3. Explicacion linea por linea avanzada: UI comercial
Esta interfaz no es decorativa. Es la capa comercial del proyecto. Mientras la escena AR muestra modelos,
la UI debe explicar que producto se detecto, que valor tiene y que accion puede tomar el usuario.
LineaCodigoQue hace y por que importa
12<main class="ar-ui">Crea la capa HTML que se ve encima de la camara. No forma parte de la escena 3D.
13product-panelPanel visual que contiene la informacion comercial. Lo controlamos con CSS.
15id="productName"JavaScript escribira aqui el nombre del producto detectado.
16id="productCategory"Sirve para mostrar categoria, linea de negocio o contexto del producto.
17id="productDescription"Muestra la descripcion tomada desde data/products.js.
18id="productPrice"Muestra precio o llamada comercial. Tambien podria mostrar "Desde..." o "Cotizar".
20leadButtonBoton principal de conversion. JavaScript cambia su texto segun el producto activo.
21resetButtonPermite limpiar la seleccion. Es util cuando varios targets estuvieron activos.
Cada id es un contrato entre HTML y JavaScript. Si el HTML dice productName
pero JavaScript busca productTitle, no habra error visual claro: simplemente no se actualizara el texto.
Modulo 3
Logica central del catalogo
Ahora conectamos targets, datos y panel. Esta es la pieza que convierte una escena AR en una experiencia interactiva.
Esta estructura es avanzada porque no escribimos un evento manual para cada target. Recorremos todos los targets
con forEach y usamos data-product-id para saber que producto representa cada uno.
4. Explicacion linea por linea avanzada: logica central
Esta es la parte mas importante del curso avanzado. Aqui el proyecto deja de ser una escena estatica
y se convierte en una aplicacion WebAR: lee datos, detecta targets, actualiza UI y registra eventos.
LineaCodigoQue hace y por que importa
1const products = window.PRODUCTSToma la lista creada en data/products.js. Si ese archivo no carga antes, products quedara indefinido.
2new Set()Un Set guarda valores unicos. Sirve para saber que productos estan activos sin duplicarlos.
4-9querySelectorBusca elementos de la UI para poder escribir textos y cambiar botones desde JavaScript.
10querySelectorAll("[data-product-id]")Busca todos los targets que tienen un producto asociado. Esto evita escribir codigo repetido para cada target.
12-14findProductBusca en el arreglo el producto que coincide con el id detectado.
16-23renderProductActualiza todos los textos visibles del panel con datos del producto seleccionado.
24leadButton.dataset.productIdGuarda el producto activo dentro del boton. Luego el formulario sabra sobre que producto pregunta el cliente.
27Array.from(activeProducts)Convierte el Set en lista para saber cuantos productos estan activos y cual fue el ultimo detectado.
29-36Estado vacioSi no hay targets visibles, la UI vuelve al mensaje inicial.
39-40Ultimo productoSi hay varios targets activos, mostramos en el panel el ultimo detectado. Los modelos pueden seguir visibles al mismo tiempo.
43targets.forEachRecorre todos los targets encontrados en el HTML. Esta tecnica hace el codigo escalable.
44target.dataset.productIdLee el valor de data-product-id del HTML. Asi sabe si el target es robot, tech o nature.
46-50targetFoundCuando MindAR encuentra un target, lo agregamos al Set, actualizamos UI y registramos analitica.
52-56targetLostCuando MindAR pierde el target, lo quitamos del Set, actualizamos UI y registramos el evento.
La clave pedagogica aqui es entender que no estamos programando "el robot", "tech" y "nature" uno por uno.
Estamos programando un sistema que puede funcionar con cualquier target que tenga data-product-id.
Modulo 3
Analitica de eventos
Un proyecto comercial debe medir. No basta con que se vea bonito: necesitas saber que escanean los usuarios.
1. Crea js/analytics.js
const ANALYTICS_KEY = "webarAdvancedEvents";
function getStoredEvents() {
return JSON.parse(localStorage.getItem(ANALYTICS_KEY) || "[]");
}
function saveEvent(event) {
const events = getStoredEvents();
events.push(event);
localStorage.setItem(ANALYTICS_KEY, JSON.stringify(events.slice(-100)));
}
function trackEvent(name, data = {}) {
const event = {
name,
data,
createdAt: new Date().toISOString()
};
saveEvent(event);
console.log("[analytics]", event);
}
Esta analitica es local para el curso. En produccion, trackEvent puede enviar datos a un backend,
Google Analytics, Meta Pixel, una hoja de calculo o un CRM, siempre respetando privacidad.
Lectura guiada
LineaCodigoExplicacion
1ANALYTICS_KEYNombre de la entrada en localStorage.
4JSON.parseConvierte texto guardado en una lista de eventos.
10slice(-100)Conserva solo los ultimos 100 eventos para no llenar el navegador.
14-18Objeto eventGuarda nombre, datos y fecha exacta del evento.
2. Explicacion linea por linea avanzada: analitica
La analitica del curso usa localStorage para practicar sin backend. No es una solucion final
para produccion, pero enseña el flujo real: crear evento, guardar datos, registrar fecha y consultar comportamiento.
LineaCodigoQue hace y por que importa
1ANALYTICS_KEYNombre de la llave donde se guardan eventos. Usar una constante evita errores de escritura.
3-5getStoredEventsLee eventos guardados. Si no hay nada, devuelve una lista vacia para evitar errores.
4JSON.parseConvierte texto JSON en datos JavaScript. localStorage solo guarda texto.
7-11saveEventAgrega el nuevo evento a la lista y vuelve a guardarla.
10slice(-100)Limita la memoria guardando solo los ultimos 100 eventos.
13trackEventFuncion publica que llama el resto del proyecto cuando ocurre algo medible.
14-18Objeto eventGuarda nombre, datos extra y fecha exacta. Esta estructura se parece a lo que enviarias a un servidor.
21console.logPermite ver el evento en consola mientras pruebas. En produccion podrias quitarlo o enviarlo a un backend.
Ejemplos de eventos utiles: target_found, target_lost, cta_click,
lead_submit, model_loaded y error_camera.
Lectura recomendada
En el curso usamos analitica local para aprender el flujo. Para produccion, puedes conectar eventos
como target_found, cta_click o lead_submit con Google Analytics 4.
En produccion no debes dejar el lead solo en el navegador. Este ejemplo enseña el flujo; luego puedes enviarlo
a un backend, CRM o pasarela de marketing.
3. Explicacion linea por linea avanzada: leads y CTA
Un lead es una persona interesada. En una experiencia comercial, el objetivo no siempre es solo mostrar
un modelo 3D; muchas veces queremos que el usuario deje un dato, pida una cotizacion o vaya a una compra.
LineaCodigoQue hace y por que importa
26<form>Agrupa campos y boton de envio. El navegador entiende que esto es un formulario.
28type="email"Activa validacion basica de correo y teclado adecuado en celular.
28requiredImpide enviar el formulario si el campo esta vacio.
31role="status"Ayuda a accesibilidad para mensajes de resultado.
59-61querySelectorBusca formulario, email y mensaje para controlarlos desde JavaScript.
63submitEvento que ocurre cuando el usuario envia el formulario.
64preventDefaultEvita que el navegador recargue la pagina. En apps web controlamos el envio con JavaScript.
66leadButton.dataset.productIdRecupera que producto estaba activo cuando el usuario mostro interes.
67trim()Quita espacios al inicio y final del email para guardar un dato mas limpio.
69-72Validacion de productoEvita registrar un lead sin saber que producto le intereso al usuario.
74trackEvent("lead_submit")Registra la conversion. En produccion aqui tambien enviarias el lead a un servidor.
76leadForm.reset()Limpia el formulario despues de enviar.
Importante: este formulario es educativo. Para produccion necesitas backend, proteccion antispam,
consentimiento de datos y una politica de privacidad clara.
Modulo 4
Contenido remoto y APIs
El siguiente salto avanzado es cargar datos desde un servidor. En este curso dejamos la version local,
pero aprenderas como se veria una version con API.
1. Ejemplo de carga remota
async function loadProductsFromApi() {
const response = await fetch("https://tudominio.com/api/products");
if (!response.ok) {
throw new Error("No se pudieron cargar los productos");
}
const products = await response.json();
return products;
}
fetch hace una peticion HTTP. await espera la respuesta. response.json()
convierte la respuesta en datos JavaScript. Si la API falla, debes mostrar un mensaje claro al usuario.
2. Cuando usar API y cuando no
OpcionVentajaRiesgo
Archivo localMas simple, rapido y estable.Actualizar productos requiere subir archivos.
APIPermite contenido dinamico y panel admin.Depende de internet, backend, seguridad y CORS.
CMSUn equipo no tecnico puede editar contenido.Necesita integracion y control de permisos.
Lectura recomendada
Si quieres llevar el catalogo avanzado a una base de datos real, este articulo explica como usar
Firebase con WebAR, A-Frame y MindAR para manejar informacion dinamica.
Una experiencia comercial debe cargar rapido y mantenerse estable en celulares reales.
Checklist profesional
Explicacion
WebAR combina camara, tracking, WebGL, decodificacion de modelos, texturas y UI. Si un recurso pesa demasiado,
no solo tarda en cargar: tambien puede hacer que el tracking pierda estabilidad. Optimizar es parte del diseno,
no un paso opcional al final.
Herramienta recomendada
Antes de presentar un proyecto avanzado a un cliente, revisa camara, HTTPS, librerias, assets,
rutas y rendimiento con una herramienta de diagnostico pensada para WebAR.
Cuando capturas leads o analitica, ya no solo construyes AR: tambien manejas datos de personas.
Buenas practicas
TemaPracticaMotivo
CamaraExplica por que se solicita permiso.Da confianza al usuario.
LeadsPide solo datos necesarios.Reduce friccion y riesgo.
AnaliticaNo guardes datos sensibles sin consentimiento.Protege privacidad.
HTTPSObligatorio en produccion.Camara y formularios necesitan contexto seguro.
BackupsVersiona archivos antes de publicar.Permite recuperar si algo falla.
Texto recomendado
Esta experiencia usa la camara solo para reconocer imagenes objetivo.
No grabamos video ni tomamos fotos desde el navegador.
Si envias tu email, lo usaremos solo para responder tu solicitud.
Puedes cerrar la experiencia en cualquier momento.
Modulo 5
Publicacion comercial
Publicar comercialmente significa preparar dominio, HTTPS, QR, versionado y pruebas de dispositivos.
Cambiar el parametro de version ayuda a que el navegador no use archivos viejos guardados en cache.
Lectura recomendada
Esta guia complementa la publicacion comercial. Te ayuda a subir el proyecto a internet,
probar HTTPS y compartir una URL funcional con clientes o estudiantes.
Tu entrega final es un catalogo WebAR comercial multi-target con datos, UI, analitica, leads y publicacion.
1. Requisitos de entrega
2. Template completo descargable
Descarga esta plantilla para practicar con el proyecto avanzado ya armado. Incluye estructura,
datos, analitica, UI, modelos de prueba, targets SVG y README.