696 tris0,70 × 0,03 × 0,70 m
Úsalo en código
Hacer remix en el editormanhole-cover.js · 119 líneas
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
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









