Codels
696 tris0,70 × 0,03 × 0,70 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.
/**
 * Manhole Cover — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 696 · Size (W × H × D): 0.70 × 0.03 × 0.70 m
 *
 * Usage:
 *   import { createManholeCover } from './manhole-cover.js';
 *   
 *   const model = createManholeCover();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

export function createManholeCover() {
  const root = new THREE.Group();
  root.name = 'ManholeCover';

  // Materials
  const ironMat = new THREE.MeshStandardMaterial({ name: 'iron', color: 0x4a4d50, roughness: 0.55, metalness: 0.55, flatShading: true });
  const frameMat = new THREE.MeshStandardMaterial({ name: 'frame', color: 0x383a3c, roughness: 0.6, metalness: 0.5, flatShading: true });
  const holeMat = new THREE.MeshStandardMaterial({ name: 'hole', color: 0x0e0f10, roughness: 1, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(0.016, 0.012, 0.11);
  const boxGeo2 = new THREE.BoxGeometry(0.05, 0.002, 0.018);

  // Parts
  const frame = new THREE.Mesh(new THREE.CylinderGeometry(0.35, 0.35, 0.016, 24), frameMat);
  frame.name = 'frame';
  frame.position.set(0, 0.008, 0);
  root.add(frame);
  const cover = new THREE.Mesh(new THREE.CylinderGeometry(0.3, 0.3, 0.02, 24), ironMat);
  cover.name = 'cover';
  cover.position.set(0, 0.01, 0);
  root.add(cover);
  const gap = new THREE.Mesh(new THREE.RingGeometry(0.3, 0.31, 24), holeMat);
  gap.name = 'gap';
  gap.position.set(0, 0.0165, 0);
  gap.rotation.set(deg(-90), 0, 0);
  root.add(gap);
  const rib = new THREE.Mesh(new THREE.TorusGeometry(0.26, 0.011, 3, 24), ironMat);
  rib.name = 'rib';
  rib.position.set(0, 0.02, 0);
  rib.rotation.set(deg(90), 0, 0);
  rib.scale.set(1, 1, 0.6);
  root.add(rib);
  const rib2 = new THREE.Mesh(new THREE.TorusGeometry(0.15, 0.011, 3, 24), ironMat);
  rib2.name = 'rib';
  rib2.position.set(0, 0.02, 0);
  rib2.rotation.set(deg(90), 0, 0);
  rib2.scale.set(1, 1, 0.6);
  root.add(rib2);
  const spoke = new THREE.Mesh(boxGeo, ironMat);
  spoke.name = 'spoke';
  spoke.position.set(0.0785, 0.02, 0.1894);
  spoke.rotation.set(0, deg(22.5), 0);
  root.add(spoke);
  const spoke2 = new THREE.Mesh(boxGeo, ironMat);
  spoke2.name = 'spoke';
  spoke2.position.set(0.1894, 0.02, 0.0785);
  spoke2.rotation.set(0, deg(67.5), 0);
  root.add(spoke2);
  const spoke3 = new THREE.Mesh(boxGeo, ironMat);
  spoke3.name = 'spoke';
  spoke3.position.set(0.1894, 0.02, -0.0785);
  spoke3.rotation.set(0, deg(112.5), 0);
  root.add(spoke3);
  const spoke4 = new THREE.Mesh(boxGeo, ironMat);
  spoke4.name = 'spoke';
  spoke4.position.set(0.0785, 0.02, -0.1894);
  spoke4.rotation.set(0, deg(157.5), 0);
  root.add(spoke4);
  const spoke5 = new THREE.Mesh(boxGeo, ironMat);
  spoke5.name = 'spoke';
  spoke5.position.set(-0.0785, 0.02, -0.1894);
  spoke5.rotation.set(0, deg(202.5), 0);
  root.add(spoke5);
  const spoke6 = new THREE.Mesh(boxGeo, ironMat);
  spoke6.name = 'spoke';
  spoke6.position.set(-0.1894, 0.02, -0.0785);
  spoke6.rotation.set(0, deg(247.5), 0);
  root.add(spoke6);
  const spoke7 = new THREE.Mesh(boxGeo, ironMat);
  spoke7.name = 'spoke';
  spoke7.position.set(-0.1894, 0.02, 0.0785);
  spoke7.rotation.set(0, deg(292.5), 0);
  root.add(spoke7);
  const spoke8 = new THREE.Mesh(boxGeo, ironMat);
  spoke8.name = 'spoke';
  spoke8.position.set(-0.0785, 0.02, 0.1894);
  spoke8.rotation.set(0, deg(337.5), 0);
  root.add(spoke8);
  const boss = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.072, 0.008, 12), ironMat);
  boss.name = 'boss';
  boss.position.set(0, 0.024, 0);
  root.add(boss);
  const pickHole = new THREE.Mesh(boxGeo2, holeMat);
  pickHole.name = 'pickHole';
  pickHole.position.set(-0.215, 0.0205, 0);
  root.add(pickHole);
  const pickHole2 = new THREE.Mesh(boxGeo2, holeMat);
  pickHole2.name = 'pickHole';
  pickHole2.position.set(0.215, 0.0205, 0);
  root.add(pickHole2);

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

export default createManholeCover;

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