Codels
2,7 mil tris29,3 × 118,1 × 29,3 m
Módulo ES autocontido — depende apenas do three. Chame a factory e adicione o grupo à sua cena.
/**
 * Skyscraper — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 2,692 · Size (W × H × D): 29.30 × 118.12 × 29.30 m
 *
 * Usage:
 *   import { createSkyscraper } from './skyscraper.js';
 *   
 *   const model = createSkyscraper();
 *   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 createSkyscraper() {
  const root = new THREE.Group();
  root.name = 'Skyscraper';

  // Materials
  const glassMat = new THREE.MeshStandardMaterial({ name: 'glass', color: 0x5e93b9, roughness: 0.18, metalness: 0.2, flatShading: true });
  const glassAltMat = new THREE.MeshStandardMaterial({ name: 'glassAlt', color: 0x81abc8, roughness: 0.15, metalness: 0.2, flatShading: true });
  const frameMat = new THREE.MeshStandardMaterial({ name: 'frame', color: 0xd5d9de, roughness: 0.45, metalness: 0.25, flatShading: true });
  const stoneMat = new THREE.MeshStandardMaterial({ name: 'stone', color: 0xbdb5a8, roughness: 0.9, flatShading: true });
  const roofMat = new THREE.MeshStandardMaterial({ name: 'roof', color: 0x5c6168, roughness: 0.9, flatShading: true });
  const metalMat = new THREE.MeshStandardMaterial({ name: 'metal', color: 0x8f969e, roughness: 0.55, metalness: 0.35, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x2a2f36, roughness: 0.7, flatShading: true });
  const plazaMat = new THREE.MeshStandardMaterial({ name: 'plaza', color: 0xd2ccc2, roughness: 0.95, flatShading: true });
  const leafMat = new THREE.MeshStandardMaterial({ name: 'leaf', color: 0x5d8c48, roughness: 0.9, flatShading: true });
  const beaconMat = new THREE.MeshStandardMaterial({ name: 'beacon', color: 0xff5a48, roughness: 0.8, emissive: 0xff2a18, emissiveIntensity: 1.2, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(0.7, 5.4, 0.7);
  const boxGeo2 = new THREE.BoxGeometry(2.3, 2.4, 0.06);
  const cylinderGeo = new THREE.CylinderGeometry(0.08, 0.08, 4.1, 6);
  const boxGeo3 = new THREE.BoxGeometry(2.6, 0.6, 1.2);
  const boxGeo4 = new THREE.BoxGeometry(20.24, 0.34, 20.24);
  const boxGeo5 = new THREE.BoxGeometry(0.16, 50.4, 0.16);
  const boxGeo6 = new THREE.BoxGeometry(2.6171, 3.2, 0.04);
  const boxGeo7 = new THREE.BoxGeometry(0.5, 50.4, 0.5);
  const boxGeo8 = new THREE.BoxGeometry(15.84, 0.34, 15.84);
  const boxGeo9 = new THREE.BoxGeometry(0.16, 32.4, 0.16);
  const boxGeo10 = new THREE.BoxGeometry(2.88, 3.2, 0.04);
  const boxGeo11 = new THREE.BoxGeometry(0.5, 32.4, 0.5);
  const boxGeo12 = new THREE.BoxGeometry(16, 1.1, 0.25);
  const boxGeo13 = new THREE.BoxGeometry(0.25, 1.1, 15.5);
  const boxGeo14 = new THREE.BoxGeometry(2.6, 1.3, 1.6);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.55, 0.55, 0.08, 10);
  const boxGeo15 = new THREE.BoxGeometry(1, 0.05, 0.08);

  // Parts
  const plaza = new THREE.Mesh(new THREE.BoxGeometry(29, 0.2, 29), plazaMat);
  plaza.name = 'plaza';
  plaza.position.set(0, 0.1, 0);
  root.add(plaza);
  const plazaCurb = new THREE.Mesh(new THREE.BoxGeometry(29.3, 0.08, 29.3), stoneMat);
  plazaCurb.name = 'plazaCurb';
  plazaCurb.position.set(0, 0.04, 0);
  root.add(plazaCurb);
  const lobbyGlass = new THREE.Mesh(new THREE.BoxGeometry(18.4, 5.4, 18.4), glassMat);
  lobbyGlass.name = 'lobbyGlass';
  lobbyGlass.position.set(0, 2.9, 0);
  root.add(lobbyGlass);
  const lobbyColumn = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn.name = 'lobbyColumn';
  lobbyColumn.position.set(-9.65, 2.9, -9.65);
  root.add(lobbyColumn);
  const lobbyColumn2 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn2.name = 'lobbyColumn';
  lobbyColumn2.position.set(-9.65, 2.9, 9.65);
  root.add(lobbyColumn2);
  const lobbyColumn3 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn3.name = 'lobbyColumn';
  lobbyColumn3.position.set(-7.1429, 2.9, -9.65);
  root.add(lobbyColumn3);
  const lobbyColumn4 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn4.name = 'lobbyColumn';
  lobbyColumn4.position.set(-7.1429, 2.9, 9.65);
  root.add(lobbyColumn4);
  const lobbyColumn5 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn5.name = 'lobbyColumn';
  lobbyColumn5.position.set(-9.65, 2.9, -7.1429);
  root.add(lobbyColumn5);
  const lobbyColumn6 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn6.name = 'lobbyColumn';
  lobbyColumn6.position.set(9.65, 2.9, -7.1429);
  root.add(lobbyColumn6);
  const lobbyColumn7 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn7.name = 'lobbyColumn';
  lobbyColumn7.position.set(-4.2857, 2.9, -9.65);
  root.add(lobbyColumn7);
  const lobbyColumn8 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn8.name = 'lobbyColumn';
  lobbyColumn8.position.set(-4.2857, 2.9, 9.65);
  root.add(lobbyColumn8);
  const lobbyColumn9 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn9.name = 'lobbyColumn';
  lobbyColumn9.position.set(-9.65, 2.9, -4.2857);
  root.add(lobbyColumn9);
  const lobbyColumn10 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn10.name = 'lobbyColumn';
  lobbyColumn10.position.set(9.65, 2.9, -4.2857);
  root.add(lobbyColumn10);
  const lobbyColumn11 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn11.name = 'lobbyColumn';
  lobbyColumn11.position.set(-1.4286, 2.9, -9.65);
  root.add(lobbyColumn11);
  const lobbyColumn12 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn12.name = 'lobbyColumn';
  lobbyColumn12.position.set(-1.4286, 2.9, 9.65);
  root.add(lobbyColumn12);
  const lobbyColumn13 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn13.name = 'lobbyColumn';
  lobbyColumn13.position.set(-9.65, 2.9, -1.4286);
  root.add(lobbyColumn13);
  const lobbyColumn14 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn14.name = 'lobbyColumn';
  lobbyColumn14.position.set(9.65, 2.9, -1.4286);
  root.add(lobbyColumn14);
  const lobbyColumn15 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn15.name = 'lobbyColumn';
  lobbyColumn15.position.set(1.4286, 2.9, -9.65);
  root.add(lobbyColumn15);
  const lobbyColumn16 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn16.name = 'lobbyColumn';
  lobbyColumn16.position.set(1.4286, 2.9, 9.65);
  root.add(lobbyColumn16);
  const lobbyColumn17 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn17.name = 'lobbyColumn';
  lobbyColumn17.position.set(-9.65, 2.9, 1.4286);
  root.add(lobbyColumn17);
  const lobbyColumn18 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn18.name = 'lobbyColumn';
  lobbyColumn18.position.set(9.65, 2.9, 1.4286);
  root.add(lobbyColumn18);
  const lobbyColumn19 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn19.name = 'lobbyColumn';
  lobbyColumn19.position.set(4.2857, 2.9, -9.65);
  root.add(lobbyColumn19);
  const lobbyColumn20 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn20.name = 'lobbyColumn';
  lobbyColumn20.position.set(4.2857, 2.9, 9.65);
  root.add(lobbyColumn20);
  const lobbyColumn21 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn21.name = 'lobbyColumn';
  lobbyColumn21.position.set(-9.65, 2.9, 4.2857);
  root.add(lobbyColumn21);
  const lobbyColumn22 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn22.name = 'lobbyColumn';
  lobbyColumn22.position.set(9.65, 2.9, 4.2857);
  root.add(lobbyColumn22);
  const lobbyColumn23 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn23.name = 'lobbyColumn';
  lobbyColumn23.position.set(7.1429, 2.9, -9.65);
  root.add(lobbyColumn23);
  const lobbyColumn24 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn24.name = 'lobbyColumn';
  lobbyColumn24.position.set(7.1429, 2.9, 9.65);
  root.add(lobbyColumn24);
  const lobbyColumn25 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn25.name = 'lobbyColumn';
  lobbyColumn25.position.set(-9.65, 2.9, 7.1429);
  root.add(lobbyColumn25);
  const lobbyColumn26 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn26.name = 'lobbyColumn';
  lobbyColumn26.position.set(9.65, 2.9, 7.1429);
  root.add(lobbyColumn26);
  const lobbyColumn27 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn27.name = 'lobbyColumn';
  lobbyColumn27.position.set(9.65, 2.9, -9.65);
  root.add(lobbyColumn27);
  const lobbyColumn28 = new THREE.Mesh(boxGeo, stoneMat);
  lobbyColumn28.name = 'lobbyColumn';
  lobbyColumn28.position.set(9.65, 2.9, 9.65);
  root.add(lobbyColumn28);
  const lobbyTransom = new THREE.Mesh(new THREE.BoxGeometry(18.5, 0.14, 18.5), frameMat);
  lobbyTransom.name = 'lobbyTransom';
  lobbyTransom.position.set(0, 3.27, 0);
  root.add(lobbyTransom);
  const lobbyBase = new THREE.Mesh(new THREE.BoxGeometry(18.6, 0.3, 18.6), darkMat);
  lobbyBase.name = 'lobbyBase';
  lobbyBase.position.set(0, 0.35, 0);
  root.add(lobbyBase);
  const revolvingDoor = new THREE.Group();
  revolvingDoor.name = 'revolvingDoor';
  revolvingDoor.position.set(0, 0.2, 9.2);
  root.add(revolvingDoor);
  const doorTop = new THREE.Mesh(new THREE.CylinderGeometry(1.25, 1.25, 0.25, 12), frameMat);
  doorTop.name = 'doorTop';
  doorTop.position.set(0, 2.575, 0);
  revolvingDoor.add(doorTop);
  const doorSill = new THREE.Mesh(new THREE.CylinderGeometry(1.25, 1.25, 0.06, 12), darkMat);
  doorSill.name = 'doorSill';
  doorSill.position.set(0, 0.03, 0);
  revolvingDoor.add(doorSill);
  const doorDrum = new THREE.Mesh(new THREE.CylinderGeometry(1.18, 1.18, 2.4, 12, 1, true, -Math.PI / 2, Math.PI), glassAltMat);
  doorDrum.name = 'doorDrum';
  doorDrum.position.set(0, 1.25, 0);
  revolvingDoor.add(doorDrum);
  const doorWing = new THREE.Mesh(boxGeo2, frameMat);
  doorWing.name = 'doorWing';
  doorWing.position.set(0, 1.25, 0);
  doorWing.rotation.set(0, deg(45), 0);
  revolvingDoor.add(doorWing);
  const doorWing2 = new THREE.Mesh(boxGeo2, frameMat);
  doorWing2.name = 'doorWing';
  doorWing2.position.set(0, 1.25, 0);
  doorWing2.rotation.set(0, deg(-45), 0);
  revolvingDoor.add(doorWing2);
  const canopy = new THREE.Mesh(new THREE.BoxGeometry(6.2857, 0.32, 3.6), frameMat);
  canopy.name = 'canopy';
  canopy.position.set(0, 4.46, 11.4);
  root.add(canopy);
  const canopyLights = new THREE.Mesh(new THREE.BoxGeometry(5.9857, 0.06, 3.3), darkMat);
  canopyLights.name = 'canopyLights';
  canopyLights.position.set(0, 4.29, 11.4);
  root.add(canopyLights);
  const canopyPost = new THREE.Mesh(cylinderGeo, metalMat);
  canopyPost.name = 'canopyPost';
  canopyPost.position.set(-2.8429, 2.25, 12.9);
  root.add(canopyPost);
  const canopyPost2 = new THREE.Mesh(cylinderGeo, metalMat);
  canopyPost2.name = 'canopyPost';
  canopyPost2.position.set(2.8429, 2.25, 12.9);
  root.add(canopyPost2);
  const nameBoard = new THREE.Mesh(new THREE.BoxGeometry(4.5714, 0.7, 0.12), darkMat);
  nameBoard.name = 'nameBoard';
  nameBoard.position.set(0, 5.05, 10.06);
  root.add(nameBoard);
  const planter = new THREE.Mesh(boxGeo3, stoneMat);
  planter.name = 'planter';
  planter.position.set(-6.2857, 0.5, 12.6);
  root.add(planter);
  const shrub = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.6345, 0), 0.06, 3), leafMat);
  shrub.name = 'shrub';
  shrub.position.set(-7.0857, 1.05, 12.7008);
  root.add(shrub);
  const shrub2 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.6499, 0), 0.06, 4), leafMat);
  shrub2.name = 'shrub';
  shrub2.position.set(-6.2857, 1.05, 12.4647);
  root.add(shrub2);
  const shrub3 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.5833, 0), 0.06, 5), leafMat);
  shrub3.name = 'shrub';
  shrub3.position.set(-5.4857, 1.05, 12.5537);
  root.add(shrub3);
  const planter2 = new THREE.Mesh(boxGeo3, stoneMat);
  planter2.name = 'planter';
  planter2.position.set(6.2857, 0.5, 12.6);
  root.add(planter2);
  const shrub4 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.5151, 0), 0.06, 3), leafMat);
  shrub4.name = 'shrub';
  shrub4.position.set(5.4857, 1.05, 12.7295);
  root.add(shrub4);
  const shrub5 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.6625, 0), 0.06, 4), leafMat);
  shrub5.name = 'shrub';
  shrub5.position.set(6.2857, 1.05, 12.6491);
  root.add(shrub5);
  const shrub6 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.5641, 0), 0.06, 5), leafMat);
  shrub6.name = 'shrub';
  shrub6.position.set(7.0857, 1.05, 12.6691);
  root.add(shrub6);
  const podiumSlab = new THREE.Mesh(new THREE.BoxGeometry(20.4, 0.8, 20.4), frameMat);
  podiumSlab.name = 'podiumSlab';
  podiumSlab.position.set(0, 6, 0);
  root.add(podiumSlab);
  const lowerGlass = new THREE.Mesh(new THREE.BoxGeometry(20, 50.4, 20), glassMat);
  lowerGlass.name = 'lowerGlass';
  lowerGlass.position.set(0, 31.6, 0);
  root.add(lowerGlass);
  const lowerBand = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand.name = 'lowerBand';
  lowerBand.position.set(0, 9.83, 0);
  root.add(lowerBand);
  const lowerBand2 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand2.name = 'lowerBand';
  lowerBand2.position.set(0, 13.43, 0);
  root.add(lowerBand2);
  const lowerBand3 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand3.name = 'lowerBand';
  lowerBand3.position.set(0, 17.03, 0);
  root.add(lowerBand3);
  const lowerBand4 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand4.name = 'lowerBand';
  lowerBand4.position.set(0, 20.63, 0);
  root.add(lowerBand4);
  const lowerBand5 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand5.name = 'lowerBand';
  lowerBand5.position.set(0, 24.23, 0);
  root.add(lowerBand5);
  const lowerBand6 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand6.name = 'lowerBand';
  lowerBand6.position.set(0, 27.83, 0);
  root.add(lowerBand6);
  const lowerBand7 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand7.name = 'lowerBand';
  lowerBand7.position.set(0, 31.43, 0);
  root.add(lowerBand7);
  const lowerBand8 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand8.name = 'lowerBand';
  lowerBand8.position.set(0, 35.03, 0);
  root.add(lowerBand8);
  const lowerBand9 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand9.name = 'lowerBand';
  lowerBand9.position.set(0, 38.63, 0);
  root.add(lowerBand9);
  const lowerBand10 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand10.name = 'lowerBand';
  lowerBand10.position.set(0, 42.23, 0);
  root.add(lowerBand10);
  const lowerBand11 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand11.name = 'lowerBand';
  lowerBand11.position.set(0, 45.83, 0);
  root.add(lowerBand11);
  const lowerBand12 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand12.name = 'lowerBand';
  lowerBand12.position.set(0, 49.43, 0);
  root.add(lowerBand12);
  const lowerBand13 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand13.name = 'lowerBand';
  lowerBand13.position.set(0, 53.03, 0);
  root.add(lowerBand13);
  const lowerBand14 = new THREE.Mesh(boxGeo4, frameMat);
  lowerBand14.name = 'lowerBand';
  lowerBand14.position.set(0, 56.63, 0);
  root.add(lowerBand14);
  const lowerMullion = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion.name = 'lowerMullion';
  lowerMullion.position.set(-7.1429, 31.6, -10.06);
  root.add(lowerMullion);
  const lowerMullion2 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion2.name = 'lowerMullion';
  lowerMullion2.position.set(-7.1429, 31.6, 10.06);
  root.add(lowerMullion2);
  const lowerMullion3 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion3.name = 'lowerMullion';
  lowerMullion3.position.set(-4.2857, 31.6, -10.06);
  root.add(lowerMullion3);
  const lowerMullion4 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion4.name = 'lowerMullion';
  lowerMullion4.position.set(-4.2857, 31.6, 10.06);
  root.add(lowerMullion4);
  const lowerMullion5 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion5.name = 'lowerMullion';
  lowerMullion5.position.set(-1.4286, 31.6, -10.06);
  root.add(lowerMullion5);
  const lowerMullion6 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion6.name = 'lowerMullion';
  lowerMullion6.position.set(-1.4286, 31.6, 10.06);
  root.add(lowerMullion6);
  const lowerMullion7 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion7.name = 'lowerMullion';
  lowerMullion7.position.set(1.4286, 31.6, -10.06);
  root.add(lowerMullion7);
  const lowerMullion8 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion8.name = 'lowerMullion';
  lowerMullion8.position.set(1.4286, 31.6, 10.06);
  root.add(lowerMullion8);
  const lowerMullion9 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion9.name = 'lowerMullion';
  lowerMullion9.position.set(4.2857, 31.6, -10.06);
  root.add(lowerMullion9);
  const lowerMullion10 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion10.name = 'lowerMullion';
  lowerMullion10.position.set(4.2857, 31.6, 10.06);
  root.add(lowerMullion10);
  const lowerMullion11 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion11.name = 'lowerMullion';
  lowerMullion11.position.set(7.1429, 31.6, -10.06);
  root.add(lowerMullion11);
  const lowerMullion12 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion12.name = 'lowerMullion';
  lowerMullion12.position.set(7.1429, 31.6, 10.06);
  root.add(lowerMullion12);
  const lowerPane = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane.name = 'lowerPane';
  lowerPane.position.set(0, 8.03, -10.02);
  root.add(lowerPane);
  const lowerPane2 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane2.name = 'lowerPane';
  lowerPane2.position.set(-5.7143, 15.23, -10.02);
  root.add(lowerPane2);
  const lowerPane3 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane3.name = 'lowerPane';
  lowerPane3.position.set(-2.8571, 22.43, -10.02);
  root.add(lowerPane3);
  const lowerPane4 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane4.name = 'lowerPane';
  lowerPane4.position.set(2.8571, 22.43, -10.02);
  root.add(lowerPane4);
  const lowerPane5 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane5.name = 'lowerPane';
  lowerPane5.position.set(8.5714, 22.43, -10.02);
  root.add(lowerPane5);
  const lowerPane6 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane6.name = 'lowerPane';
  lowerPane6.position.set(2.8571, 51.23, -10.02);
  root.add(lowerPane6);
  const lowerPane7 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane7.name = 'lowerPane';
  lowerPane7.position.set(0, 54.83, -10.02);
  root.add(lowerPane7);
  const lowerPane8 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane8.name = 'lowerPane';
  lowerPane8.position.set(-5.7143, 11.63, 10.02);
  root.add(lowerPane8);
  const lowerPane9 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane9.name = 'lowerPane';
  lowerPane9.position.set(2.8571, 15.23, 10.02);
  root.add(lowerPane9);
  const lowerPane10 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane10.name = 'lowerPane';
  lowerPane10.position.set(5.7143, 15.23, 10.02);
  root.add(lowerPane10);
  const lowerPane11 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane11.name = 'lowerPane';
  lowerPane11.position.set(5.7143, 18.83, 10.02);
  root.add(lowerPane11);
  const lowerPane12 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane12.name = 'lowerPane';
  lowerPane12.position.set(8.5714, 18.83, 10.02);
  root.add(lowerPane12);
  const lowerPane13 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane13.name = 'lowerPane';
  lowerPane13.position.set(-8.5714, 36.83, 10.02);
  root.add(lowerPane13);
  const lowerPane14 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane14.name = 'lowerPane';
  lowerPane14.position.set(-8.5714, 54.83, 10.02);
  root.add(lowerPane14);
  const lowerMullion13 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion13.name = 'lowerMullion';
  lowerMullion13.position.set(-10.06, 31.6, -7.1429);
  root.add(lowerMullion13);
  const lowerMullion14 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion14.name = 'lowerMullion';
  lowerMullion14.position.set(10.06, 31.6, -7.1429);
  root.add(lowerMullion14);
  const lowerMullion15 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion15.name = 'lowerMullion';
  lowerMullion15.position.set(-10.06, 31.6, -4.2857);
  root.add(lowerMullion15);
  const lowerMullion16 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion16.name = 'lowerMullion';
  lowerMullion16.position.set(10.06, 31.6, -4.2857);
  root.add(lowerMullion16);
  const lowerMullion17 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion17.name = 'lowerMullion';
  lowerMullion17.position.set(-10.06, 31.6, -1.4286);
  root.add(lowerMullion17);
  const lowerMullion18 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion18.name = 'lowerMullion';
  lowerMullion18.position.set(10.06, 31.6, -1.4286);
  root.add(lowerMullion18);
  const lowerMullion19 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion19.name = 'lowerMullion';
  lowerMullion19.position.set(-10.06, 31.6, 1.4286);
  root.add(lowerMullion19);
  const lowerMullion20 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion20.name = 'lowerMullion';
  lowerMullion20.position.set(10.06, 31.6, 1.4286);
  root.add(lowerMullion20);
  const lowerMullion21 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion21.name = 'lowerMullion';
  lowerMullion21.position.set(-10.06, 31.6, 4.2857);
  root.add(lowerMullion21);
  const lowerMullion22 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion22.name = 'lowerMullion';
  lowerMullion22.position.set(10.06, 31.6, 4.2857);
  root.add(lowerMullion22);
  const lowerMullion23 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion23.name = 'lowerMullion';
  lowerMullion23.position.set(-10.06, 31.6, 7.1429);
  root.add(lowerMullion23);
  const lowerMullion24 = new THREE.Mesh(boxGeo5, frameMat);
  lowerMullion24.name = 'lowerMullion';
  lowerMullion24.position.set(10.06, 31.6, 7.1429);
  root.add(lowerMullion24);
  const lowerPane15 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane15.name = 'lowerPane';
  lowerPane15.position.set(-10.02, 11.63, 5.7143);
  lowerPane15.rotation.set(0, deg(90), 0);
  root.add(lowerPane15);
  const lowerPane16 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane16.name = 'lowerPane';
  lowerPane16.position.set(-10.02, 18.83, 0);
  lowerPane16.rotation.set(0, deg(90), 0);
  root.add(lowerPane16);
  const lowerPane17 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane17.name = 'lowerPane';
  lowerPane17.position.set(-10.02, 18.83, 2.8571);
  lowerPane17.rotation.set(0, deg(90), 0);
  root.add(lowerPane17);
  const lowerPane18 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane18.name = 'lowerPane';
  lowerPane18.position.set(-10.02, 22.43, -8.5714);
  lowerPane18.rotation.set(0, deg(90), 0);
  root.add(lowerPane18);
  const lowerPane19 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane19.name = 'lowerPane';
  lowerPane19.position.set(-10.02, 26.03, -5.7143);
  lowerPane19.rotation.set(0, deg(90), 0);
  root.add(lowerPane19);
  const lowerPane20 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane20.name = 'lowerPane';
  lowerPane20.position.set(-10.02, 29.63, -8.5714);
  lowerPane20.rotation.set(0, deg(90), 0);
  root.add(lowerPane20);
  const lowerPane21 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane21.name = 'lowerPane';
  lowerPane21.position.set(-10.02, 29.63, -5.7143);
  lowerPane21.rotation.set(0, deg(90), 0);
  root.add(lowerPane21);
  const lowerPane22 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane22.name = 'lowerPane';
  lowerPane22.position.set(-10.02, 36.83, 2.8571);
  lowerPane22.rotation.set(0, deg(90), 0);
  root.add(lowerPane22);
  const lowerPane23 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane23.name = 'lowerPane';
  lowerPane23.position.set(-10.02, 36.83, 8.5714);
  lowerPane23.rotation.set(0, deg(90), 0);
  root.add(lowerPane23);
  const lowerPane24 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane24.name = 'lowerPane';
  lowerPane24.position.set(-10.02, 44.03, -5.7143);
  lowerPane24.rotation.set(0, deg(90), 0);
  root.add(lowerPane24);
  const lowerPane25 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane25.name = 'lowerPane';
  lowerPane25.position.set(-10.02, 47.63, 2.8571);
  lowerPane25.rotation.set(0, deg(90), 0);
  root.add(lowerPane25);
  const lowerPane26 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane26.name = 'lowerPane';
  lowerPane26.position.set(10.02, 8.03, -5.7143);
  lowerPane26.rotation.set(0, deg(90), 0);
  root.add(lowerPane26);
  const lowerPane27 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane27.name = 'lowerPane';
  lowerPane27.position.set(10.02, 18.83, 0);
  lowerPane27.rotation.set(0, deg(90), 0);
  root.add(lowerPane27);
  const lowerPane28 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane28.name = 'lowerPane';
  lowerPane28.position.set(10.02, 36.83, 0);
  lowerPane28.rotation.set(0, deg(90), 0);
  root.add(lowerPane28);
  const lowerPane29 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane29.name = 'lowerPane';
  lowerPane29.position.set(10.02, 44.03, -5.7143);
  lowerPane29.rotation.set(0, deg(90), 0);
  root.add(lowerPane29);
  const lowerPane30 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane30.name = 'lowerPane';
  lowerPane30.position.set(10.02, 44.03, 5.7143);
  lowerPane30.rotation.set(0, deg(90), 0);
  root.add(lowerPane30);
  const lowerPane31 = new THREE.Mesh(boxGeo6, glassAltMat);
  lowerPane31.name = 'lowerPane';
  lowerPane31.position.set(10.02, 51.23, -8.5714);
  lowerPane31.rotation.set(0, deg(90), 0);
  root.add(lowerPane31);
  const lowerCorner = new THREE.Mesh(boxGeo7, frameMat);
  lowerCorner.name = 'lowerCorner';
  lowerCorner.position.set(-9.85, 31.6, -9.85);
  root.add(lowerCorner);
  const lowerCorner2 = new THREE.Mesh(boxGeo7, frameMat);
  lowerCorner2.name = 'lowerCorner';
  lowerCorner2.position.set(-9.85, 31.6, 9.85);
  root.add(lowerCorner2);
  const lowerCorner3 = new THREE.Mesh(boxGeo7, frameMat);
  lowerCorner3.name = 'lowerCorner';
  lowerCorner3.position.set(9.85, 31.6, -9.85);
  root.add(lowerCorner3);
  const lowerCorner4 = new THREE.Mesh(boxGeo7, frameMat);
  lowerCorner4.name = 'lowerCorner';
  lowerCorner4.position.set(9.85, 31.6, 9.85);
  root.add(lowerCorner4);
  const setbackLedge = new THREE.Mesh(new THREE.BoxGeometry(20.3, 0.5, 20.3), frameMat);
  setbackLedge.name = 'setbackLedge';
  setbackLedge.position.set(0, 57.05, 0);
  root.add(setbackLedge);
  const terrace = new THREE.Mesh(new THREE.BoxGeometry(19.6, 0.06, 19.6), roofMat);
  terrace.name = 'terrace';
  terrace.position.set(0, 57.33, 0);
  root.add(terrace);
  const upperGlass = new THREE.Mesh(new THREE.BoxGeometry(15.6, 32.4, 15.6), glassMat);
  upperGlass.name = 'upperGlass';
  upperGlass.position.set(0, 73.5, 0);
  root.add(upperGlass);
  const upperBand = new THREE.Mesh(boxGeo8, frameMat);
  upperBand.name = 'upperBand';
  upperBand.position.set(0, 60.73, 0);
  root.add(upperBand);
  const upperBand2 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand2.name = 'upperBand';
  upperBand2.position.set(0, 64.33, 0);
  root.add(upperBand2);
  const upperBand3 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand3.name = 'upperBand';
  upperBand3.position.set(0, 67.93, 0);
  root.add(upperBand3);
  const upperBand4 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand4.name = 'upperBand';
  upperBand4.position.set(0, 71.53, 0);
  root.add(upperBand4);
  const upperBand5 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand5.name = 'upperBand';
  upperBand5.position.set(0, 75.13, 0);
  root.add(upperBand5);
  const upperBand6 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand6.name = 'upperBand';
  upperBand6.position.set(0, 78.73, 0);
  root.add(upperBand6);
  const upperBand7 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand7.name = 'upperBand';
  upperBand7.position.set(0, 82.33, 0);
  root.add(upperBand7);
  const upperBand8 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand8.name = 'upperBand';
  upperBand8.position.set(0, 85.93, 0);
  root.add(upperBand8);
  const upperBand9 = new THREE.Mesh(boxGeo8, frameMat);
  upperBand9.name = 'upperBand';
  upperBand9.position.set(0, 89.53, 0);
  root.add(upperBand9);
  const upperMullion = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion.name = 'upperMullion';
  upperMullion.position.set(-4.68, 73.5, -7.86);
  root.add(upperMullion);
  const upperMullion2 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion2.name = 'upperMullion';
  upperMullion2.position.set(-4.68, 73.5, 7.86);
  root.add(upperMullion2);
  const upperMullion3 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion3.name = 'upperMullion';
  upperMullion3.position.set(-1.56, 73.5, -7.86);
  root.add(upperMullion3);
  const upperMullion4 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion4.name = 'upperMullion';
  upperMullion4.position.set(-1.56, 73.5, 7.86);
  root.add(upperMullion4);
  const upperMullion5 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion5.name = 'upperMullion';
  upperMullion5.position.set(1.56, 73.5, -7.86);
  root.add(upperMullion5);
  const upperMullion6 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion6.name = 'upperMullion';
  upperMullion6.position.set(1.56, 73.5, 7.86);
  root.add(upperMullion6);
  const upperMullion7 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion7.name = 'upperMullion';
  upperMullion7.position.set(4.68, 73.5, -7.86);
  root.add(upperMullion7);
  const upperMullion8 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion8.name = 'upperMullion';
  upperMullion8.position.set(4.68, 73.5, 7.86);
  root.add(upperMullion8);
  const upperPane = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane.name = 'upperPane';
  upperPane.position.set(3.12, 76.93, -7.82);
  root.add(upperPane);
  const upperPane2 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane2.name = 'upperPane';
  upperPane2.position.set(6.24, 80.53, -7.82);
  root.add(upperPane2);
  const upperPane3 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane3.name = 'upperPane';
  upperPane3.position.set(-6.24, 87.73, -7.82);
  root.add(upperPane3);
  const upperPane4 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane4.name = 'upperPane';
  upperPane4.position.set(0, 66.13, 7.82);
  root.add(upperPane4);
  const upperPane5 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane5.name = 'upperPane';
  upperPane5.position.set(3.12, 87.73, 7.82);
  root.add(upperPane5);
  const upperMullion9 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion9.name = 'upperMullion';
  upperMullion9.position.set(-7.86, 73.5, -4.68);
  root.add(upperMullion9);
  const upperMullion10 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion10.name = 'upperMullion';
  upperMullion10.position.set(7.86, 73.5, -4.68);
  root.add(upperMullion10);
  const upperMullion11 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion11.name = 'upperMullion';
  upperMullion11.position.set(-7.86, 73.5, -1.56);
  root.add(upperMullion11);
  const upperMullion12 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion12.name = 'upperMullion';
  upperMullion12.position.set(7.86, 73.5, -1.56);
  root.add(upperMullion12);
  const upperMullion13 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion13.name = 'upperMullion';
  upperMullion13.position.set(-7.86, 73.5, 1.56);
  root.add(upperMullion13);
  const upperMullion14 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion14.name = 'upperMullion';
  upperMullion14.position.set(7.86, 73.5, 1.56);
  root.add(upperMullion14);
  const upperMullion15 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion15.name = 'upperMullion';
  upperMullion15.position.set(-7.86, 73.5, 4.68);
  root.add(upperMullion15);
  const upperMullion16 = new THREE.Mesh(boxGeo9, frameMat);
  upperMullion16.name = 'upperMullion';
  upperMullion16.position.set(7.86, 73.5, 4.68);
  root.add(upperMullion16);
  const upperPane6 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane6.name = 'upperPane';
  upperPane6.position.set(-7.82, 62.53, 0);
  upperPane6.rotation.set(0, deg(90), 0);
  root.add(upperPane6);
  const upperPane7 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane7.name = 'upperPane';
  upperPane7.position.set(-7.82, 69.73, 6.24);
  upperPane7.rotation.set(0, deg(90), 0);
  root.add(upperPane7);
  const upperPane8 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane8.name = 'upperPane';
  upperPane8.position.set(-7.82, 73.33, -3.12);
  upperPane8.rotation.set(0, deg(90), 0);
  root.add(upperPane8);
  const upperPane9 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane9.name = 'upperPane';
  upperPane9.position.set(-7.82, 80.53, 0);
  upperPane9.rotation.set(0, deg(90), 0);
  root.add(upperPane9);
  const upperPane10 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane10.name = 'upperPane';
  upperPane10.position.set(7.82, 58.93, 6.24);
  upperPane10.rotation.set(0, deg(90), 0);
  root.add(upperPane10);
  const upperPane11 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane11.name = 'upperPane';
  upperPane11.position.set(7.82, 69.73, 0);
  upperPane11.rotation.set(0, deg(90), 0);
  root.add(upperPane11);
  const upperPane12 = new THREE.Mesh(boxGeo10, glassAltMat);
  upperPane12.name = 'upperPane';
  upperPane12.position.set(7.82, 76.93, 3.12);
  upperPane12.rotation.set(0, deg(90), 0);
  root.add(upperPane12);
  const upperCorner = new THREE.Mesh(boxGeo11, frameMat);
  upperCorner.name = 'upperCorner';
  upperCorner.position.set(-7.65, 73.5, -7.65);
  root.add(upperCorner);
  const upperCorner2 = new THREE.Mesh(boxGeo11, frameMat);
  upperCorner2.name = 'upperCorner';
  upperCorner2.position.set(-7.65, 73.5, 7.65);
  root.add(upperCorner2);
  const upperCorner3 = new THREE.Mesh(boxGeo11, frameMat);
  upperCorner3.name = 'upperCorner';
  upperCorner3.position.set(7.65, 73.5, -7.65);
  root.add(upperCorner3);
  const upperCorner4 = new THREE.Mesh(boxGeo11, frameMat);
  upperCorner4.name = 'upperCorner';
  upperCorner4.position.set(7.65, 73.5, 7.65);
  root.add(upperCorner4);
  const roofSlab = new THREE.Mesh(new THREE.BoxGeometry(16, 0.5, 16), frameMat);
  roofSlab.name = 'roofSlab';
  roofSlab.position.set(0, 89.95, 0);
  root.add(roofSlab);
  const roofDeck = new THREE.Mesh(new THREE.BoxGeometry(15.4, 0.05, 15.4), roofMat);
  roofDeck.name = 'roofDeck';
  roofDeck.position.set(0, 90.225, 0);
  root.add(roofDeck);
  const parapet = new THREE.Mesh(boxGeo12, frameMat);
  parapet.name = 'parapet';
  parapet.position.set(0, 90.75, -7.875);
  root.add(parapet);
  const parapet2 = new THREE.Mesh(boxGeo13, frameMat);
  parapet2.name = 'parapet';
  parapet2.position.set(-7.875, 90.75, 0);
  root.add(parapet2);
  const parapet3 = new THREE.Mesh(boxGeo12, frameMat);
  parapet3.name = 'parapet';
  parapet3.position.set(0, 90.75, 7.875);
  root.add(parapet3);
  const parapet4 = new THREE.Mesh(boxGeo13, frameMat);
  parapet4.name = 'parapet';
  parapet4.position.set(7.875, 90.75, 0);
  root.add(parapet4);
  const acUnit = new THREE.Group();
  acUnit.name = 'acUnit';
  acUnit.position.set(-4.992, 90.2, -4.992);
  root.add(acUnit);
  const acBody = new THREE.Mesh(boxGeo14, metalMat);
  acBody.name = 'acBody';
  acBody.position.set(0, 0.65, 0);
  acUnit.add(acBody);
  const acFan = new THREE.Mesh(cylinderGeo2, darkMat);
  acFan.name = 'acFan';
  acFan.position.set(-0.6, 1.34, 0);
  acUnit.add(acFan);
  const acGrille = new THREE.Mesh(boxGeo15, metalMat);
  acGrille.name = 'acGrille';
  acGrille.position.set(-0.6, 1.405, 0);
  acUnit.add(acGrille);
  const acFan2 = new THREE.Mesh(cylinderGeo2, darkMat);
  acFan2.name = 'acFan';
  acFan2.position.set(0.6, 1.34, 0);
  acUnit.add(acFan2);
  const acGrille2 = new THREE.Mesh(boxGeo15, metalMat);
  acGrille2.name = 'acGrille';
  acGrille2.position.set(0.6, 1.405, 0);
  acUnit.add(acGrille2);
  const acUnit2 = new THREE.Group();
  acUnit2.name = 'acUnit';
  acUnit2.position.set(4.992, 90.2, 4.68);
  acUnit2.rotation.set(0, deg(90), 0);
  root.add(acUnit2);
  const acBody2 = new THREE.Mesh(boxGeo14, metalMat);
  acBody2.name = 'acBody';
  acBody2.position.set(0, 0.65, 0);
  acUnit2.add(acBody2);
  const acFan3 = new THREE.Mesh(cylinderGeo2, darkMat);
  acFan3.name = 'acFan';
  acFan3.position.set(-0.6, 1.34, 0);
  acUnit2.add(acFan3);
  const acGrille3 = new THREE.Mesh(boxGeo15, metalMat);
  acGrille3.name = 'acGrille';
  acGrille3.position.set(-0.6, 1.405, 0);
  acUnit2.add(acGrille3);
  const acFan4 = new THREE.Mesh(cylinderGeo2, darkMat);
  acFan4.name = 'acFan';
  acFan4.position.set(0.6, 1.34, 0);
  acUnit2.add(acFan4);
  const acGrille4 = new THREE.Mesh(boxGeo15, metalMat);
  acGrille4.name = 'acGrille';
  acGrille4.position.set(0.6, 1.405, 0);
  acUnit2.add(acGrille4);
  const crownBlock = new THREE.Mesh(new THREE.BoxGeometry(8.424, 4.2, 8.424), glassMat);
  crownBlock.name = 'crownBlock';
  crownBlock.position.set(0, 92.3, 0);
  root.add(crownBlock);
  const crownBand = new THREE.Mesh(new THREE.BoxGeometry(8.724, 0.4, 8.724), frameMat);
  crownBand.name = 'crownBand';
  crownBand.position.set(0, 94.6, 0);
  root.add(crownBand);
  const spireBase = new THREE.Mesh(new THREE.CylinderGeometry(0.6, 6.1688, 7, 4, 1, false, Math.PI / 4), frameMat);
  spireBase.name = 'spireBase';
  spireBase.position.set(0, 98.3, 0);
  root.add(spireBase);
  const spire = new THREE.Mesh(new THREE.CylinderGeometry(0.12, 0.6, 16, 6), metalMat);
  spire.name = 'spire';
  spire.position.set(0, 109.6, 0);
  root.add(spire);
  const spireCollar = new THREE.Mesh(new THREE.CylinderGeometry(0.62, 0.62, 0.5, 6), frameMat);
  spireCollar.name = 'spireCollar';
  spireCollar.position.set(0, 103.95, 0);
  root.add(spireCollar);
  const spireCollar2 = new THREE.Mesh(new THREE.CylinderGeometry(0.42, 0.42, 0.35, 6), frameMat);
  spireCollar2.name = 'spireCollar';
  spireCollar2.position.set(0, 108.875, 0);
  root.add(spireCollar2);
  const beacon = new THREE.Mesh(new THREE.SphereGeometry(0.32, 8, 6), beaconMat);
  beacon.name = 'beacon';
  beacon.position.set(0, 117.8, 0);
  root.add(beacon);

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

export default createSkyscraper;

Avaliações e comentários

—
Nenhuma avaliação ainda — seja o primeiro.
5
0
4
0
3
0
2
0
1
0

Entre para avaliar e comentar.

0 comentário

Nenhum comentário ainda. Conte como você usou este modelo ou o que poderia melhorar.

Modelos relacionados

Mesma categoria ou tags parecidas