Aprende a crear una primera experiencia WebAR que captura datos y conecta WhatsApp.
Nivel básico
Mapa del proyecto WebAR comercial
En este nivel construiremos una experiencia comercial sencilla, pensada para una campaña real: una persona entra desde un QR, toca un botón para abrir la cámara, escanea un marcador y ve un modelo 3D de helado como oferta aumentada. Después puede dejar sus datos o escribir por WhatsApp.
El objetivo no es solo “hacer aparecer algo en realidad aumentada”. El objetivo comercial es crear una experiencia que pueda generar un lead, iniciar una conversación y medir una intención de compra.
Primero instalamos y usamos las herramientas básicas para que una persona desde cero sepa dónde escribir el código.
Después creamos el HTML mínimo y lo vamos reemplazando por versiones acumuladas.
Luego compilamos el marcador .mind y conectamos MindAR.
Finalmente agregamos JavaScript para iniciar cámara, cargar el GLB, detectar el target, mostrar el panel y capturar el lead.
Herramientas
Instalar Visual Studio Code
Visual Studio Code será el editor donde crearemos los archivos del proyecto. Si una persona nunca ha programado, puede pensar en VS Code como el lugar donde se escribe y organiza la página web: ahí crearemos index.html, styles.css y app.js.
Entra al sitio oficial: https://code.visualstudio.com/.
Descarga la versión para tu sistema operativo.
Instala usando las opciones por defecto.
Abre VS Code y confirma que puedes crear una ventana nueva.
En Windows, si el instalador lo permite, activa la opción para abrir carpetas con clic derecho.
Video: instalación de Visual Studio CodeEste video guía el proceso de instalación antes de escribir el primer archivo.
Servidor local
Instalar Live Server y probar el proyecto
No abras el HTML con doble clic para trabajar WebAR. La cámara, los modelos 3D, los archivos .mind y los scripts externos funcionan mejor desde una URL local. Live Server crea esa URL automáticamente.
Abre la barra lateral de extensiones en VS Code.
Busca Live Server.
Instala la extensión de Ritwick Dey.
Cuando tengas index.html, haz clic derecho y selecciona Open with Live Server.
El navegador abrirá una ruta parecida a http://127.0.0.1:5500.
Video: instalación de Live ServerInstala la extensión que usaremos durante el curso.
Video: probar con Live ServerAprende a abrir el proyecto como servidor local.
Carpetas
Crear el proyecto desde cero
Crea una carpeta llamada landing-webar-comercial. Esa carpeta será tu proyecto. Dentro de ella estarán todos los archivos que el navegador necesita para mostrar la página, abrir la cámara, cargar el modelo 3D y reconocer el marcador.
Pasos dentro de VS Code
Abre VS Code.
Ve a File > Open Folder.
Crea o selecciona la carpeta landing-webar-comercial.
Desde el explorador lateral crea index.html, styles.css y app.js.
Crea las carpetas targets, assets y vendor.
Por qué separamos archivos:index.html tendrá la estructura, styles.css tendrá el diseño y app.js tendrá la lógica. Separarlos desde el principio ayuda a que el proyecto sea más fácil de leer, corregir y publicar.
Inicio
Qué vamos a crear en el nivel básico
Este nivel crea una landing WebAR comercial simple, pero con lógica de negocio real. El usuario abre una página desde un QR, presiona un botón, escanea un marcador y ve una oferta aumentada con un modelo 3D. Cuando el marcador aparece, mostramos un panel con formulario y WhatsApp.
La idea es que el estudiante entienda que WebAR puede ser una herramienta de ventas: no solo muestra contenido visual, también puede capturar datos, llevar tráfico a WhatsApp y preparar una futura integración con pagos o CRM.
La lógica comercial
Una experiencia comercial no termina cuando aparece un objeto 3D. Debe llevar al usuario a una acción medible: dejar datos, escribir por WhatsApp, comprar, agendar o solicitar una cotización.
Primero creamos la página base.
Luego conectamos A-Frame y MindAR.
Después agregamos un formulario de lead.
Finalmente conectamos eventos targetFound, targetLost y WhatsApp.
Preparación
Crear carpeta y archivos desde cero
Crea una carpeta llamada landing-webar-comercial. Dentro de ella crea estos archivos: index.html, styles.css, app.js y dos carpetas: targets y assets. El archivo campana.mind irá dentro de targets y el modelo Modelo3D-Helado.glb irá dentro de assets.
Dónde se crea: abre Visual Studio Code, selecciona File > Open Folder, abre la carpeta y crea los archivos desde el explorador lateral.
HTML inicial completoindex.html
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Landing WebAR Comercial</title>
<link rel="stylesheet" href="styles.css" />
<script src="app.js" defer></script>
</head>
<body>
<main class="landing">
<h1>Campaña WebAR Comercial</h1>
<p>Escanea el marcador para ver la oferta en realidad aumentada.</p>
</main>
</body>
</html>
Explicación del HTML inicial
Línea 1 - <!doctype html>: le dice al navegador que este archivo usa HTML moderno. Sin esta línea, algunos navegadores pueden interpretar la página en un modo antiguo.
Línea 2 - <html lang="es">: abre el documento HTML y declara que el idioma principal será español. Esto ayuda a accesibilidad, traducción automática y motores de búsqueda.
Línea 4 - charset="utf-8": permite usar tildes, eñes y caracteres especiales sin problemas.
Línea 5 - viewport: prepara la página para móviles. En WebAR esto es indispensable porque casi todos los usuarios escanean desde celular.
Línea 7 - styles.css: conecta el archivo donde escribiremos el diseño visual.
Línea 8 - app.js defer: conecta JavaScript. La palabra defer hace que el script espere a que el HTML esté construido antes de buscar botones, formularios o la escena AR.
Líneas 10 a 14 - body: contienen lo que el usuario verá en pantalla. Por ahora solo hay un título y un texto; después agregaremos cámara, target, modelo 3D y formulario.
Escena AR
Agregar A-Frame, MindAR y la primera escena
Ahora reemplaza tu index.html por esta versión. Es el código completo acumulado: conserva lo anterior y suma las librerías, el botón para abrir cámara y la escena AR.
Qué se agrega: en el head agregamos A-Frame y MindAR. En el body agregamos a-scene, a-camera, el target y un contenedor para cargar por JavaScript el modelo 3D GLB del helado.
A-Frame crea la escena 3D, MindAR reconoce la imagen objetivo y JavaScript carga el modelo comprimido. En este paso dejamos preparado el lugar donde aparecerá el helado, pero el GLB se carga más adelante desde app.js.
a-scene: es el contenedor principal de A-Frame. Todo lo que sea cámara, luces, modelo 3D o target vive dentro de esta escena.
mindar-image: activa MindAR para reconocimiento de imágenes. El parámetro imageTargetSrc apunta al archivo targets/campana.mind.
autoStart: false: evita que la cámara se abra sola. En móviles es mejor iniciar la cámara después de un clic del usuario.
maxTrack: 1: le dice a MindAR que en este nivel solo rastrearemos un marcador al tiempo.
a-camera: representa la cámara virtual de A-Frame. Usamos look-controls="enabled: false" porque el movimiento real viene de MindAR y la cámara del dispositivo.
a-entity id="target": es el grupo que se activa cuando MindAR reconoce el marcador con índice 0.
a-entity id="offer-model": es un contenedor vacío. JavaScript insertará aquí el modelo Modelo3D-Helado.glb después de preparar el decoder Meshopt.
position="0 -0.2 0": baja un poco el modelo para centrarlo mejor sobre el target.
rotation="0 0 0": mantiene el modelo sin giro inicial. Si el modelo aparece de lado, aquí se corrige.
scale="1 1 1": muestra el modelo a su tamaño base. Usamos esta escala porque el GLB ya viene con proporciones adecuadas.
a-text: agrega un texto flotante sobre el target. Es útil para indicar una oferta, una promoción o un llamado a la acción.
Marcador
Elegir imagen, compilar target y generar .mind
El archivo .mind es el marcador compilado. MindAR no rastrea la imagen JPG directamente dentro de la experiencia final; primero debe convertirla en datos de seguimiento.
Usa una imagen con contraste, texto, bordes y detalles.
Evita fondos planos o imágenes borrosas.
Compila la imagen.
Descarga el archivo y renómbralo como campana.mind.
Guárdalo dentro de targets/campana.mind.
Compilador .mind integrado
Sube una imagen de producto, flyer, tarjeta comercial o pieza de campaña. El compilador genera el archivo .mind que MindAR necesita para reconocer el marcador.
No hay imágenes seleccionadas.
Selecciona una imagen para comenzar.
Formulario
Agregar formulario, panel comercial y WhatsApp
Ahora el proyecto deja de ser solamente visual. Agregamos un panel que aparece cuando el marcador se detecta. Ese panel contiene el título de la oferta, un formulario y un enlace de WhatsApp.
Dónde va: reemplaza nuevamente el archivo index.html completo con esta versión. Observa especialmente las líneas resaltadas donde aparece commercial-panel y lead-form.
section id="commercial-panel": crea el panel flotante que aparecerá sobre la cámara cuando se detecte el marcador.
hidden: deja el panel oculto al cargar la página. JavaScript lo mostrará cuando ocurra targetFound.
offer-title y offer-copy: son textos que explican la oferta. En niveles posteriores JavaScript podrá cambiarlos según el producto.
form id="lead-form": agrupa los campos que el usuario llenará. Esto nos permite escuchar el evento submit desde JavaScript.
input type="text": recibe el nombre del usuario.
input type="email": recibe el correo y permite que el navegador valide que tenga formato de email.
input type="tel": recibe el WhatsApp o teléfono de contacto.
required: evita enviar el formulario vacío. Es una validación básica del navegador.
whatsapp-link: será actualizado por JavaScript para abrir una conversación con un mensaje comercial ya preparado.
form-status: mostrará mensajes como “datos guardados” o “gracias por registrarte”.
Lógica
Controlar cámara, targetFound, targetLost y lead_submit
Ahora crea o reemplaza app.js. Este JavaScript busca elementos del HTML, arranca la cámara cuando el usuario presiona el botón, muestra el panel al detectar el marcador y guarda el lead temporalmente.
app.js conecta la interfaz HTML con la experiencia AR. Aquí iniciamos la cámara, cargamos el modelo GLB, mostramos el panel comercial y guardamos temporalmente los datos del lead.
Líneas 1 a 8: guardan elementos del HTML en constantes. Así no tenemos que escribir document.querySelector una y otra vez.
offerModel: apunta al contenedor vacío donde insertaremos el modelo del helado.
offer: guarda datos comerciales reutilizables: título, mensaje de WhatsApp y número de destino.
modelLoaderPromise: evita cargar el modelo más de una vez. Si el usuario toca el botón varias veces, reutilizamos la misma promesa.
prepareCompressedModel(): prepara la carga del GLB. Esta función existe porque el modelo usa compresión Meshopt.
Promise.all(): importa al mismo tiempo GLTFLoader.js y meshopt_decoder.module.js.
MeshoptDecoder.ready: espera a que el decoder esté listo antes de leer el archivo comprimido.
new GLTFLoader(): crea el cargador que entiende archivos .glb y .gltf.
loader.setMeshoptDecoder(MeshoptDecoder): conecta el decoder con el loader. Sin esta línea, el navegador puede mostrar el error de Meshopt.
loader.load(): carga assets/Modelo3D-Helado.glb. Cuando termina, entrega el resultado en la variable gltf.
offerModel.object3D.add(gltf.scene): inserta el modelo real dentro de la entidad de A-Frame.
startButton.addEventListener("click"): espera el clic del usuario para preparar el modelo e iniciar MindAR.
targetFound: se ejecuta cuando el marcador aparece en cámara. Aquí mostramos el panel y preparamos el enlace de WhatsApp.
targetLost: se ejecuta cuando MindAR pierde el marcador. Aquí ocultamos el panel.
leadForm.addEventListener("submit"): captura el envío del formulario, evita que la página se recargue y guarda el lead en localStorage.
Diseño
Diseñar la landing y el panel flotante
El CSS le da forma comercial al proyecto. En una experiencia WebAR real no basta con que la cámara funcione: los botones deben poder tocarse, el formulario no debe tapar toda la pantalla y el panel debe adaptarse al móvil. En esta versión corregimos tres problemas típicos: el canvas de A-Frame puede bloquear clics, el panel puede quedar demasiado grande y los botones pueden verse montados si no tienen una estructura clara.
Dónde va: abre styles.css y reemplaza todo el contenido por esta versión. Si ya escribiste la versión anterior, bórrala completa y pega este CSS corregido. No va dentro de index.html ni dentro de app.js.