Codels
2,6 mil tris9,20 × 20,9 × 9,20 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.
/**
 * Water Tower — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 2,588 · Size (W × H × D): 9.20 × 20.94 × 9.20 m
 *
 * Usage:
 *   import { createWaterTower } from './water-tower.js';
 *   
 *   const model = createWaterTower();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

// Revolve a 2D profile [[radius, y], ...] around the Y axis.
function lathe(points, segments, phiStart = 0, phiLength = Math.PI * 2) {
  return new THREE.LatheGeometry(points.map(([x, y]) => new THREE.Vector2(x, y)), segments, phiStart, phiLength);
}

export function createWaterTower() {
  const root = new THREE.Group();
  root.name = 'WaterTower';

  // Materials
  const tankMat = new THREE.MeshStandardMaterial({ name: 'tank', color: 0x8fb3c9, roughness: 0.55, metalness: 0.25, flatShading: true });
  const stripeMat = new THREE.MeshStandardMaterial({ name: 'stripe', color: 0xf1efe8, roughness: 0.6, flatShading: true });
  const steelMat = new THREE.MeshStandardMaterial({ name: 'steel', color: 0x7d858d, roughness: 0.5, metalness: 0.35, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x2e3135, roughness: 0.7, metalness: 0.2, flatShading: true });
  const concreteMat = new THREE.MeshStandardMaterial({ name: 'concrete', color: 0xb8b3aa, roughness: 0.95, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(1.1, 0.45, 1.1);
  const cylinderGeo = new THREE.CylinderGeometry(0.17, 0.2, 14.6036, 8);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.09, 0.09, 6.0093, 6, 1, true);
  const cylinderGeo3 = new THREE.CylinderGeometry(0.035, 0.035, 7.3579, 4, 1, true);
  const cylinderGeo4 = new THREE.CylinderGeometry(0.09, 0.09, 5.5375, 6, 1, true);
  const cylinderGeo5 = new THREE.CylinderGeometry(0.035, 0.035, 6.9619, 4, 1, true);
  const cylinderGeo6 = new THREE.CylinderGeometry(0.09, 0.09, 5.0657, 6, 1, true);
  const cylinderGeo7 = new THREE.CylinderGeometry(0.035, 0.035, 6.5759, 4, 1, true);
  const cylinderGeo8 = new THREE.CylinderGeometry(0.035, 0.035, 1.05, 4);
  const torusGeo = new THREE.TorusGeometry(4.55, 0.035, 3, 24);
  const boxGeo2 = new THREE.BoxGeometry(0.06, 15.1, 0.06);
  const boxGeo3 = new THREE.BoxGeometry(0.44, 0.04, 0.04);
  const boxGeo4 = new THREE.BoxGeometry(0.06, 4.45, 0.06);
  const torusGeo2 = new THREE.TorusGeometry(0.42, 0.025, 3, 8, Math.PI);

  // Parts
  const footing = new THREE.Mesh(boxGeo, concreteMat);
  footing.name = 'footing';
  footing.position.set(3.28, 0.225, 3.28);
  footing.rotation.set(0, deg(45), 0);
  root.add(footing);
  const leg = new THREE.Mesh(cylinderGeo, steelMat);
  leg.name = 'leg';
  leg.position.set(2.8107, 7.725, 2.8107);
  leg.rotation.set(deg(-3.47), deg(-0.1051), deg(3.47));
  root.add(leg);
  const footing2 = new THREE.Mesh(boxGeo, concreteMat);
  footing2.name = 'footing';
  footing2.position.set(3.28, 0.225, -3.28);
  footing2.rotation.set(0, deg(135), 0);
  root.add(footing2);
  const leg2 = new THREE.Mesh(cylinderGeo, steelMat);
  leg2.name = 'leg';
  leg2.position.set(2.8107, 7.725, -2.8107);
  leg2.rotation.set(deg(3.47), deg(0.1051), deg(3.47));
  root.add(leg2);
  const footing3 = new THREE.Mesh(boxGeo, concreteMat);
  footing3.name = 'footing';
  footing3.position.set(-3.28, 0.225, -3.28);
  footing3.rotation.set(0, deg(225), 0);
  root.add(footing3);
  const leg3 = new THREE.Mesh(cylinderGeo, steelMat);
  leg3.name = 'leg';
  leg3.position.set(-2.8107, 7.725, -2.8107);
  leg3.rotation.set(deg(3.47), deg(-0.1051), deg(-3.47));
  root.add(leg3);
  const footing4 = new THREE.Mesh(boxGeo, concreteMat);
  footing4.name = 'footing';
  footing4.position.set(-3.28, 0.225, 3.28);
  footing4.rotation.set(0, deg(315), 0);
  root.add(footing4);
  const leg4 = new THREE.Mesh(cylinderGeo, steelMat);
  leg4.name = 'leg';
  leg4.position.set(-2.8107, 7.725, 2.8107);
  leg4.rotation.set(deg(-3.47), deg(0.1051), deg(-3.47));
  root.add(leg4);
  const strut = new THREE.Mesh(cylinderGeo2, steelMat);
  strut.name = 'strut';
  strut.position.set(3.0046, 4.5333, 0);
  strut.rotation.set(deg(-90), 0, 0);
  root.add(strut);
  const tieRod = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod.name = 'tieRod';
  tieRod.position.set(3.1226, 2.5917, 0.118);
  tieRod.rotation.set(deg(-58.0934), deg(-1.0206), deg(1.8376));
  root.add(tieRod);
  const tieRod2 = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod2.name = 'tieRod';
  tieRod2.position.set(3.1226, 2.5917, -0.118);
  tieRod2.rotation.set(deg(58.0934), deg(1.0206), deg(1.8376));
  root.add(tieRod2);
  const strut2 = new THREE.Mesh(cylinderGeo2, steelMat);
  strut2.name = 'strut';
  strut2.position.set(0, 4.5333, -3.0046);
  strut2.rotation.set(0, 0, deg(90));
  root.add(strut2);
  const tieRod3 = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod3.name = 'tieRod';
  tieRod3.position.set(0.118, 2.5917, -3.1226);
  tieRod3.rotation.set(deg(1.8376), deg(1.0206), deg(58.0934));
  root.add(tieRod3);
  const tieRod4 = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod4.name = 'tieRod';
  tieRod4.position.set(-0.118, 2.5917, -3.1226);
  tieRod4.rotation.set(deg(1.8376), deg(-1.0206), deg(-58.0934));
  root.add(tieRod4);
  const strut3 = new THREE.Mesh(cylinderGeo2, steelMat);
  strut3.name = 'strut';
  strut3.position.set(-3.0046, 4.5333, 0);
  strut3.rotation.set(deg(90), 0, 0);
  root.add(strut3);
  const tieRod5 = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod5.name = 'tieRod';
  tieRod5.position.set(-3.1226, 2.5917, -0.118);
  tieRod5.rotation.set(deg(58.0934), deg(-1.0206), deg(-1.8376));
  root.add(tieRod5);
  const tieRod6 = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod6.name = 'tieRod';
  tieRod6.position.set(-3.1226, 2.5917, 0.118);
  tieRod6.rotation.set(deg(-58.0934), deg(1.0206), deg(-1.8376));
  root.add(tieRod6);
  const strut4 = new THREE.Mesh(cylinderGeo2, steelMat);
  strut4.name = 'strut';
  strut4.position.set(0, 4.5333, 3.0046);
  strut4.rotation.set(0, 0, deg(-90));
  root.add(strut4);
  const tieRod7 = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod7.name = 'tieRod';
  tieRod7.position.set(-0.118, 2.5917, 3.1226);
  tieRod7.rotation.set(deg(-1.8376), deg(1.0206), deg(-58.0934));
  root.add(tieRod7);
  const tieRod8 = new THREE.Mesh(cylinderGeo3, darkMat);
  tieRod8.name = 'tieRod';
  tieRod8.position.set(0.118, 2.5917, 3.1226);
  tieRod8.rotation.set(deg(-1.8376), deg(-1.0206), deg(58.0934));
  root.add(tieRod8);
  const strut5 = new THREE.Mesh(cylinderGeo4, steelMat);
  strut5.name = 'strut';
  strut5.position.set(2.7687, 8.4167, 0);
  strut5.rotation.set(deg(-90), 0, 0);
  root.add(strut5);
  const tieRod9 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod9.name = 'tieRod';
  tieRod9.position.set(2.8867, 6.475, 0.118);
  tieRod9.rotation.set(deg(-56.039), deg(-1.0336), deg(1.9422));
  root.add(tieRod9);
  const tieRod10 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod10.name = 'tieRod';
  tieRod10.position.set(2.8867, 6.475, -0.118);
  tieRod10.rotation.set(deg(56.039), deg(1.0336), deg(1.9422));
  root.add(tieRod10);
  const strut6 = new THREE.Mesh(cylinderGeo4, steelMat);
  strut6.name = 'strut';
  strut6.position.set(0, 8.4167, -2.7687);
  strut6.rotation.set(0, 0, deg(90));
  root.add(strut6);
  const tieRod11 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod11.name = 'tieRod';
  tieRod11.position.set(0.118, 6.475, -2.8867);
  tieRod11.rotation.set(deg(1.9422), deg(1.0336), deg(56.039));
  root.add(tieRod11);
  const tieRod12 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod12.name = 'tieRod';
  tieRod12.position.set(-0.118, 6.475, -2.8867);
  tieRod12.rotation.set(deg(1.9422), deg(-1.0336), deg(-56.039));
  root.add(tieRod12);
  const strut7 = new THREE.Mesh(cylinderGeo4, steelMat);
  strut7.name = 'strut';
  strut7.position.set(-2.7687, 8.4167, 0);
  strut7.rotation.set(deg(90), 0, 0);
  root.add(strut7);
  const tieRod13 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod13.name = 'tieRod';
  tieRod13.position.set(-2.8867, 6.475, -0.118);
  tieRod13.rotation.set(deg(56.039), deg(-1.0336), deg(-1.9422));
  root.add(tieRod13);
  const tieRod14 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod14.name = 'tieRod';
  tieRod14.position.set(-2.8867, 6.475, 0.118);
  tieRod14.rotation.set(deg(-56.039), deg(1.0336), deg(-1.9422));
  root.add(tieRod14);
  const strut8 = new THREE.Mesh(cylinderGeo4, steelMat);
  strut8.name = 'strut';
  strut8.position.set(0, 8.4167, 2.7687);
  strut8.rotation.set(0, 0, deg(-90));
  root.add(strut8);
  const tieRod15 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod15.name = 'tieRod';
  tieRod15.position.set(-0.118, 6.475, 2.8867);
  tieRod15.rotation.set(deg(-1.9422), deg(1.0336), deg(-56.039));
  root.add(tieRod15);
  const tieRod16 = new THREE.Mesh(cylinderGeo5, darkMat);
  tieRod16.name = 'tieRod';
  tieRod16.position.set(0.118, 6.475, 2.8867);
  tieRod16.rotation.set(deg(-1.9422), deg(-1.0336), deg(56.039));
  root.add(tieRod16);
  const strut9 = new THREE.Mesh(cylinderGeo6, steelMat);
  strut9.name = 'strut';
  strut9.position.set(2.5328, 12.3, 0);
  strut9.rotation.set(deg(-90), 0, 0);
  root.add(strut9);
  const tieRod17 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod17.name = 'tieRod';
  tieRod17.position.set(2.6508, 10.3583, 0.118);
  tieRod17.rotation.set(deg(-53.7402), deg(-1.0419), deg(2.0562));
  root.add(tieRod17);
  const tieRod18 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod18.name = 'tieRod';
  tieRod18.position.set(2.6508, 10.3583, -0.118);
  tieRod18.rotation.set(deg(53.7402), deg(1.0419), deg(2.0562));
  root.add(tieRod18);
  const strut10 = new THREE.Mesh(cylinderGeo6, steelMat);
  strut10.name = 'strut';
  strut10.position.set(0, 12.3, -2.5328);
  strut10.rotation.set(0, 0, deg(90));
  root.add(strut10);
  const tieRod19 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod19.name = 'tieRod';
  tieRod19.position.set(0.118, 10.3583, -2.6508);
  tieRod19.rotation.set(deg(2.0562), deg(1.0419), deg(53.7402));
  root.add(tieRod19);
  const tieRod20 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod20.name = 'tieRod';
  tieRod20.position.set(-0.118, 10.3583, -2.6508);
  tieRod20.rotation.set(deg(2.0562), deg(-1.0419), deg(-53.7402));
  root.add(tieRod20);
  const strut11 = new THREE.Mesh(cylinderGeo6, steelMat);
  strut11.name = 'strut';
  strut11.position.set(-2.5328, 12.3, 0);
  strut11.rotation.set(deg(90), 0, 0);
  root.add(strut11);
  const tieRod21 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod21.name = 'tieRod';
  tieRod21.position.set(-2.6508, 10.3583, -0.118);
  tieRod21.rotation.set(deg(53.7402), deg(-1.0419), deg(-2.0562));
  root.add(tieRod21);
  const tieRod22 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod22.name = 'tieRod';
  tieRod22.position.set(-2.6508, 10.3583, 0.118);
  tieRod22.rotation.set(deg(-53.7402), deg(1.0419), deg(-2.0562));
  root.add(tieRod22);
  const strut12 = new THREE.Mesh(cylinderGeo6, steelMat);
  strut12.name = 'strut';
  strut12.position.set(0, 12.3, 2.5328);
  strut12.rotation.set(0, 0, deg(-90));
  root.add(strut12);
  const tieRod23 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod23.name = 'tieRod';
  tieRod23.position.set(-0.118, 10.3583, 2.6508);
  tieRod23.rotation.set(deg(-2.0562), deg(1.0419), deg(-53.7402));
  root.add(tieRod23);
  const tieRod24 = new THREE.Mesh(cylinderGeo7, darkMat);
  tieRod24.name = 'tieRod';
  tieRod24.position.set(0.118, 10.3583, 2.6508);
  tieRod24.rotation.set(deg(-2.0562), deg(-1.0419), deg(53.7402));
  root.add(tieRod24);
  const riser = new THREE.Mesh(new THREE.CylinderGeometry(0.45, 0.45, 12.1, 10), tankMat);
  riser.name = 'riser';
  riser.position.set(0, 6.05, 0);
  root.add(riser);
  const riserBase = new THREE.Mesh(new THREE.CylinderGeometry(0.65, 0.65, 0.5, 10), concreteMat);
  riserBase.name = 'riserBase';
  riserBase.position.set(0, 0.25, 0);
  root.add(riserBase);
  const catwalk = new THREE.Mesh(lathe([[3.4, 0], [4.6, 0], [4.6, 0.12], [3.4, 0.12], [3.4, 0]], 24), steelMat);
  catwalk.name = 'catwalk';
  catwalk.position.set(0, 14, 0);
  root.add(catwalk);
  const railPost = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost.name = 'railPost';
  railPost.position.set(0.8877, 14.645, 4.4626);
  root.add(railPost);
  const railPost2 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost2.name = 'railPost';
  railPost2.position.set(2.5278, 14.645, 3.7832);
  root.add(railPost2);
  const railPost3 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost3.name = 'railPost';
  railPost3.position.set(3.7832, 14.645, 2.5278);
  root.add(railPost3);
  const railPost4 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost4.name = 'railPost';
  railPost4.position.set(4.4626, 14.645, 0.8877);
  root.add(railPost4);
  const railPost5 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost5.name = 'railPost';
  railPost5.position.set(4.4626, 14.645, -0.8877);
  root.add(railPost5);
  const railPost6 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost6.name = 'railPost';
  railPost6.position.set(3.7832, 14.645, -2.5278);
  root.add(railPost6);
  const railPost7 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost7.name = 'railPost';
  railPost7.position.set(2.5278, 14.645, -3.7832);
  root.add(railPost7);
  const railPost8 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost8.name = 'railPost';
  railPost8.position.set(0.8877, 14.645, -4.4626);
  root.add(railPost8);
  const railPost9 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost9.name = 'railPost';
  railPost9.position.set(-0.8877, 14.645, -4.4626);
  root.add(railPost9);
  const railPost10 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost10.name = 'railPost';
  railPost10.position.set(-2.5278, 14.645, -3.7832);
  root.add(railPost10);
  const railPost11 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost11.name = 'railPost';
  railPost11.position.set(-3.7832, 14.645, -2.5278);
  root.add(railPost11);
  const railPost12 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost12.name = 'railPost';
  railPost12.position.set(-4.4626, 14.645, -0.8877);
  root.add(railPost12);
  const railPost13 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost13.name = 'railPost';
  railPost13.position.set(-4.4626, 14.645, 0.8877);
  root.add(railPost13);
  const railPost14 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost14.name = 'railPost';
  railPost14.position.set(-3.7832, 14.645, 2.5278);
  root.add(railPost14);
  const railPost15 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost15.name = 'railPost';
  railPost15.position.set(-2.5278, 14.645, 3.7832);
  root.add(railPost15);
  const railPost16 = new THREE.Mesh(cylinderGeo8, darkMat);
  railPost16.name = 'railPost';
  railPost16.position.set(-0.8877, 14.645, 4.4626);
  root.add(railPost16);
  const railRing = new THREE.Mesh(torusGeo, darkMat);
  railRing.name = 'railRing';
  railRing.position.set(0, 14.74, 0);
  railRing.rotation.set(deg(90), 0, 0);
  root.add(railRing);
  const railRing2 = new THREE.Mesh(torusGeo, darkMat);
  railRing2.name = 'railRing';
  railRing2.position.set(0, 15.27, 0);
  railRing2.rotation.set(deg(90), 0, 0);
  root.add(railRing2);
  const tankBowl = new THREE.Mesh(lathe([[0.001, -2.1], [1.5, -1.85], [2.6, -1.25], [3.3, -0.55], [3.6, 0]], 16), tankMat);
  tankBowl.name = 'tankBowl';
  tankBowl.position.set(0, 14.12, 0);
  root.add(tankBowl);
  const tankShell = new THREE.Mesh(new THREE.CylinderGeometry(3.6, 3.6, 4.6, 16), tankMat);
  tankShell.name = 'tankShell';
  tankShell.position.set(0, 16.42, 0);
  root.add(tankShell);
  const tankBand = new THREE.Mesh(new THREE.CylinderGeometry(3.63, 3.63, 0.7, 16), stripeMat);
  tankBand.name = 'tankBand';
  tankBand.position.set(0, 16.678, 0);
  root.add(tankBand);
  const tankSeam = new THREE.Mesh(new THREE.CylinderGeometry(3.65, 3.65, 0.14, 16), steelMat);
  tankSeam.name = 'tankSeam';
  tankSeam.position.set(0, 18.69, 0);
  root.add(tankSeam);
  const roof = new THREE.Mesh(lathe([[3.85, 0], [3.8, 0.1], [2.1175, 0.95], [0.3, 1.805], [0.001, 1.9]], 16), tankMat);
  roof.name = 'roof';
  roof.position.set(0, 18.64, 0);
  root.add(roof);
  const finial = new THREE.Mesh(new THREE.SphereGeometry(0.25, 8, 6), steelMat);
  finial.name = 'finial';
  finial.position.set(0, 20.69, 0);
  root.add(finial);
  const roofHatch = new THREE.Mesh(new THREE.BoxGeometry(0.9, 0.24, 0.9), steelMat);
  roofHatch.name = 'roofHatch';
  roofHatch.position.set(0, 19.7806, 1.925);
  roofHatch.rotation.set(deg(25.1935), 0, 0);
  root.add(roofHatch);
  const ladderLower = new THREE.Group();
  ladderLower.name = 'ladderLower';
  ladderLower.position.set(0, 0, 4.15);
  root.add(ladderLower);
  const ladderRail = new THREE.Mesh(boxGeo2, darkMat);
  ladderRail.name = 'ladderRail';
  ladderRail.position.set(-0.22, 7.55, 0);
  ladderLower.add(ladderRail);
  const ladderRail2 = new THREE.Mesh(boxGeo2, darkMat);
  ladderRail2.name = 'ladderRail';
  ladderRail2.position.set(0.22, 7.55, 0);
  ladderLower.add(ladderRail2);
  const ladderRung = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung.name = 'ladderRung';
  ladderRung.position.set(0, 0.38, 0);
  ladderLower.add(ladderRung);
  const ladderRung2 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung2.name = 'ladderRung';
  ladderRung2.position.set(0, 0.86, 0);
  ladderLower.add(ladderRung2);
  const ladderRung3 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung3.name = 'ladderRung';
  ladderRung3.position.set(0, 1.34, 0);
  ladderLower.add(ladderRung3);
  const ladderRung4 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung4.name = 'ladderRung';
  ladderRung4.position.set(0, 1.82, 0);
  ladderLower.add(ladderRung4);
  const ladderRung5 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung5.name = 'ladderRung';
  ladderRung5.position.set(0, 2.3, 0);
  ladderLower.add(ladderRung5);
  const ladderRung6 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung6.name = 'ladderRung';
  ladderRung6.position.set(0, 2.78, 0);
  ladderLower.add(ladderRung6);
  const ladderRung7 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung7.name = 'ladderRung';
  ladderRung7.position.set(0, 3.26, 0);
  ladderLower.add(ladderRung7);
  const ladderRung8 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung8.name = 'ladderRung';
  ladderRung8.position.set(0, 3.74, 0);
  ladderLower.add(ladderRung8);
  const ladderRung9 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung9.name = 'ladderRung';
  ladderRung9.position.set(0, 4.22, 0);
  ladderLower.add(ladderRung9);
  const ladderRung10 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung10.name = 'ladderRung';
  ladderRung10.position.set(0, 4.7, 0);
  ladderLower.add(ladderRung10);
  const ladderRung11 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung11.name = 'ladderRung';
  ladderRung11.position.set(0, 5.18, 0);
  ladderLower.add(ladderRung11);
  const ladderRung12 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung12.name = 'ladderRung';
  ladderRung12.position.set(0, 5.66, 0);
  ladderLower.add(ladderRung12);
  const ladderRung13 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung13.name = 'ladderRung';
  ladderRung13.position.set(0, 6.14, 0);
  ladderLower.add(ladderRung13);
  const ladderRung14 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung14.name = 'ladderRung';
  ladderRung14.position.set(0, 6.62, 0);
  ladderLower.add(ladderRung14);
  const ladderRung15 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung15.name = 'ladderRung';
  ladderRung15.position.set(0, 7.1, 0);
  ladderLower.add(ladderRung15);
  const ladderRung16 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung16.name = 'ladderRung';
  ladderRung16.position.set(0, 7.58, 0);
  ladderLower.add(ladderRung16);
  const ladderRung17 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung17.name = 'ladderRung';
  ladderRung17.position.set(0, 8.06, 0);
  ladderLower.add(ladderRung17);
  const ladderRung18 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung18.name = 'ladderRung';
  ladderRung18.position.set(0, 8.54, 0);
  ladderLower.add(ladderRung18);
  const ladderRung19 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung19.name = 'ladderRung';
  ladderRung19.position.set(0, 9.02, 0);
  ladderLower.add(ladderRung19);
  const ladderRung20 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung20.name = 'ladderRung';
  ladderRung20.position.set(0, 9.5, 0);
  ladderLower.add(ladderRung20);
  const ladderRung21 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung21.name = 'ladderRung';
  ladderRung21.position.set(0, 9.98, 0);
  ladderLower.add(ladderRung21);
  const ladderRung22 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung22.name = 'ladderRung';
  ladderRung22.position.set(0, 10.46, 0);
  ladderLower.add(ladderRung22);
  const ladderRung23 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung23.name = 'ladderRung';
  ladderRung23.position.set(0, 10.94, 0);
  ladderLower.add(ladderRung23);
  const ladderRung24 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung24.name = 'ladderRung';
  ladderRung24.position.set(0, 11.42, 0);
  ladderLower.add(ladderRung24);
  const ladderRung25 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung25.name = 'ladderRung';
  ladderRung25.position.set(0, 11.9, 0);
  ladderLower.add(ladderRung25);
  const ladderRung26 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung26.name = 'ladderRung';
  ladderRung26.position.set(0, 12.38, 0);
  ladderLower.add(ladderRung26);
  const ladderRung27 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung27.name = 'ladderRung';
  ladderRung27.position.set(0, 12.86, 0);
  ladderLower.add(ladderRung27);
  const ladderRung28 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung28.name = 'ladderRung';
  ladderRung28.position.set(0, 13.34, 0);
  ladderLower.add(ladderRung28);
  const ladderRung29 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung29.name = 'ladderRung';
  ladderRung29.position.set(0, 13.82, 0);
  ladderLower.add(ladderRung29);
  const ladderRung30 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung30.name = 'ladderRung';
  ladderRung30.position.set(0, 14.3, 0);
  ladderLower.add(ladderRung30);
  const ladderRung31 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung31.name = 'ladderRung';
  ladderRung31.position.set(0, 14.78, 0);
  ladderLower.add(ladderRung31);
  const ladderUpper = new THREE.Group();
  ladderUpper.name = 'ladderUpper';
  ladderUpper.position.set(0, 14.12, 3.74);
  root.add(ladderUpper);
  const ladderRail3 = new THREE.Mesh(boxGeo4, darkMat);
  ladderRail3.name = 'ladderRail';
  ladderRail3.position.set(-0.22, 2.225, 0);
  ladderUpper.add(ladderRail3);
  const ladderRail4 = new THREE.Mesh(boxGeo4, darkMat);
  ladderRail4.name = 'ladderRail';
  ladderRail4.position.set(0.22, 2.225, 0);
  ladderUpper.add(ladderRail4);
  const ladderRung32 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung32.name = 'ladderRung';
  ladderRung32.position.set(0, 0.38, 0);
  ladderUpper.add(ladderRung32);
  const ladderRung33 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung33.name = 'ladderRung';
  ladderRung33.position.set(0, 0.86, 0);
  ladderUpper.add(ladderRung33);
  const ladderRung34 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung34.name = 'ladderRung';
  ladderRung34.position.set(0, 1.34, 0);
  ladderUpper.add(ladderRung34);
  const ladderRung35 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung35.name = 'ladderRung';
  ladderRung35.position.set(0, 1.82, 0);
  ladderUpper.add(ladderRung35);
  const ladderRung36 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung36.name = 'ladderRung';
  ladderRung36.position.set(0, 2.3, 0);
  ladderUpper.add(ladderRung36);
  const ladderRung37 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung37.name = 'ladderRung';
  ladderRung37.position.set(0, 2.78, 0);
  ladderUpper.add(ladderRung37);
  const ladderRung38 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung38.name = 'ladderRung';
  ladderRung38.position.set(0, 3.26, 0);
  ladderUpper.add(ladderRung38);
  const ladderRung39 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung39.name = 'ladderRung';
  ladderRung39.position.set(0, 3.74, 0);
  ladderUpper.add(ladderRung39);
  const ladderRung40 = new THREE.Mesh(boxGeo3, darkMat);
  ladderRung40.name = 'ladderRung';
  ladderRung40.position.set(0, 4.22, 0);
  ladderUpper.add(ladderRung40);
  const ladderCage = new THREE.Mesh(torusGeo2, darkMat);
  ladderCage.name = 'ladderCage';
  ladderCage.position.set(0, 3, 4.15);
  ladderCage.rotation.set(deg(90), 0, 0);
  root.add(ladderCage);
  const ladderCage2 = new THREE.Mesh(torusGeo2, darkMat);
  ladderCage2.name = 'ladderCage';
  ladderCage2.position.set(0, 6.5, 4.15);
  ladderCage2.rotation.set(deg(90), 0, 0);
  root.add(ladderCage2);
  const ladderCage3 = new THREE.Mesh(torusGeo2, darkMat);
  ladderCage3.name = 'ladderCage';
  ladderCage3.position.set(0, 10, 4.15);
  ladderCage3.rotation.set(deg(90), 0, 0);
  root.add(ladderCage3);
  const ladderCage4 = new THREE.Mesh(torusGeo2, darkMat);
  ladderCage4.name = 'ladderCage';
  ladderCage4.position.set(0, 13.5, 4.15);
  ladderCage4.rotation.set(deg(90), 0, 0);
  root.add(ladderCage4);

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

export default createWaterTower;

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