Codels
900 tris6,70 × 3,22 × 3,09 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.
/**
 * Bus Stop — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 900 · Size (W × H × D): 6.70 × 3.22 × 3.09 m
 *
 * Usage:
 *   import { createBusStop } from './bus-stop.js';
 *   
 *   const model = createBusStop();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

export function createBusStop() {
  const root = new THREE.Group();
  root.name = 'BusStop';

  // Materials
  const frameMat = new THREE.MeshStandardMaterial({ name: 'frame', color: 0x3b4856, roughness: 0.5, metalness: 0.3, flatShading: true });
  const accentMat = new THREE.MeshStandardMaterial({ name: 'accent', color: 0x2a7fc0, roughness: 0.6, flatShading: true });
  const glassMat = new THREE.MeshStandardMaterial({ name: 'glass', color: 0xd3eaf2, roughness: 0.08, metalness: 0.1, transparent: true, opacity: 0.35, side: THREE.DoubleSide });
  const concreteMat = new THREE.MeshStandardMaterial({ name: 'concrete', color: 0xbdb9b1, roughness: 0.95, flatShading: true });
  const tactileMat = new THREE.MeshStandardMaterial({ name: 'tactile', color: 0xe5c13d, roughness: 0.9, flatShading: true });
  const whiteMat = new THREE.MeshStandardMaterial({ name: 'white', color: 0xf3f2ee, roughness: 0.7, flatShading: true });
  const woodMat = new THREE.MeshStandardMaterial({ name: 'wood', color: 0xa8774a, roughness: 0.85, flatShading: true });
  const posterMat = new THREE.MeshStandardMaterial({ name: 'poster', color: 0xf7d891, roughness: 0.8, emissive: 0xf2b84b, emissiveIntensity: 0.8, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x24282d, roughness: 0.8, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(0.08, 2.45, 0.08);
  const boxGeo2 = new THREE.BoxGeometry(0.08, 0.08, 1.35);
  const boxGeo3 = new THREE.BoxGeometry(4.2, 0.08, 0.08);
  const boxGeo4 = new THREE.BoxGeometry(0.26, 0.12, 0.02);
  const boxGeo5 = new THREE.BoxGeometry(0.02, 1.7, 1.05);
  const boxGeo6 = new THREE.BoxGeometry(0.02, 0.62, 0.62);
  const boxGeo7 = new THREE.BoxGeometry(0.02, 0.1, 0.8);
  const boxGeo8 = new THREE.BoxGeometry(3.2, 0.04, 0.12);
  const boxGeo9 = new THREE.BoxGeometry(0.06, 0.44, 0.06);
  const boxGeo10 = new THREE.BoxGeometry(0.06, 0.06, 0.42);
  const boxGeo11 = new THREE.BoxGeometry(0.05, 0.05, 0.02);
  const boxGeo12 = new THREE.BoxGeometry(0.1, 0.1, 0.02);
  const boxGeo13 = new THREE.BoxGeometry(0.28, 0.025, 0.01);

  // Parts
  const platform = new THREE.Mesh(new THREE.BoxGeometry(6.6, 0.15, 3), concreteMat);
  platform.name = 'platform';
  platform.position.set(0.4, 0.075, 0.1);
  root.add(platform);
  const tactileStrip = new THREE.Mesh(new THREE.BoxGeometry(6.6, 0.02, 0.4), tactileMat);
  tactileStrip.name = 'tactileStrip';
  tactileStrip.position.set(0.4, 0.16, 1.25);
  root.add(tactileStrip);
  const curbEdge = new THREE.Mesh(new THREE.BoxGeometry(6.7, 0.18, 0.18), whiteMat);
  curbEdge.name = 'curbEdge';
  curbEdge.position.set(0.4, 0.09, 1.6);
  root.add(curbEdge);
  const post = new THREE.Mesh(boxGeo, frameMat);
  post.name = 'post';
  post.position.set(-2.06, 1.375, -0.75);
  root.add(post);
  const post2 = new THREE.Mesh(boxGeo, frameMat);
  post2.name = 'post';
  post2.position.set(-2.06, 1.375, 0.6);
  root.add(post2);
  const sideRail = new THREE.Mesh(boxGeo2, frameMat);
  sideRail.name = 'sideRail';
  sideRail.position.set(-2.06, 2.56, -0.075);
  root.add(sideRail);
  const post3 = new THREE.Mesh(boxGeo, frameMat);
  post3.name = 'post';
  post3.position.set(2.06, 1.375, -0.75);
  root.add(post3);
  const post4 = new THREE.Mesh(boxGeo, frameMat);
  post4.name = 'post';
  post4.position.set(2.06, 1.375, 0.6);
  root.add(post4);
  const sideRail2 = new THREE.Mesh(boxGeo2, frameMat);
  sideRail2.name = 'sideRail';
  sideRail2.position.set(2.06, 2.56, -0.075);
  root.add(sideRail2);
  const backRail = new THREE.Mesh(boxGeo3, frameMat);
  backRail.name = 'backRail';
  backRail.position.set(0, 2.56, -0.75);
  root.add(backRail);
  const frontRail = new THREE.Mesh(boxGeo3, frameMat);
  frontRail.name = 'frontRail';
  frontRail.position.set(0, 2.56, 0.6);
  root.add(frontRail);
  const lowRail = new THREE.Mesh(new THREE.BoxGeometry(4.2, 0.06, 0.06), frameMat);
  lowRail.name = 'lowRail';
  lowRail.position.set(0, 0.35, -0.75);
  root.add(lowRail);
  const roof = new THREE.Mesh(new THREE.BoxGeometry(4.7, 0.08, 2), frameMat);
  roof.name = 'roof';
  roof.position.set(0, 2.68, -0.025);
  roof.rotation.set(deg(-5), 0, 0);
  root.add(roof);
  const roofGlass = new THREE.Mesh(new THREE.BoxGeometry(4.5, 0.04, 1.8), glassMat);
  roofGlass.name = 'roofGlass';
  roofGlass.position.set(0, 2.73, -0.025);
  roofGlass.rotation.set(deg(-5), 0, 0);
  root.add(roofGlass);
  const routeFascia = new THREE.Mesh(new THREE.BoxGeometry(4.72, 0.28, 0.08), accentMat);
  routeFascia.name = 'routeFascia';
  routeFascia.position.set(0, 2.73, 0.975);
  root.add(routeFascia);
  const fasciaLetter = new THREE.Mesh(boxGeo4, whiteMat);
  fasciaLetter.name = 'fasciaLetter';
  fasciaLetter.position.set(-1.5, 2.73, 1.025);
  root.add(fasciaLetter);
  const fasciaLetter2 = new THREE.Mesh(boxGeo4, whiteMat);
  fasciaLetter2.name = 'fasciaLetter';
  fasciaLetter2.position.set(-1.14, 2.73, 1.025);
  root.add(fasciaLetter2);
  const fasciaLetter3 = new THREE.Mesh(boxGeo4, whiteMat);
  fasciaLetter3.name = 'fasciaLetter';
  fasciaLetter3.position.set(-0.78, 2.73, 1.025);
  root.add(fasciaLetter3);
  const fasciaLetter4 = new THREE.Mesh(boxGeo4, whiteMat);
  fasciaLetter4.name = 'fasciaLetter';
  fasciaLetter4.position.set(-0.42, 2.73, 1.025);
  root.add(fasciaLetter4);
  const fasciaLetter5 = new THREE.Mesh(boxGeo4, whiteMat);
  fasciaLetter5.name = 'fasciaLetter';
  fasciaLetter5.position.set(-0.06, 2.73, 1.025);
  root.add(fasciaLetter5);
  const backGlass = new THREE.Mesh(new THREE.BoxGeometry(4.1, 2, 0.02), glassMat);
  backGlass.name = 'backGlass';
  backGlass.position.set(0, 1.4, -0.75);
  root.add(backGlass);
  const sideGlass = new THREE.Mesh(new THREE.BoxGeometry(0.02, 2, 0.7425), glassMat);
  sideGlass.name = 'sideGlass';
  sideGlass.position.set(2.06, 1.4, -0.3787);
  root.add(sideGlass);
  const glassBand = new THREE.Mesh(new THREE.BoxGeometry(3.6, 0.03, 0.03), whiteMat);
  glassBand.name = 'glassBand';
  glassBand.position.set(0, 1.6, -0.73);
  root.add(glassBand);
  const routeMap = new THREE.Mesh(new THREE.BoxGeometry(0.9, 1, 0.04), whiteMat);
  routeMap.name = 'routeMap';
  routeMap.position.set(1.35, 1.6, -0.71);
  root.add(routeMap);
  const routeLine = new THREE.Mesh(new THREE.BoxGeometry(0.7, 0.04, 0.02), accentMat);
  routeLine.name = 'routeLine';
  routeLine.position.set(1.35, 1.75, -0.68);
  root.add(routeLine);
  const routeLine2 = new THREE.Mesh(new THREE.BoxGeometry(0.04, 0.6, 0.02), accentMat);
  routeLine2.name = 'routeLine';
  routeLine2.position.set(1.15, 1.55, -0.68);
  root.add(routeLine2);
  const adBox = new THREE.Mesh(new THREE.BoxGeometry(0.18, 2, 1.25), frameMat);
  adBox.name = 'adBox';
  adBox.position.set(-2.05, 1.3, -0.075);
  root.add(adBox);
  const adPoster = new THREE.Mesh(boxGeo5, posterMat);
  adPoster.name = 'adPoster';
  adPoster.position.set(-2.14, 1.3, -0.075);
  root.add(adPoster);
  const adGraphic = new THREE.Mesh(boxGeo6, accentMat);
  adGraphic.name = 'adGraphic';
  adGraphic.position.set(-2.146, 1.6, -0.075);
  adGraphic.rotation.set(deg(45), 0, 0);
  root.add(adGraphic);
  const adText = new THREE.Mesh(boxGeo7, darkMat);
  adText.name = 'adText';
  adText.position.set(-2.146, 0.85, -0.075);
  root.add(adText);
  const adPoster2 = new THREE.Mesh(boxGeo5, posterMat);
  adPoster2.name = 'adPoster';
  adPoster2.position.set(-1.96, 1.3, -0.075);
  root.add(adPoster2);
  const adGraphic2 = new THREE.Mesh(boxGeo6, accentMat);
  adGraphic2.name = 'adGraphic';
  adGraphic2.position.set(-1.954, 1.6, -0.075);
  adGraphic2.rotation.set(deg(45), 0, 0);
  root.add(adGraphic2);
  const adText2 = new THREE.Mesh(boxGeo7, darkMat);
  adText2.name = 'adText';
  adText2.position.set(-1.954, 0.85, -0.075);
  root.add(adText2);
  const benchSlat = new THREE.Mesh(boxGeo8, woodMat);
  benchSlat.name = 'benchSlat';
  benchSlat.position.set(0.1, 0.61, -0.55);
  root.add(benchSlat);
  const benchSlat2 = new THREE.Mesh(boxGeo8, woodMat);
  benchSlat2.name = 'benchSlat';
  benchSlat2.position.set(0.1, 0.61, -0.41);
  root.add(benchSlat2);
  const benchSlat3 = new THREE.Mesh(boxGeo8, woodMat);
  benchSlat3.name = 'benchSlat';
  benchSlat3.position.set(0.1, 0.61, -0.27);
  root.add(benchSlat3);
  const benchLeg = new THREE.Mesh(boxGeo9, frameMat);
  benchLeg.name = 'benchLeg';
  benchLeg.position.set(-1.3, 0.37, -0.33);
  root.add(benchLeg);
  const benchBracket = new THREE.Mesh(boxGeo10, frameMat);
  benchBracket.name = 'benchBracket';
  benchBracket.position.set(-1.3, 0.56, -0.51);
  root.add(benchBracket);
  const benchLeg2 = new THREE.Mesh(boxGeo9, frameMat);
  benchLeg2.name = 'benchLeg';
  benchLeg2.position.set(1.5, 0.37, -0.33);
  root.add(benchLeg2);
  const benchBracket2 = new THREE.Mesh(boxGeo10, frameMat);
  benchBracket2.name = 'benchBracket';
  benchBracket2.position.set(1.5, 0.56, -0.51);
  root.add(benchBracket2);
  const benchBack = new THREE.Mesh(new THREE.BoxGeometry(3.2, 0.12, 0.04), woodMat);
  benchBack.name = 'benchBack';
  benchBack.position.set(0.1, 0.96, -0.69);
  root.add(benchBack);
  const signPole = new THREE.Mesh(new THREE.CylinderGeometry(0.045, 0.045, 3, 8), frameMat);
  signPole.name = 'signPole';
  signPole.position.set(2.85, 1.65, 0.95);
  root.add(signPole);
  const busSignRim = new THREE.Mesh(new THREE.CylinderGeometry(0.32, 0.32, 0.05, 16), whiteMat);
  busSignRim.name = 'busSignRim';
  busSignRim.position.set(2.85, 2.9, 0.95);
  busSignRim.rotation.set(deg(90), 0, 0);
  root.add(busSignRim);
  const busSign = new THREE.Mesh(new THREE.CylinderGeometry(0.27, 0.27, 0.07, 16), accentMat);
  busSign.name = 'busSign';
  busSign.position.set(2.85, 2.9, 0.95);
  busSign.rotation.set(deg(90), 0, 0);
  root.add(busSign);
  const busIcon = new THREE.Mesh(new THREE.BoxGeometry(0.26, 0.14, 0.02), whiteMat);
  busIcon.name = 'busIcon';
  busIcon.position.set(2.85, 2.92, 0.99);
  root.add(busIcon);
  const busWheel = new THREE.Mesh(boxGeo11, whiteMat);
  busWheel.name = 'busWheel';
  busWheel.position.set(2.77, 2.82, 0.99);
  root.add(busWheel);
  const busWheel2 = new THREE.Mesh(boxGeo11, whiteMat);
  busWheel2.name = 'busWheel';
  busWheel2.position.set(2.93, 2.82, 0.99);
  root.add(busWheel2);
  const routePlate = new THREE.Mesh(new THREE.BoxGeometry(0.5, 0.18, 0.04), whiteMat);
  routePlate.name = 'routePlate';
  routePlate.position.set(2.85, 2.45, 0.95);
  root.add(routePlate);
  const routeNumber = new THREE.Mesh(boxGeo12, darkMat);
  routeNumber.name = 'routeNumber';
  routeNumber.position.set(2.71, 2.45, 0.975);
  root.add(routeNumber);
  const routeNumber2 = new THREE.Mesh(boxGeo12, darkMat);
  routeNumber2.name = 'routeNumber';
  routeNumber2.position.set(2.85, 2.45, 0.975);
  root.add(routeNumber2);
  const routeNumber3 = new THREE.Mesh(boxGeo12, darkMat);
  routeNumber3.name = 'routeNumber';
  routeNumber3.position.set(2.99, 2.45, 0.975);
  root.add(routeNumber3);
  const timetableCase = new THREE.Mesh(new THREE.BoxGeometry(0.42, 0.6, 0.06), frameMat);
  timetableCase.name = 'timetableCase';
  timetableCase.position.set(2.85, 1.6, 1.01);
  root.add(timetableCase);
  const timetable = new THREE.Mesh(new THREE.BoxGeometry(0.36, 0.52, 0.02), whiteMat);
  timetable.name = 'timetable';
  timetable.position.set(2.85, 1.6, 1.05);
  root.add(timetable);
  const timetableLine = new THREE.Mesh(boxGeo13, darkMat);
  timetableLine.name = 'timetableLine';
  timetableLine.position.set(2.85, 1.78, 1.062);
  root.add(timetableLine);
  const timetableLine2 = new THREE.Mesh(boxGeo13, darkMat);
  timetableLine2.name = 'timetableLine';
  timetableLine2.position.set(2.85, 1.69, 1.062);
  root.add(timetableLine2);
  const timetableLine3 = new THREE.Mesh(boxGeo13, darkMat);
  timetableLine3.name = 'timetableLine';
  timetableLine3.position.set(2.85, 1.6, 1.062);
  root.add(timetableLine3);
  const timetableLine4 = new THREE.Mesh(boxGeo13, darkMat);
  timetableLine4.name = 'timetableLine';
  timetableLine4.position.set(2.85, 1.51, 1.062);
  root.add(timetableLine4);
  const timetableLine5 = new THREE.Mesh(boxGeo13, darkMat);
  timetableLine5.name = 'timetableLine';
  timetableLine5.position.set(2.85, 1.42, 1.062);
  root.add(timetableLine5);
  const bin = new THREE.Mesh(new THREE.CylinderGeometry(0.22, 0.2, 0.75, 10), frameMat);
  bin.name = 'bin';
  bin.position.set(-2.65, 0.525, 0.6);
  root.add(bin);
  const binLid = new THREE.Mesh(new THREE.CylinderGeometry(0.24, 0.24, 0.06, 10), darkMat);
  binLid.name = 'binLid';
  binLid.position.set(-2.65, 0.93, 0.6);
  root.add(binLid);

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

export default createBusStop;

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