Integración de Three.js en aplicaciones Vue 2.x

Para incroporar Three.js en un proyecot Vue 2.x, se procede con la instalación mediante npm y la configuración adecuada en los componentes.

Instalación del paquete principal

npm install three

Si se requiere una versión específica del paquete:

npm install three@122

Dependencias adicionales para modelos 3D

Para cargar archvios .obj y .mtl en el proyecto, es necesario instalar el plugin three-obj-mtl-loader. En algunos casos, se debe utilizar la versión 122 de Three.js para garantizar la compatibilidad:

npm install three-obj-mtl-loader --save

Ejemplo de implementación completa

A continuación se muestra un componente Vue que configura una escena 3D con iluminación, controles de órbita y carga de modelos externos.

Plantilla HTML:```

Lógica del componente:``` import * as THREE from 'three'; import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; import { MTLLoader, OBJLoader } from 'three-obj-mtl-loader';

export default { mounted() { const containerWidth = 1053; const containerHeight = 473; const aspectRatio = containerWidth / containerHeight;

this.escena = new THREE.Scene();

this.camara = new THREE.PerspectiveCamera(55, aspectRatio, 1, 2000);
this.camara.position.set(-450, 280, 320);

this.renderizador = new THREE.WebGL1Renderer();
this.renderizador.setSize(containerWidth, containerHeight);
this.renderizador.setClearColor(new THREE.Color('#07224e'), 1);

setTimeout(() => {
  const contenedor = document.getElementById('scene-container');
  contenedor.appendChild(this.renderizador.domElement);
}, 500);

this.agregarIluminacion();
this.generarPlanoBase();
this.cargarModeloExterno();

this.controlador = new OrbitControls(this.camara, this.renderizador.domElement);
this.ejecutarAnimacion();

},

methods: { agregarIluminacion() { const luzPuntual = new THREE.PointLight(0xffffff); luzPuntual.position.set(800, 800, 2000); this.escena.add(luzPuntual);

  const luzAmbiente = new THREE.AmbientLight(0xffffff);
  this.escena.add(luzAmbiente);
},

generarPlanoBase() {
  const forma = new THREE.BoxGeometry(3200, 1600, 8);
  const apariencia = new THREE.MeshLambertMaterial({
    color: new THREE.Color('#bcbfc6'),
    transparent: true,
    opacity: 0.3,
    side: THREE.DoubleSide
  });
  const mallado = new THREE.Mesh(forma, apariencia);
  mallado.rotateX(-Math.PI / 2);
  this.escena.add(mallado);
},

cargarModeloExterno() {
  const escenaRef = this.escena;
  const gestorMateriales = new MTLLoader();
  const gestorObjetos = new OBJLoader();

  gestorMateriales.load('static/door.mtl', function(materiales) {
    materiales.preload();
    gestorObjetos.setMaterials(materiales);
    gestorObjetos.load('static/door.obj', function(modelo) {
      modelo.position.set(-265, 10, -188);
      modelo.rotateY(Math.PI / 2);
      modelo.scale.set(20, 20, 20);
      escenaRef.add(modelo);
    });
  });
},

ejecutarAnimacion() {
  this.renderizador.render(this.escena, this.camara);
  requestAnimationFrame(() => this.ejecutarAnimacion());
}

} };


Consideraciones importantes
---------------------------

Los archivos de modelos 3D (.obj y .mtl) deben ubicarse en la carpeta `static` al mismo nivel que el directorio `src`. La ruta de importación debe ser relativa a esa ubicación, como por ejemplo: `'static/door.mtl'`

Para eliminar el borde de enfoque que aparece alrededor del canvas generado por Three.js, se puede aplicar el siguiente estilo CSS:

.viewer-box { width: 1053px; height: 473px; }

.viewer-box canvas:focus-visible { outline: 0px; }

Etiquetas: threejs Vue2 WebGL 3d-modeling obj-loader

Publicado el 7-1 17:10