Codels
1,3 mil tris0,97 × 1,84 × 0,81 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.
/**
 * Vending Machine — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 1,308 · Size (W × H × D): 0.97 × 1.84 × 0.81 m
 *
 * Usage:
 *   import { createVendingMachine } from './vending-machine.js';
 *   
 *   const model = createVendingMachine();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

export function createVendingMachine() {
  const root = new THREE.Group();
  root.name = 'VendingMachine';

  // Materials
  const bodyMat = new THREE.MeshStandardMaterial({ name: 'body', color: 0xc9242c, roughness: 0.45, metalness: 0.25, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x1f2124, roughness: 0.6, metalness: 0.2, flatShading: true });
  const steelMat = new THREE.MeshStandardMaterial({ name: 'steel', color: 0xb9bec3, roughness: 0.35, metalness: 0.7, flatShading: true });
  const glowMat = new THREE.MeshStandardMaterial({ name: 'glow', color: 0xf4fbff, roughness: 0.5, emissive: 0xe9f6ff, emissiveIntensity: 0.85, flatShading: true });
  const glassMat = new THREE.MeshStandardMaterial({ name: 'glass', color: 0xd7ebf3, roughness: 0.1, transparent: true, opacity: 0.22 });
  const canAMat = new THREE.MeshStandardMaterial({ name: 'canA', color: 0xe04a2e, roughness: 0.35, metalness: 0.4, flatShading: true });
  const canBMat = new THREE.MeshStandardMaterial({ name: 'canB', color: 0x2f7ad8, roughness: 0.35, metalness: 0.4, flatShading: true });
  const canCMat = new THREE.MeshStandardMaterial({ name: 'canC', color: 0xf2b130, roughness: 0.35, metalness: 0.4, flatShading: true });
  const screenMat = new THREE.MeshStandardMaterial({ name: 'screen', color: 0x7ff0b4, roughness: 0.3, emissive: 0x2fe08c, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(0.58, 0.02, 0.18);
  const cylinderGeo = new THREE.CylinderGeometry(0.04, 0.04, 0.13, 6);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.034, 0.04, 0.012, 6);
  const boxGeo2 = new THREE.BoxGeometry(0.05, 0.02, 0.01);
  const boxGeo3 = new THREE.BoxGeometry(0.63, 0.025, 0.02);
  const boxGeo4 = new THREE.BoxGeometry(0.025, 0.94, 0.02);
  const boxGeo5 = new THREE.BoxGeometry(0.01, 0.025, 0.45);

  // Parts
  const plinth = new THREE.Mesh(new THREE.BoxGeometry(0.89, 0.08, 0.67), darkMat);
  plinth.name = 'plinth';
  plinth.position.set(0, 0.04, 0);
  root.add(plinth);
  const cabinet = new THREE.Mesh(new THREE.BoxGeometry(0.95, 1.75, 0.55), bodyMat);
  cabinet.name = 'cabinet';
  cabinet.position.set(0, 0.955, -0.1);
  root.add(cabinet);
  const cabinetSide = new THREE.Mesh(new THREE.BoxGeometry(0.045, 1.75, 0.2), bodyMat);
  cabinetSide.name = 'cabinetSide';
  cabinetSide.position.set(-0.4525, 0.955, 0.275);
  root.add(cabinetSide);
  const cabinetSide2 = new THREE.Mesh(new THREE.BoxGeometry(0.325, 1.75, 0.2), bodyMat);
  cabinetSide2.name = 'cabinetSide';
  cabinetSide2.position.set(0.3125, 0.955, 0.275);
  root.add(cabinetSide2);
  const cabinetFront = new THREE.Mesh(new THREE.BoxGeometry(0.58, 0.54, 0.2), bodyMat);
  cabinetFront.name = 'cabinetFront';
  cabinetFront.position.set(-0.14, 0.35, 0.275);
  root.add(cabinetFront);
  const cabinetFront2 = new THREE.Mesh(new THREE.BoxGeometry(0.58, 0.27, 0.2), bodyMat);
  cabinetFront2.name = 'cabinetFront';
  cabinetFront2.position.set(-0.14, 1.695, 0.275);
  root.add(cabinetFront2);
  const topTrim = new THREE.Mesh(new THREE.BoxGeometry(0.97, 0.05, 0.77), darkMat);
  topTrim.name = 'topTrim';
  topTrim.position.set(0, 1.815, 0);
  root.add(topTrim);
  const header = new THREE.Mesh(new THREE.BoxGeometry(0.85, 0.16, 0.02), glowMat);
  header.name = 'header';
  header.position.set(0, 1.68, 0.38);
  root.add(header);
  const headerStripe = new THREE.Mesh(new THREE.BoxGeometry(0.85, 0.04, 0.006), bodyMat);
  headerStripe.name = 'headerStripe';
  headerStripe.position.set(0, 1.68, 0.392);
  root.add(headerStripe);
  const backlight = new THREE.Mesh(new THREE.BoxGeometry(0.58, 0.94, 0.01), glowMat);
  backlight.name = 'backlight';
  backlight.position.set(-0.14, 1.09, 0.18);
  root.add(backlight);
  const shelf = new THREE.Mesh(boxGeo, steelMat);
  shelf.name = 'shelf';
  shelf.position.set(-0.14, 0.66, 0.265);
  root.add(shelf);
  const can = new THREE.Mesh(cylinderGeo, canAMat);
  can.name = 'can';
  can.position.set(-0.372, 0.735, 0.265);
  root.add(can);
  const canTop = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop.name = 'canTop';
  canTop.position.set(-0.372, 0.806, 0.265);
  root.add(canTop);
  const selectButton = new THREE.Mesh(boxGeo2, screenMat);
  selectButton.name = 'selectButton';
  selectButton.position.set(-0.372, 0.635, 0.355);
  root.add(selectButton);
  const can2 = new THREE.Mesh(cylinderGeo, canBMat);
  can2.name = 'can';
  can2.position.set(-0.256, 0.735, 0.265);
  root.add(can2);
  const canTop2 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop2.name = 'canTop';
  canTop2.position.set(-0.256, 0.806, 0.265);
  root.add(canTop2);
  const selectButton2 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton2.name = 'selectButton';
  selectButton2.position.set(-0.256, 0.635, 0.355);
  root.add(selectButton2);
  const can3 = new THREE.Mesh(cylinderGeo, canCMat);
  can3.name = 'can';
  can3.position.set(-0.14, 0.735, 0.265);
  root.add(can3);
  const canTop3 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop3.name = 'canTop';
  canTop3.position.set(-0.14, 0.806, 0.265);
  root.add(canTop3);
  const selectButton3 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton3.name = 'selectButton';
  selectButton3.position.set(-0.14, 0.635, 0.355);
  root.add(selectButton3);
  const can4 = new THREE.Mesh(cylinderGeo, canAMat);
  can4.name = 'can';
  can4.position.set(-0.024, 0.735, 0.265);
  root.add(can4);
  const canTop4 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop4.name = 'canTop';
  canTop4.position.set(-0.024, 0.806, 0.265);
  root.add(canTop4);
  const selectButton4 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton4.name = 'selectButton';
  selectButton4.position.set(-0.024, 0.635, 0.355);
  root.add(selectButton4);
  const can5 = new THREE.Mesh(cylinderGeo, canBMat);
  can5.name = 'can';
  can5.position.set(0.092, 0.735, 0.265);
  root.add(can5);
  const canTop5 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop5.name = 'canTop';
  canTop5.position.set(0.092, 0.806, 0.265);
  root.add(canTop5);
  const selectButton5 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton5.name = 'selectButton';
  selectButton5.position.set(0.092, 0.635, 0.355);
  root.add(selectButton5);
  const shelf2 = new THREE.Mesh(boxGeo, steelMat);
  shelf2.name = 'shelf';
  shelf2.position.set(-0.14, 0.9733, 0.265);
  root.add(shelf2);
  const can6 = new THREE.Mesh(cylinderGeo, canBMat);
  can6.name = 'can';
  can6.position.set(-0.372, 1.0483, 0.265);
  root.add(can6);
  const canTop6 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop6.name = 'canTop';
  canTop6.position.set(-0.372, 1.1193, 0.265);
  root.add(canTop6);
  const selectButton6 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton6.name = 'selectButton';
  selectButton6.position.set(-0.372, 0.9483, 0.355);
  root.add(selectButton6);
  const can7 = new THREE.Mesh(cylinderGeo, canCMat);
  can7.name = 'can';
  can7.position.set(-0.256, 1.0483, 0.265);
  root.add(can7);
  const canTop7 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop7.name = 'canTop';
  canTop7.position.set(-0.256, 1.1193, 0.265);
  root.add(canTop7);
  const selectButton7 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton7.name = 'selectButton';
  selectButton7.position.set(-0.256, 0.9483, 0.355);
  root.add(selectButton7);
  const can8 = new THREE.Mesh(cylinderGeo, canAMat);
  can8.name = 'can';
  can8.position.set(-0.14, 1.0483, 0.265);
  root.add(can8);
  const canTop8 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop8.name = 'canTop';
  canTop8.position.set(-0.14, 1.1193, 0.265);
  root.add(canTop8);
  const selectButton8 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton8.name = 'selectButton';
  selectButton8.position.set(-0.14, 0.9483, 0.355);
  root.add(selectButton8);
  const can9 = new THREE.Mesh(cylinderGeo, canBMat);
  can9.name = 'can';
  can9.position.set(-0.024, 1.0483, 0.265);
  root.add(can9);
  const canTop9 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop9.name = 'canTop';
  canTop9.position.set(-0.024, 1.1193, 0.265);
  root.add(canTop9);
  const selectButton9 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton9.name = 'selectButton';
  selectButton9.position.set(-0.024, 0.9483, 0.355);
  root.add(selectButton9);
  const can10 = new THREE.Mesh(cylinderGeo, canCMat);
  can10.name = 'can';
  can10.position.set(0.092, 1.0483, 0.265);
  root.add(can10);
  const canTop10 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop10.name = 'canTop';
  canTop10.position.set(0.092, 1.1193, 0.265);
  root.add(canTop10);
  const selectButton10 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton10.name = 'selectButton';
  selectButton10.position.set(0.092, 0.9483, 0.355);
  root.add(selectButton10);
  const shelf3 = new THREE.Mesh(boxGeo, steelMat);
  shelf3.name = 'shelf';
  shelf3.position.set(-0.14, 1.2867, 0.265);
  root.add(shelf3);
  const can11 = new THREE.Mesh(cylinderGeo, canCMat);
  can11.name = 'can';
  can11.position.set(-0.372, 1.3617, 0.265);
  root.add(can11);
  const canTop11 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop11.name = 'canTop';
  canTop11.position.set(-0.372, 1.4327, 0.265);
  root.add(canTop11);
  const selectButton11 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton11.name = 'selectButton';
  selectButton11.position.set(-0.372, 1.2617, 0.355);
  root.add(selectButton11);
  const can12 = new THREE.Mesh(cylinderGeo, canAMat);
  can12.name = 'can';
  can12.position.set(-0.256, 1.3617, 0.265);
  root.add(can12);
  const canTop12 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop12.name = 'canTop';
  canTop12.position.set(-0.256, 1.4327, 0.265);
  root.add(canTop12);
  const selectButton12 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton12.name = 'selectButton';
  selectButton12.position.set(-0.256, 1.2617, 0.355);
  root.add(selectButton12);
  const can13 = new THREE.Mesh(cylinderGeo, canBMat);
  can13.name = 'can';
  can13.position.set(-0.14, 1.3617, 0.265);
  root.add(can13);
  const canTop13 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop13.name = 'canTop';
  canTop13.position.set(-0.14, 1.4327, 0.265);
  root.add(canTop13);
  const selectButton13 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton13.name = 'selectButton';
  selectButton13.position.set(-0.14, 1.2617, 0.355);
  root.add(selectButton13);
  const can14 = new THREE.Mesh(cylinderGeo, canCMat);
  can14.name = 'can';
  can14.position.set(-0.024, 1.3617, 0.265);
  root.add(can14);
  const canTop14 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop14.name = 'canTop';
  canTop14.position.set(-0.024, 1.4327, 0.265);
  root.add(canTop14);
  const selectButton14 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton14.name = 'selectButton';
  selectButton14.position.set(-0.024, 1.2617, 0.355);
  root.add(selectButton14);
  const can15 = new THREE.Mesh(cylinderGeo, canAMat);
  can15.name = 'can';
  can15.position.set(0.092, 1.3617, 0.265);
  root.add(can15);
  const canTop15 = new THREE.Mesh(cylinderGeo2, steelMat);
  canTop15.name = 'canTop';
  canTop15.position.set(0.092, 1.4327, 0.265);
  root.add(canTop15);
  const selectButton15 = new THREE.Mesh(boxGeo2, screenMat);
  selectButton15.name = 'selectButton';
  selectButton15.position.set(0.092, 1.2617, 0.355);
  root.add(selectButton15);
  const frontGlass = new THREE.Mesh(new THREE.BoxGeometry(0.58, 0.94, 0.008), glassMat);
  frontGlass.name = 'frontGlass';
  frontGlass.position.set(-0.14, 1.09, 0.367);
  root.add(frontGlass);
  const windowFrame = new THREE.Mesh(boxGeo3, darkMat);
  windowFrame.name = 'windowFrame';
  windowFrame.position.set(-0.14, 0.6075, 0.377);
  root.add(windowFrame);
  const windowFrame2 = new THREE.Mesh(boxGeo4, darkMat);
  windowFrame2.name = 'windowFrame';
  windowFrame2.position.set(-0.4425, 1.09, 0.377);
  root.add(windowFrame2);
  const windowFrame3 = new THREE.Mesh(boxGeo3, darkMat);
  windowFrame3.name = 'windowFrame';
  windowFrame3.position.set(-0.14, 1.5725, 0.377);
  root.add(windowFrame3);
  const windowFrame4 = new THREE.Mesh(boxGeo4, darkMat);
  windowFrame4.name = 'windowFrame';
  windowFrame4.position.set(0.1625, 1.09, 0.377);
  root.add(windowFrame4);
  const controlPanel = new THREE.Mesh(new THREE.BoxGeometry(0.2, 0.94, 0.02), darkMat);
  controlPanel.name = 'controlPanel';
  controlPanel.position.set(0.3125, 1.09, 0.383);
  root.add(controlPanel);
  const screen = new THREE.Mesh(new THREE.BoxGeometry(0.14, 0.07, 0.01), screenMat);
  screen.name = 'screen';
  screen.position.set(0.3125, 1.45, 0.395);
  root.add(screen);
  const coinPlate = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.14, 0.02), steelMat);
  coinPlate.name = 'coinPlate';
  coinPlate.position.set(0.3125, 1.26, 0.395);
  root.add(coinPlate);
  const coinSlot = new THREE.Mesh(new THREE.BoxGeometry(0.012, 0.05, 0.006), darkMat);
  coinSlot.name = 'coinSlot';
  coinSlot.position.set(0.3125, 1.28, 0.407);
  root.add(coinSlot);
  const billAcceptor = new THREE.Mesh(new THREE.BoxGeometry(0.11, 0.06, 0.03), steelMat);
  billAcceptor.name = 'billAcceptor';
  billAcceptor.position.set(0.3125, 1.1, 0.4);
  root.add(billAcceptor);
  const billSlot = new THREE.Mesh(new THREE.BoxGeometry(0.08, 0.008, 0.006), darkMat);
  billSlot.name = 'billSlot';
  billSlot.position.set(0.3125, 1.1, 0.417);
  root.add(billSlot);
  const coinReturn = new THREE.Mesh(new THREE.BoxGeometry(0.08, 0.06, 0.03), steelMat);
  coinReturn.name = 'coinReturn';
  coinReturn.position.set(0.3125, 0.8, 0.4);
  root.add(coinReturn);
  const coinReturnSlot = new THREE.Mesh(new THREE.BoxGeometry(0.05, 0.03, 0.006), darkMat);
  coinReturnSlot.name = 'coinReturnSlot';
  coinReturnSlot.position.set(0.3125, 0.79, 0.417);
  root.add(coinReturnSlot);
  const ventSlat = new THREE.Mesh(boxGeo5, darkMat);
  ventSlat.name = 'ventSlat';
  ventSlat.position.set(-0.479, 0.2, -0.1);
  root.add(ventSlat);
  const ventSlat2 = new THREE.Mesh(boxGeo5, darkMat);
  ventSlat2.name = 'ventSlat';
  ventSlat2.position.set(-0.479, 0.25, -0.1);
  root.add(ventSlat2);
  const ventSlat3 = new THREE.Mesh(boxGeo5, darkMat);
  ventSlat3.name = 'ventSlat';
  ventSlat3.position.set(-0.479, 0.3, -0.1);
  root.add(ventSlat3);
  const ventSlat4 = new THREE.Mesh(boxGeo5, darkMat);
  ventSlat4.name = 'ventSlat';
  ventSlat4.position.set(0.479, 0.2, -0.1);
  root.add(ventSlat4);
  const ventSlat5 = new THREE.Mesh(boxGeo5, darkMat);
  ventSlat5.name = 'ventSlat';
  ventSlat5.position.set(0.479, 0.25, -0.1);
  root.add(ventSlat5);
  const ventSlat6 = new THREE.Mesh(boxGeo5, darkMat);
  ventSlat6.name = 'ventSlat';
  ventSlat6.position.set(0.479, 0.3, -0.1);
  root.add(ventSlat6);
  const bay = new THREE.Mesh(new THREE.BoxGeometry(0.75, 0.26, 0.03), darkMat);
  bay.name = 'bay';
  bay.position.set(-0.03, 0.33, 0.377);
  root.add(bay);
  const flap = new THREE.Mesh(new THREE.BoxGeometry(0.69, 0.2, 0.012), steelMat);
  flap.name = 'flap';
  flap.position.set(-0.03, 0.33, 0.395);
  flap.rotation.set(deg(-8), 0, 0);
  root.add(flap);

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

export default createVendingMachine;

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