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; }