Codels
2,1 mil tris32,0 × 27,8 × 23,0 m

Úsalo en código

Hacer remix en el editor
Módulo ES autónomo — solo depende de three. Llama a la función factory y añade el grupo a tu escena.
/**
 * Office Building — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 2,136 · Size (W × H × D): 32.00 × 27.75 × 23.00 m
 *
 * Usage:
 *   import { createOfficeBuilding } from './office-building.js';
 *   
 *   const model = createOfficeBuilding();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

// Deterministic vertex displacement (organic low-poly look).
function jitter(geometry, amount, seed) {
  const pos = geometry.attributes.position;
  const h = (a, b, c, s) => {
    let x = Math.imul(a, 73856093) ^ Math.imul(b, 19349663) ^ Math.imul(c, 83492791) ^ Math.imul(s, 2654435761);
    x = Math.imul(x ^ (x >>> 16), 2246822507);
    x = Math.imul(x ^ (x >>> 13), 3266489909);
    return ((x ^ (x >>> 16)) >>> 0) / 4294967295 - 0.5;
  };
  for (let i = 0; i < pos.count; i++) {
    const x = pos.getX(i), y = pos.getY(i), z = pos.getZ(i);
    const qx = Math.round(x * 1000), qy = Math.round(y * 1000), qz = Math.round(z * 1000);
    pos.setXYZ(i, x + h(qx, qy, qz, seed) * 2 * amount, y + h(qx, qy, qz, seed + 1) * 2 * amount, z + h(qx, qy, qz, seed + 2) * 2 * amount);
  }
  pos.needsUpdate = true;
  geometry.computeVertexNormals();
  return geometry;
}

export function createOfficeBuilding() {
  const root = new THREE.Group();
  root.name = 'OfficeBuilding';

  // Materials
  const glassMat = new THREE.MeshStandardMaterial({ name: 'glass', color: 0x76a9c6, roughness: 0.18, metalness: 0.2, flatShading: true });
  const wallMat = new THREE.MeshStandardMaterial({ name: 'wall', color: 0xe7e3db, roughness: 0.85, flatShading: true });
  const accentMat = new THREE.MeshStandardMaterial({ name: 'accent', color: 0xc8663e, roughness: 0.8, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x2f343b, roughness: 0.6, metalness: 0.2, flatShading: true });
  const pavingMat = new THREE.MeshStandardMaterial({ name: 'paving', color: 0xc7c2b9, roughness: 0.95, flatShading: true });
  const metalMat = new THREE.MeshStandardMaterial({ name: 'metal', color: 0xa2a8ae, roughness: 0.5, metalness: 0.3, flatShading: true });
  const roofMat = new THREE.MeshStandardMaterial({ name: 'roof', color: 0x6a6e74, roughness: 0.9, flatShading: true });
  const leafMat = new THREE.MeshStandardMaterial({ name: 'leaf', color: 0x5f9150, roughness: 0.9, flatShading: true });

  // Shared geometries
  const cylinderGeo = new THREE.CylinderGeometry(0.3, 0.3, 4.2, 8);
  const boxGeo = new THREE.BoxGeometry(0.08, 3.95, 0.08);
  const boxGeo2 = new THREE.BoxGeometry(1.45, 2.45, 0.05);
  const boxGeo3 = new THREE.BoxGeometry(0.05, 0.9, 0.06);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.1, 0.1, 3.3, 8);
  const boxGeo4 = new THREE.BoxGeometry(0.4, 0.26, 0.04);
  const boxGeo5 = new THREE.BoxGeometry(24.3, 1.05, 14.3);
  const boxGeo6 = new THREE.BoxGeometry(24.36, 0.06, 14.7);
  const boxGeo7 = new THREE.BoxGeometry(0.08, 13.6, 0.08);
  const boxGeo8 = new THREE.BoxGeometry(2.4, 1.3, 1.7);
  const cylinderGeo3 = new THREE.CylinderGeometry(0.48, 0.48, 0.08, 10);
  const boxGeo9 = new THREE.BoxGeometry(0.12, 0.3, 1.5);
  const boxGeo10 = new THREE.BoxGeometry(2, 0.55, 2);
  const cylinderGeo4 = new THREE.CylinderGeometry(0.12, 0.16, 2.6, 6);

  // Parts
  const plaza = new THREE.Mesh(new THREE.BoxGeometry(32, 0.15, 23), pavingMat);
  plaza.name = 'plaza';
  plaza.position.set(0, 0.075, 1.5);
  root.add(plaza);
  const lobbyGlass = new THREE.Mesh(new THREE.BoxGeometry(22, 4.2, 12), glassMat);
  lobbyGlass.name = 'lobbyGlass';
  lobbyGlass.position.set(0, 2.25, 0);
  root.add(lobbyGlass);
  const lobbyBase = new THREE.Mesh(new THREE.BoxGeometry(22.1, 0.25, 12.1), darkMat);
  lobbyBase.name = 'lobbyBase';
  lobbyBase.position.set(0, 0.275, 0);
  root.add(lobbyBase);
  const lobbyTransom = new THREE.Mesh(new THREE.BoxGeometry(22.1, 0.12, 12.1), darkMat);
  lobbyTransom.name = 'lobbyTransom';
  lobbyTransom.position.set(0, 3.11, 0);
  root.add(lobbyTransom);
  const column = new THREE.Mesh(cylinderGeo, wallMat);
  column.name = 'column';
  column.position.set(-11.6, 2.25, -6.6);
  root.add(column);
  const column2 = new THREE.Mesh(cylinderGeo, wallMat);
  column2.name = 'column';
  column2.position.set(-11.6, 2.25, 6.6);
  root.add(column2);
  const column3 = new THREE.Mesh(cylinderGeo, wallMat);
  column3.name = 'column';
  column3.position.set(-7.7333, 2.25, -6.6);
  root.add(column3);
  const column4 = new THREE.Mesh(cylinderGeo, wallMat);
  column4.name = 'column';
  column4.position.set(-7.7333, 2.25, 6.6);
  root.add(column4);
  const column5 = new THREE.Mesh(cylinderGeo, wallMat);
  column5.name = 'column';
  column5.position.set(-3.8667, 2.25, -6.6);
  root.add(column5);
  const column6 = new THREE.Mesh(cylinderGeo, wallMat);
  column6.name = 'column';
  column6.position.set(-3.8667, 2.25, 6.6);
  root.add(column6);
  const column7 = new THREE.Mesh(cylinderGeo, wallMat);
  column7.name = 'column';
  column7.position.set(0, 2.25, -6.6);
  root.add(column7);
  const column8 = new THREE.Mesh(cylinderGeo, wallMat);
  column8.name = 'column';
  column8.position.set(0, 2.25, 6.6);
  root.add(column8);
  const column9 = new THREE.Mesh(cylinderGeo, wallMat);
  column9.name = 'column';
  column9.position.set(3.8667, 2.25, -6.6);
  root.add(column9);
  const column10 = new THREE.Mesh(cylinderGeo, wallMat);
  column10.name = 'column';
  column10.position.set(3.8667, 2.25, 6.6);
  root.add(column10);
  const column11 = new THREE.Mesh(cylinderGeo, wallMat);
  column11.name = 'column';
  column11.position.set(7.7333, 2.25, -6.6);
  root.add(column11);
  const column12 = new THREE.Mesh(cylinderGeo, wallMat);
  column12.name = 'column';
  column12.position.set(7.7333, 2.25, 6.6);
  root.add(column12);
  const column13 = new THREE.Mesh(cylinderGeo, wallMat);
  column13.name = 'column';
  column13.position.set(11.6, 2.25, -6.6);
  root.add(column13);
  const column14 = new THREE.Mesh(cylinderGeo, wallMat);
  column14.name = 'column';
  column14.position.set(11.6, 2.25, 6.6);
  root.add(column14);
  const column15 = new THREE.Mesh(cylinderGeo, wallMat);
  column15.name = 'column';
  column15.position.set(-11.6, 2.25, 0);
  root.add(column15);
  const column16 = new THREE.Mesh(cylinderGeo, wallMat);
  column16.name = 'column';
  column16.position.set(11.6, 2.25, 0);
  root.add(column16);
  const lobbyMullion = new THREE.Mesh(boxGeo, darkMat);
  lobbyMullion.name = 'lobbyMullion';
  lobbyMullion.position.set(-7.3333, 2.375, 6.02);
  root.add(lobbyMullion);
  const lobbyMullion2 = new THREE.Mesh(boxGeo, darkMat);
  lobbyMullion2.name = 'lobbyMullion';
  lobbyMullion2.position.set(-3.6667, 2.375, 6.02);
  root.add(lobbyMullion2);
  const lobbyMullion3 = new THREE.Mesh(boxGeo, darkMat);
  lobbyMullion3.name = 'lobbyMullion';
  lobbyMullion3.position.set(3.6667, 2.375, 6.02);
  root.add(lobbyMullion3);
  const lobbyMullion4 = new THREE.Mesh(boxGeo, darkMat);
  lobbyMullion4.name = 'lobbyMullion';
  lobbyMullion4.position.set(7.3333, 2.375, 6.02);
  root.add(lobbyMullion4);
  const entranceFrame = new THREE.Mesh(new THREE.BoxGeometry(3.4, 2.7, 0.12), darkMat);
  entranceFrame.name = 'entranceFrame';
  entranceFrame.position.set(0, 1.5, 6.06);
  root.add(entranceFrame);
  const entranceDoor = new THREE.Mesh(boxGeo2, glassMat);
  entranceDoor.name = 'entranceDoor';
  entranceDoor.position.set(-0.78, 1.425, 6.14);
  root.add(entranceDoor);
  const entranceDoor2 = new THREE.Mesh(boxGeo2, glassMat);
  entranceDoor2.name = 'entranceDoor';
  entranceDoor2.position.set(0.78, 1.425, 6.14);
  root.add(entranceDoor2);
  const doorHandle = new THREE.Mesh(boxGeo3, metalMat);
  doorHandle.name = 'doorHandle';
  doorHandle.position.set(-0.18, 1.3, 6.2);
  root.add(doorHandle);
  const doorHandle2 = new THREE.Mesh(boxGeo3, metalMat);
  doorHandle2.name = 'doorHandle';
  doorHandle2.position.set(0.18, 1.3, 6.2);
  root.add(doorHandle2);
  const canopy = new THREE.Mesh(new THREE.BoxGeometry(7.5, 0.4, 4.2), accentMat);
  canopy.name = 'canopy';
  canopy.position.set(0, 3.65, 8);
  root.add(canopy);
  const canopySoffit = new THREE.Mesh(new THREE.BoxGeometry(7.2, 0.05, 3.9), darkMat);
  canopySoffit.name = 'canopySoffit';
  canopySoffit.position.set(0, 3.435, 8);
  root.add(canopySoffit);
  const canopyColumn = new THREE.Mesh(cylinderGeo2, darkMat);
  canopyColumn.name = 'canopyColumn';
  canopyColumn.position.set(-3.2, 1.8, 9.7);
  root.add(canopyColumn);
  const canopyColumn2 = new THREE.Mesh(cylinderGeo2, darkMat);
  canopyColumn2.name = 'canopyColumn';
  canopyColumn2.position.set(3.2, 1.8, 9.7);
  root.add(canopyColumn2);
  const canopyLetter = new THREE.Mesh(boxGeo4, wallMat);
  canopyLetter.name = 'canopyLetter';
  canopyLetter.position.set(-2.1, 3.65, 10.11);
  root.add(canopyLetter);
  const canopyLetter2 = new THREE.Mesh(boxGeo4, wallMat);
  canopyLetter2.name = 'canopyLetter';
  canopyLetter2.position.set(-1.4, 3.65, 10.11);
  root.add(canopyLetter2);
  const canopyLetter3 = new THREE.Mesh(boxGeo4, wallMat);
  canopyLetter3.name = 'canopyLetter';
  canopyLetter3.position.set(-0.7, 3.65, 10.11);
  root.add(canopyLetter3);
  const canopyLetter4 = new THREE.Mesh(boxGeo4, wallMat);
  canopyLetter4.name = 'canopyLetter';
  canopyLetter4.position.set(0, 3.65, 10.11);
  root.add(canopyLetter4);
  const canopyLetter5 = new THREE.Mesh(boxGeo4, wallMat);
  canopyLetter5.name = 'canopyLetter';
  canopyLetter5.position.set(0.7, 3.65, 10.11);
  root.add(canopyLetter5);
  const canopyLetter6 = new THREE.Mesh(boxGeo4, wallMat);
  canopyLetter6.name = 'canopyLetter';
  canopyLetter6.position.set(1.4, 3.65, 10.11);
  root.add(canopyLetter6);
  const canopyLetter7 = new THREE.Mesh(boxGeo4, wallMat);
  canopyLetter7.name = 'canopyLetter';
  canopyLetter7.position.set(2.1, 3.65, 10.11);
  root.add(canopyLetter7);
  const entranceMat = new THREE.Mesh(new THREE.BoxGeometry(9, 0.1, 5), pavingMat);
  entranceMat.name = 'entranceMat';
  entranceMat.position.set(0, 0.2, 8.2);
  root.add(entranceMat);
  const officeGlass = new THREE.Mesh(new THREE.BoxGeometry(24, 13.6, 14), glassMat);
  officeGlass.name = 'officeGlass';
  officeGlass.position.set(0, 11.15, 0);
  root.add(officeGlass);
  const spandrel = new THREE.Mesh(boxGeo5, wallMat);
  spandrel.name = 'spandrel';
  spandrel.position.set(0, 4.875, 0);
  root.add(spandrel);
  const louver = new THREE.Mesh(boxGeo6, metalMat);
  louver.name = 'louver';
  louver.position.set(0, 7.46, 0);
  root.add(louver);
  const spandrel2 = new THREE.Mesh(boxGeo5, wallMat);
  spandrel2.name = 'spandrel';
  spandrel2.position.set(0, 8.275, 0);
  root.add(spandrel2);
  const louver2 = new THREE.Mesh(boxGeo6, metalMat);
  louver2.name = 'louver';
  louver2.position.set(0, 10.86, 0);
  root.add(louver2);
  const spandrel3 = new THREE.Mesh(boxGeo5, wallMat);
  spandrel3.name = 'spandrel';
  spandrel3.position.set(0, 11.675, 0);
  root.add(spandrel3);
  const louver3 = new THREE.Mesh(boxGeo6, metalMat);
  louver3.name = 'louver';
  louver3.position.set(0, 14.26, 0);
  root.add(louver3);
  const spandrel4 = new THREE.Mesh(boxGeo5, wallMat);
  spandrel4.name = 'spandrel';
  spandrel4.position.set(0, 15.075, 0);
  root.add(spandrel4);
  const louver4 = new THREE.Mesh(boxGeo6, metalMat);
  louver4.name = 'louver';
  louver4.position.set(0, 17.66, 0);
  root.add(louver4);
  const parapet = new THREE.Mesh(new THREE.BoxGeometry(24.3, 1.2, 14.3), wallMat);
  parapet.name = 'parapet';
  parapet.position.set(0, 18.55, 0);
  root.add(parapet);
  const roofDeck = new THREE.Mesh(new THREE.BoxGeometry(23.7, 0.05, 13.7), roofMat);
  roofDeck.name = 'roofDeck';
  roofDeck.position.set(0, 19.175, 0);
  root.add(roofDeck);
  const mullion = new THREE.Mesh(boxGeo7, darkMat);
  mullion.name = 'mullion';
  mullion.position.set(-10.4, 11.15, -7.03);
  root.add(mullion);
  const mullion2 = new THREE.Mesh(boxGeo7, darkMat);
  mullion2.name = 'mullion';
  mullion2.position.set(-10.4, 11.15, 7.03);
  root.add(mullion2);
  const mullion3 = new THREE.Mesh(boxGeo7, darkMat);
  mullion3.name = 'mullion';
  mullion3.position.set(-8.8, 11.15, -7.03);
  root.add(mullion3);
  const mullion4 = new THREE.Mesh(boxGeo7, darkMat);
  mullion4.name = 'mullion';
  mullion4.position.set(-8.8, 11.15, 7.03);
  root.add(mullion4);
  const mullion5 = new THREE.Mesh(boxGeo7, darkMat);
  mullion5.name = 'mullion';
  mullion5.position.set(-7.2, 11.15, -7.03);
  root.add(mullion5);
  const mullion6 = new THREE.Mesh(boxGeo7, darkMat);
  mullion6.name = 'mullion';
  mullion6.position.set(-7.2, 11.15, 7.03);
  root.add(mullion6);
  const mullion7 = new THREE.Mesh(boxGeo7, darkMat);
  mullion7.name = 'mullion';
  mullion7.position.set(-5.6, 11.15, -7.03);
  root.add(mullion7);
  const mullion8 = new THREE.Mesh(boxGeo7, darkMat);
  mullion8.name = 'mullion';
  mullion8.position.set(-5.6, 11.15, 7.03);
  root.add(mullion8);
  const mullion9 = new THREE.Mesh(boxGeo7, darkMat);
  mullion9.name = 'mullion';
  mullion9.position.set(-4, 11.15, -7.03);
  root.add(mullion9);
  const mullion10 = new THREE.Mesh(boxGeo7, darkMat);
  mullion10.name = 'mullion';
  mullion10.position.set(-4, 11.15, 7.03);
  root.add(mullion10);
  const mullion11 = new THREE.Mesh(boxGeo7, darkMat);
  mullion11.name = 'mullion';
  mullion11.position.set(-2.4, 11.15, -7.03);
  root.add(mullion11);
  const mullion12 = new THREE.Mesh(boxGeo7, darkMat);
  mullion12.name = 'mullion';
  mullion12.position.set(-2.4, 11.15, 7.03);
  root.add(mullion12);
  const mullion13 = new THREE.Mesh(boxGeo7, darkMat);
  mullion13.name = 'mullion';
  mullion13.position.set(-0.8, 11.15, -7.03);
  root.add(mullion13);
  const mullion14 = new THREE.Mesh(boxGeo7, darkMat);
  mullion14.name = 'mullion';
  mullion14.position.set(-0.8, 11.15, 7.03);
  root.add(mullion14);
  const mullion15 = new THREE.Mesh(boxGeo7, darkMat);
  mullion15.name = 'mullion';
  mullion15.position.set(0.8, 11.15, -7.03);
  root.add(mullion15);
  const mullion16 = new THREE.Mesh(boxGeo7, darkMat);
  mullion16.name = 'mullion';
  mullion16.position.set(0.8, 11.15, 7.03);
  root.add(mullion16);
  const mullion17 = new THREE.Mesh(boxGeo7, darkMat);
  mullion17.name = 'mullion';
  mullion17.position.set(2.4, 11.15, -7.03);
  root.add(mullion17);
  const mullion18 = new THREE.Mesh(boxGeo7, darkMat);
  mullion18.name = 'mullion';
  mullion18.position.set(2.4, 11.15, 7.03);
  root.add(mullion18);
  const mullion19 = new THREE.Mesh(boxGeo7, darkMat);
  mullion19.name = 'mullion';
  mullion19.position.set(4, 11.15, -7.03);
  root.add(mullion19);
  const mullion20 = new THREE.Mesh(boxGeo7, darkMat);
  mullion20.name = 'mullion';
  mullion20.position.set(4, 11.15, 7.03);
  root.add(mullion20);
  const mullion21 = new THREE.Mesh(boxGeo7, darkMat);
  mullion21.name = 'mullion';
  mullion21.position.set(5.6, 11.15, -7.03);
  root.add(mullion21);
  const mullion22 = new THREE.Mesh(boxGeo7, darkMat);
  mullion22.name = 'mullion';
  mullion22.position.set(5.6, 11.15, 7.03);
  root.add(mullion22);
  const mullion23 = new THREE.Mesh(boxGeo7, darkMat);
  mullion23.name = 'mullion';
  mullion23.position.set(7.2, 11.15, -7.03);
  root.add(mullion23);
  const mullion24 = new THREE.Mesh(boxGeo7, darkMat);
  mullion24.name = 'mullion';
  mullion24.position.set(7.2, 11.15, 7.03);
  root.add(mullion24);
  const mullion25 = new THREE.Mesh(boxGeo7, darkMat);
  mullion25.name = 'mullion';
  mullion25.position.set(8.8, 11.15, -7.03);
  root.add(mullion25);
  const mullion26 = new THREE.Mesh(boxGeo7, darkMat);
  mullion26.name = 'mullion';
  mullion26.position.set(8.8, 11.15, 7.03);
  root.add(mullion26);
  const mullion27 = new THREE.Mesh(boxGeo7, darkMat);
  mullion27.name = 'mullion';
  mullion27.position.set(10.4, 11.15, -7.03);
  root.add(mullion27);
  const mullion28 = new THREE.Mesh(boxGeo7, darkMat);
  mullion28.name = 'mullion';
  mullion28.position.set(10.4, 11.15, 7.03);
  root.add(mullion28);
  const mullion29 = new THREE.Mesh(boxGeo7, darkMat);
  mullion29.name = 'mullion';
  mullion29.position.set(-12.03, 11.15, -5.4444);
  root.add(mullion29);
  const mullion30 = new THREE.Mesh(boxGeo7, darkMat);
  mullion30.name = 'mullion';
  mullion30.position.set(12.03, 11.15, -5.4444);
  root.add(mullion30);
  const mullion31 = new THREE.Mesh(boxGeo7, darkMat);
  mullion31.name = 'mullion';
  mullion31.position.set(-12.03, 11.15, -3.8889);
  root.add(mullion31);
  const mullion32 = new THREE.Mesh(boxGeo7, darkMat);
  mullion32.name = 'mullion';
  mullion32.position.set(12.03, 11.15, -3.8889);
  root.add(mullion32);
  const mullion33 = new THREE.Mesh(boxGeo7, darkMat);
  mullion33.name = 'mullion';
  mullion33.position.set(-12.03, 11.15, -2.3333);
  root.add(mullion33);
  const mullion34 = new THREE.Mesh(boxGeo7, darkMat);
  mullion34.name = 'mullion';
  mullion34.position.set(12.03, 11.15, -2.3333);
  root.add(mullion34);
  const mullion35 = new THREE.Mesh(boxGeo7, darkMat);
  mullion35.name = 'mullion';
  mullion35.position.set(-12.03, 11.15, -0.7778);
  root.add(mullion35);
  const mullion36 = new THREE.Mesh(boxGeo7, darkMat);
  mullion36.name = 'mullion';
  mullion36.position.set(12.03, 11.15, -0.7778);
  root.add(mullion36);
  const mullion37 = new THREE.Mesh(boxGeo7, darkMat);
  mullion37.name = 'mullion';
  mullion37.position.set(-12.03, 11.15, 0.7778);
  root.add(mullion37);
  const mullion38 = new THREE.Mesh(boxGeo7, darkMat);
  mullion38.name = 'mullion';
  mullion38.position.set(12.03, 11.15, 0.7778);
  root.add(mullion38);
  const mullion39 = new THREE.Mesh(boxGeo7, darkMat);
  mullion39.name = 'mullion';
  mullion39.position.set(-12.03, 11.15, 2.3333);
  root.add(mullion39);
  const mullion40 = new THREE.Mesh(boxGeo7, darkMat);
  mullion40.name = 'mullion';
  mullion40.position.set(12.03, 11.15, 2.3333);
  root.add(mullion40);
  const mullion41 = new THREE.Mesh(boxGeo7, darkMat);
  mullion41.name = 'mullion';
  mullion41.position.set(-12.03, 11.15, 3.8889);
  root.add(mullion41);
  const mullion42 = new THREE.Mesh(boxGeo7, darkMat);
  mullion42.name = 'mullion';
  mullion42.position.set(12.03, 11.15, 3.8889);
  root.add(mullion42);
  const mullion43 = new THREE.Mesh(boxGeo7, darkMat);
  mullion43.name = 'mullion';
  mullion43.position.set(-12.03, 11.15, 5.4444);
  root.add(mullion43);
  const mullion44 = new THREE.Mesh(boxGeo7, darkMat);
  mullion44.name = 'mullion';
  mullion44.position.set(12.03, 11.15, 5.4444);
  root.add(mullion44);
  const stairCore = new THREE.Mesh(new THREE.BoxGeometry(3.2, 21.2, 5.2), accentMat);
  stairCore.name = 'stairCore';
  stairCore.position.set(-13.6, 10.75, -3.4);
  root.add(stairCore);
  const stairWindow = new THREE.Mesh(new THREE.BoxGeometry(0.9, 18.7, 0.06), glassMat);
  stairWindow.name = 'stairWindow';
  stairWindow.position.set(-13.6, 10.5, -0.77);
  root.add(stairWindow);
  const coreCap = new THREE.Mesh(new THREE.BoxGeometry(3.5, 0.25, 5.5), wallMat);
  coreCap.name = 'coreCap';
  coreCap.position.set(-13.6, 21.475, -3.4);
  root.add(coreCap);
  const coreDoor = new THREE.Mesh(new THREE.BoxGeometry(1.1, 2.2, 0.06), darkMat);
  coreDoor.name = 'coreDoor';
  coreDoor.position.set(-14.2, 1.25, -0.77);
  root.add(coreDoor);
  const acUnit = new THREE.Group();
  acUnit.name = 'acUnit';
  acUnit.position.set(-8.8583, 19.15, -3.8);
  root.add(acUnit);
  const acBody = new THREE.Mesh(boxGeo8, metalMat);
  acBody.name = 'acBody';
  acBody.position.set(0, 0.65, 0);
  acUnit.add(acBody);
  const acFan = new THREE.Mesh(cylinderGeo3, darkMat);
  acFan.name = 'acFan';
  acFan.position.set(-0.55, 1.34, 0);
  acUnit.add(acFan);
  const acFan2 = new THREE.Mesh(cylinderGeo3, darkMat);
  acFan2.name = 'acFan';
  acFan2.position.set(0.55, 1.34, 0);
  acUnit.add(acFan2);
  const acRail = new THREE.Mesh(boxGeo9, darkMat);
  acRail.name = 'acRail';
  acRail.position.set(0, 1.45, 0);
  acUnit.add(acRail);
  const acUnit2 = new THREE.Group();
  acUnit2.name = 'acUnit';
  acUnit2.position.set(-0.2459, 19.15, -3.2);
  root.add(acUnit2);
  const acBody2 = new THREE.Mesh(boxGeo8, metalMat);
  acBody2.name = 'acBody';
  acBody2.position.set(0, 0.65, 0);
  acUnit2.add(acBody2);
  const acFan3 = new THREE.Mesh(cylinderGeo3, darkMat);
  acFan3.name = 'acFan';
  acFan3.position.set(-0.55, 1.34, 0);
  acUnit2.add(acFan3);
  const acFan4 = new THREE.Mesh(cylinderGeo3, darkMat);
  acFan4.name = 'acFan';
  acFan4.position.set(0.55, 1.34, 0);
  acUnit2.add(acFan4);
  const acRail2 = new THREE.Mesh(boxGeo9, darkMat);
  acRail2.name = 'acRail';
  acRail2.position.set(0, 1.45, 0);
  acUnit2.add(acRail2);
  const acUnit3 = new THREE.Group();
  acUnit3.name = 'acUnit';
  acUnit3.position.set(9.0251, 19.15, -3.8);
  root.add(acUnit3);
  const acBody3 = new THREE.Mesh(boxGeo8, metalMat);
  acBody3.name = 'acBody';
  acBody3.position.set(0, 0.65, 0);
  acUnit3.add(acBody3);
  const acFan5 = new THREE.Mesh(cylinderGeo3, darkMat);
  acFan5.name = 'acFan';
  acFan5.position.set(-0.55, 1.34, 0);
  acUnit3.add(acFan5);
  const acFan6 = new THREE.Mesh(cylinderGeo3, darkMat);
  acFan6.name = 'acFan';
  acFan6.position.set(0.55, 1.34, 0);
  acUnit3.add(acFan6);
  const acRail3 = new THREE.Mesh(boxGeo9, darkMat);
  acRail3.name = 'acRail';
  acRail3.position.set(0, 1.45, 0);
  acUnit3.add(acRail3);
  const duct = new THREE.Mesh(new THREE.BoxGeometry(14.4, 0.55, 0.55), metalMat);
  duct.name = 'duct';
  duct.position.set(-1.2, 19.425, -2);
  root.add(duct);
  const duct2 = new THREE.Mesh(new THREE.BoxGeometry(0.55, 0.55, 4), metalMat);
  duct2.name = 'duct';
  duct2.position.set(6, 19.425, -0.2);
  root.add(duct2);
  const roofAccess = new THREE.Mesh(new THREE.BoxGeometry(3, 2.6, 2.6), wallMat);
  roofAccess.name = 'roofAccess';
  roofAccess.position.set(8.8, 20.45, 4);
  root.add(roofAccess);
  const roofAccessDoor = new THREE.Mesh(new THREE.BoxGeometry(0.9, 2, 0.05), darkMat);
  roofAccessDoor.name = 'roofAccessDoor';
  roofAccessDoor.position.set(8.8, 20.15, 5.32);
  root.add(roofAccessDoor);
  const antenna = new THREE.Mesh(new THREE.CylinderGeometry(0.05, 0.08, 6, 6), metalMat);
  antenna.name = 'antenna';
  antenna.position.set(9.6, 24.75, 3.6);
  root.add(antenna);
  const dish = new THREE.Mesh(new THREE.CylinderGeometry(0.6, 0.15, 0.25, 10), metalMat);
  dish.name = 'dish';
  dish.position.set(7.9, 22.1, 4);
  dish.rotation.set(deg(-35), deg(20), 0);
  root.add(dish);
  const planter = new THREE.Mesh(boxGeo10, wallMat);
  planter.name = 'planter';
  planter.position.set(-10.5, 0.425, 10.4);
  root.add(planter);
  const trunk = new THREE.Mesh(cylinderGeo4, darkMat);
  trunk.name = 'trunk';
  trunk.position.set(-10.5, 1.95, 10.4);
  root.add(trunk);
  const treeCrown = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(1.25, 0), 0.12, 8), leafMat);
  treeCrown.name = 'treeCrown';
  treeCrown.position.set(-10.5, 3.75, 10.4);
  root.add(treeCrown);
  const treeCrown2 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.85, 0), 0.1, 11), leafMat);
  treeCrown2.name = 'treeCrown';
  treeCrown2.position.set(-11, 4.55, 10.1);
  root.add(treeCrown2);
  const planter2 = new THREE.Mesh(boxGeo10, wallMat);
  planter2.name = 'planter';
  planter2.position.set(10.5, 0.425, 10.4);
  root.add(planter2);
  const trunk2 = new THREE.Mesh(cylinderGeo4, darkMat);
  trunk2.name = 'trunk';
  trunk2.position.set(10.5, 1.95, 10.4);
  root.add(trunk2);
  const treeCrown3 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(1.25, 0), 0.12, 10), leafMat);
  treeCrown3.name = 'treeCrown';
  treeCrown3.position.set(10.5, 3.75, 10.4);
  root.add(treeCrown3);
  const treeCrown4 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.85, 0), 0.1, 13), leafMat);
  treeCrown4.name = 'treeCrown';
  treeCrown4.position.set(11, 4.55, 10.1);
  root.add(treeCrown4);

  root.traverse((o) => {
    if (o.isMesh) {
      o.castShadow = true;
      o.receiveShadow = true;
    }
  });
  return root;
}

export default createOfficeBuilding;

Valoraciones y comentarios

—
Aún no hay valoraciones — sé el primero.
5
0
4
0
3
0
2
0
1
0

Inicia sesión para valorar y comentar.

0 comentarios

Aún no hay comentarios. Cuenta cómo usaste este modelo o qué se podría mejorar.

Modelos relacionados

Misma categoría o etiquetas similares