Desarrollo web de realidad virtual con A-Frame

Guía: Cómo creamos nuestro espacio virtual con A-Frame

¿Quieres montar tu propio espacio virtual libre? En esta guía te contamos paso a paso cómo hicimos el entorno 3D de OfiLibre usando A-Frame, una librería web de realidad virtual basada en HTML.

1. Partimos de una plantilla existente

Para empezar, usamos una plantilla ya creada en A-Frame que nos daba la base: un entorno 3D con una sala principal y puertas a distintas habitaciones. Esto nos permitió centrarnos en personalizar los contenidos sin tener que montar la estructura desde cero.

Puedes ver el código que usamos en este repositorio: Repositorio en GitLab

2. Exploramos las posibilidades de A-Frame

A-Frame permite añadir:

  • Modelos 3D (.glb, .gltf)
  • Imágenes y textos
  • Eventos de interacción (como hacer clic en una puerta para teletransportarte)
  • Luces, animaciones y sonidos

Fuimos probando distintas entidades (<a-entity>, <a-image>, <a-text>, etc.) hasta que entendimos cómo montar escenas que fueran navegables y con contenido relevante.

3. Definimos las salas temáticas

Sala principal

Es el punto de entrada al mundo virtual. Aquí colocamos:

  • El búho de OfiLibre (nuestro símbolo)
  • El cartel de las jornadas más recientes
  • El sofá y la diana reales de la oficina
  • La pelota de Florencia, un clásico de nuestro espacio físico

Esta sala da acceso al resto mediante puertas clicables que te teletransportan, usando la propiedad door-link de A-Frame.

Sala de la izquierda: Cafés con la OfiLibre

Una recreación de nuestro set de grabación del pódcast, con micrófonos, sillas y decoración para explicar de forma visual cómo grabamos nuestras conversaciones sobre cultura libre.

Sala del software libre

Aquí mostramos ejemplos de programas libres que usamos durante el año, como:

  • OBS
  • LaTex
  • Hugo
  • A-Frame
    Con descripciones flotantes que se activan al acercarse.

Sala de la actividad de la OfiLibre

En esta sala contamos lo que hacemos:

  • TFGs y recursos educativos en abierto
  • Asignaturas con materiales libres
  • Monografías y revistas académicas

Todo distribuido visualmente con textos y símbolos para animar la exploración.

4. ¿Cómo hacerlo?

Esta guía te enseñará cómo construir una escena 3D interactiva como OfiLibre - Sala principal, usando HTML y el framework A-Frame.

1 Estructura básica del espacio

Crea un archivo HTML y define la estructura inicial con A-Frame:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Mi Sala A-Frame</title>
    <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>

    <!-- Motores de físicas (aunque en este ejemplo no se usan) -->
    <script src="https://cdn.jsdelivr.net/npm/aframe-physics-system@4.0.1/dist/aframe-physics-system.min.js"></script>

    <!-- Componentes personalizados -->
    <script src="components/door-link.js"></script>
    <script src="components/lounge.js"></script>
  </head>
  <body>
    <a-scene>
      <!-- Tu contenido irá aquí -->
    </a-scene>
  </body>
</html>

2. Dentro de “a-scene” añade elementos básicos

  <a-sky color="#87CEEB"></a-sky>

<a-plane color="#f0f0f0" rotation="-90 0 0" width="100" height="100"></a-plane>

<a-light type="ambient" color="#fff"></a-light>
<a-light type="directional" position="0 10 0" intensity="1"></a-light>

3. Añade objetos con modelos y posiciones

Coloca objetos 3D y textos en el espacio usando “a-entity” y “position”.

<a-entity position="5 1.5 -2" gltf-model="models/bola.glb" scale="1.5 1.5 1.5"></a-entity>

<a-entity position="-2 2 -5" gltf-model="models/diana.glb" scale="2 2 2"></a-entity>
<a-text value="Diana simbólica" position="-2 4 -5" align="center" color="#000" scale="2 2 2"></a-text>

4. Crea las puertas hacia otras salas

Añade entidades “a-entity” con el componente “door-link” para que funcionen como enlaces entre salas.

<a-entity
  geometry="primitive: plane; height: 2; width: 4"
  material="color: #4CAF50"
  position="0 1 -8"
  door-link="url: cafes.html">
</a-entity>

<a-text value="Ir a la sala de cafés ☕" position="0 2.5 -8" align="center" color="#000" scale="2 2 2"></a-text>

El componente “door-link” se define en components/door-link.js,

AFRAME.registerComponent('door-link', {
  schema: { url: { type: 'string' } },
  init: function () {
    this.el.addEventListener('click', () => {
      window.location.href = this.data.url;
    });
  }
});

5. Añade carteles informativos

Usa a-text para dar contexto, instrucciones o nombres a cada puerta u objeto:

<a-text value="Sala principal de OfiLibre" position="0 3 -4" align="center" color="#000" scale="3 3 3"></a-text>