Skip to content

Experiencia completa: Vue + Three.js + Monolook

Guía paso a paso para crear una experiencia AR completa, basada en el proyecto Springs of Love (Brussels).

Stack

PaqueteUso
Vue 3Framework UI (Composition API)
Vue RouterNavegación entre pantallas
PiniaEstado global
Three.jsMotor 3D WebGL
Anime.jsAnimaciones de UI
Vue3-LottieAnimaciones Lottie (loading, onboarding)
BowserDetección de plataforma
ViteBuild tool

Scaffolding

bash
npm create vite@latest mi-experiencia -- --template vue
cd mi-experiencia
npm install
npm install vue-router@4 pinia three animejs vue3-lottie bowser

Estructura del proyecto

src/
├── App.vue
├── main.js
├── router/
│   └── index.js
├── stores/
│   └── experience.js
├── views/
│   ├── StartView.vue          # Pantalla de inicio
│   └── ExperienceView.vue     # Vista AR
├── components/
│   ├── ThreeScene.vue         # Escena 3D
│   ├── Header.vue
│   ├── Sidebar.vue
│   └── HotspotCard.vue
├── composables/
│   └── useMonolook.js         # Lógica del SDK
└── assets/
    ├── models/                # GLB, GLTF
    ├── textures/
    └── audio/

Flujo de la experiencia

[StartView] → click → [ExperienceView]

                    [Detectar plataforma]
                      ↙           ↘
              [WebXR]           [AppClip]
              (Android/Quest)    (iOS)
                      ↘           ↙
                    [ThreeScene]

                  [Contenido 3D + UI]

Configuración de Vite

javascript
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  server: {
    https: true  // WebXR requiere HTTPS
  },
  build: {
    target: 'esnext'
  }
})

HTTPS obligatorio

WebXR requiere HTTPS. Configura siempre server.https: true en desarrollo.

Entry point

javascript
// main.js
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import router from './router'
import App from './App.vue'

createApp(App)
  .use(createPinia())
  .use(router)
  .mount('#app')

Sistema de rutas

javascript
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import StartView from '../views/StartView.vue'
import ExperienceView from '../views/ExperienceView.vue'

export default createRouter({
  history: createWebHistory(),
  routes: [
    { path: '/', component: StartView },
    { path: '/experience', component: ExperienceView }
  ]
})

Detección de plataforma

javascript
import Bowser from 'bowser'

const browser = Bowser.getParser(navigator.userAgent)
const os = browser.getOSName()
const isIOS = os === 'iOS'
const isAndroid = os === 'Android'
const isDesktop = !isIOS && !isAndroid

Siguiente paso

Esta guía cubre la estructura base. Para más detalle sobre cada componente: