2,7 тыс. треуг.29,3 × 118,1 × 29,3 m
Использовать в коде
Ремикс в редактореskyscraper.js · 894 строки
Самодостаточный ES-модуль — зависит только от three. Вызовите фабрику и добавьте группу в сцену.
/**
* 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;
Оценки и комментарии
0 комментариев
Комментариев пока нет. Расскажите, как вы использовали эту модель или что можно улучшить.
Похожие модели
Та же категория или похожие теги









