Codels
412 üçgen2,00 × 1,49 × 0,92 m
Bağımsız bir ES modülü — yalnızca three paketine bağımlıdır. Fabrika fonksiyonunu çağırıp dönen grubu sahnene ekle.
/**
 * Road Barrier — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 412 · Size (W × H × D): 2.00 × 1.49 × 0.92 m
 *
 * Usage:
 *   import { createRoadBarrier } from './road-barrier.js';
 *   
 *   const model = createRoadBarrier();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

// Extrude a 2D outline along Z (centered). bevel = [thickness, size, segments].
function extrude(outline, depth, holes = [], bevel = null) {
  const shape = new THREE.Shape(outline.map(([x, y]) => new THREE.Vector2(x, y)));
  for (const hole of holes) shape.holes.push(new THREE.Path(hole.map(([x, y]) => new THREE.Vector2(x, y))));
  const options = bevel
    ? { depth, bevelEnabled: true, bevelThickness: bevel[0], bevelSize: bevel[1], bevelSegments: bevel[2] }
    : { depth, bevelEnabled: false };
  return new THREE.ExtrudeGeometry(shape, options).translate(0, 0, -depth / 2);
}

export function createRoadBarrier() {
  const root = new THREE.Group();
  root.name = 'RoadBarrier';

  // Materials
  const boardMat = new THREE.MeshStandardMaterial({ name: 'board', color: 0xf3f1ea, roughness: 0.5, flatShading: true });
  const stripeMat = new THREE.MeshStandardMaterial({ name: 'stripe', color: 0xea5a1c, roughness: 0.5, flatShading: true });
  const metalMat = new THREE.MeshStandardMaterial({ name: 'metal', color: 0x8a9096, roughness: 0.45, metalness: 0.6, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x2a2d30, roughness: 0.8, flatShading: true });
  const lampMat = new THREE.MeshStandardMaterial({ name: 'lamp', color: 0xffb52e, roughness: 0.3, emissive: 0xff9a1a, emissiveIntensity: 1.2, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(0.06, 1.06, 0.06);
  const boxGeo2 = new THREE.BoxGeometry(0.11, 0.06, 0.92);
  const boxGeo3 = new THREE.BoxGeometry(0.045, 0.6277, 0.045);
  const boxGeo4 = new THREE.BoxGeometry(0.08, 0.04, 0.08);
  const boxGeo5 = new THREE.BoxGeometry(2, 0.2, 0.03);
  const cylinderGeo = new THREE.CylinderGeometry(0.085, 0.085, 0.03, 10);

  // Parts
  const upright = new THREE.Mesh(boxGeo, metalMat);
  upright.name = 'upright';
  upright.position.set(-0.78, 0.59, 0);
  root.add(upright);
  const foot = new THREE.Mesh(boxGeo2, darkMat);
  foot.name = 'foot';
  foot.position.set(-0.78, 0.03, 0);
  root.add(foot);
  const brace = new THREE.Mesh(boxGeo3, metalMat);
  brace.name = 'brace';
  brace.position.set(-0.78, 0.35, -0.18);
  brace.rotation.set(0, deg(90), deg(30.6507));
  root.add(brace);
  const brace2 = new THREE.Mesh(boxGeo3, metalMat);
  brace2.name = 'brace';
  brace2.position.set(-0.78, 0.35, 0.18);
  brace2.rotation.set(0, deg(-90), deg(30.6507));
  root.add(brace2);
  const uprightCap = new THREE.Mesh(boxGeo4, darkMat);
  uprightCap.name = 'uprightCap';
  uprightCap.position.set(-0.78, 1.14, 0);
  root.add(uprightCap);
  const upright2 = new THREE.Mesh(boxGeo, metalMat);
  upright2.name = 'upright';
  upright2.position.set(0.78, 0.59, 0);
  root.add(upright2);
  const foot2 = new THREE.Mesh(boxGeo2, darkMat);
  foot2.name = 'foot';
  foot2.position.set(0.78, 0.03, 0);
  root.add(foot2);
  const brace3 = new THREE.Mesh(boxGeo3, metalMat);
  brace3.name = 'brace';
  brace3.position.set(0.78, 0.35, -0.18);
  brace3.rotation.set(0, deg(90), deg(30.6507));
  root.add(brace3);
  const brace4 = new THREE.Mesh(boxGeo3, metalMat);
  brace4.name = 'brace';
  brace4.position.set(0.78, 0.35, 0.18);
  brace4.rotation.set(0, deg(-90), deg(30.6507));
  root.add(brace4);
  const uprightCap2 = new THREE.Mesh(boxGeo4, darkMat);
  uprightCap2.name = 'uprightCap';
  uprightCap2.position.set(0.78, 1.14, 0);
  root.add(uprightCap2);
  const board = new THREE.Mesh(boxGeo5, boardMat);
  board.name = 'board';
  board.position.set(0, 0.95, 0.047);
  root.add(board);
  const stripe = new THREE.Mesh(extrude([[-0.998, 0.856], [-0.808, 1.046], [-0.998, 1.046]], 0.04), stripeMat);
  stripe.name = 'stripe';
  stripe.position.set(0, 0, 0.047);
  root.add(stripe);
  const stripe2 = new THREE.Mesh(extrude([[-0.8, 0.854], [-0.6, 0.854], [-0.408, 1.046], [-0.608, 1.046]], 0.04), stripeMat);
  stripe2.name = 'stripe';
  stripe2.position.set(0, 0, 0.047);
  root.add(stripe2);
  const stripe3 = new THREE.Mesh(extrude([[-0.4, 0.854], [-0.2, 0.854], [-0.008, 1.046], [-0.208, 1.046]], 0.04), stripeMat);
  stripe3.name = 'stripe';
  stripe3.position.set(0, 0, 0.047);
  root.add(stripe3);
  const stripe4 = new THREE.Mesh(extrude([[0, 0.854], [0.2, 0.854], [0.392, 1.046], [0.192, 1.046]], 0.04), stripeMat);
  stripe4.name = 'stripe';
  stripe4.position.set(0, 0, 0.047);
  root.add(stripe4);
  const stripe5 = new THREE.Mesh(extrude([[0.4, 0.854], [0.6, 0.854], [0.792, 1.046], [0.592, 1.046]], 0.04), stripeMat);
  stripe5.name = 'stripe';
  stripe5.position.set(0, 0, 0.047);
  root.add(stripe5);
  const stripe6 = new THREE.Mesh(extrude([[0.8, 0.854], [0.998, 0.854], [0.998, 1.046], [0.992, 1.046]], 0.04), stripeMat);
  stripe6.name = 'stripe';
  stripe6.position.set(0, 0, 0.047);
  root.add(stripe6);
  const board2 = new THREE.Mesh(boxGeo5, boardMat);
  board2.name = 'board';
  board2.position.set(0, 0.65, 0.047);
  root.add(board2);
  const stripe7 = new THREE.Mesh(extrude([[-0.998, 0.556], [-0.808, 0.746], [-0.998, 0.746]], 0.04), stripeMat);
  stripe7.name = 'stripe';
  stripe7.position.set(0, 0, 0.047);
  root.add(stripe7);
  const stripe8 = new THREE.Mesh(extrude([[-0.8, 0.554], [-0.6, 0.554], [-0.408, 0.746], [-0.608, 0.746]], 0.04), stripeMat);
  stripe8.name = 'stripe';
  stripe8.position.set(0, 0, 0.047);
  root.add(stripe8);
  const stripe9 = new THREE.Mesh(extrude([[-0.4, 0.554], [-0.2, 0.554], [-0.008, 0.746], [-0.208, 0.746]], 0.04), stripeMat);
  stripe9.name = 'stripe';
  stripe9.position.set(0, 0, 0.047);
  root.add(stripe9);
  const stripe10 = new THREE.Mesh(extrude([[0, 0.554], [0.2, 0.554], [0.392, 0.746], [0.192, 0.746]], 0.04), stripeMat);
  stripe10.name = 'stripe';
  stripe10.position.set(0, 0, 0.047);
  root.add(stripe10);
  const stripe11 = new THREE.Mesh(extrude([[0.4, 0.554], [0.6, 0.554], [0.792, 0.746], [0.592, 0.746]], 0.04), stripeMat);
  stripe11.name = 'stripe';
  stripe11.position.set(0, 0, 0.047);
  root.add(stripe11);
  const stripe12 = new THREE.Mesh(extrude([[0.8, 0.554], [0.998, 0.554], [0.998, 0.746], [0.992, 0.746]], 0.04), stripeMat);
  stripe12.name = 'stripe';
  stripe12.position.set(0, 0, 0.047);
  root.add(stripe12);
  const lampBracket = new THREE.Mesh(new THREE.BoxGeometry(0.05, 0.16, 0.05), darkMat);
  lampBracket.name = 'lampBracket';
  lampBracket.position.set(-0.78, 1.23, 0);
  root.add(lampBracket);
  const lampHousing = new THREE.Mesh(new THREE.CylinderGeometry(0.1, 0.1, 0.08, 10), darkMat);
  lampHousing.name = 'lampHousing';
  lampHousing.position.set(-0.78, 1.39, 0);
  lampHousing.rotation.set(deg(90), 0, 0);
  root.add(lampHousing);
  const lampLens = new THREE.Mesh(cylinderGeo, lampMat);
  lampLens.name = 'lampLens';
  lampLens.position.set(-0.78, 1.39, 0.055);
  lampLens.rotation.set(deg(90), 0, 0);
  root.add(lampLens);
  const lampLensBack = new THREE.Mesh(cylinderGeo, lampMat);
  lampLensBack.name = 'lampLensBack';
  lampLensBack.position.set(-0.78, 1.39, -0.055);
  lampLensBack.rotation.set(deg(90), 0, 0);
  root.add(lampLensBack);

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

export default createRoadBarrier;

Puanlar ve yorumlar

—
Henüz puan yok — ilk puanı sen ver.
5
0
4
0
3
0
2
0
1
0

Puan vermek ve yorum yapmak için giriş yap.

0 yorum

Henüz yorum yok. Bu modeli nasıl kullandığını ya da neyin daha iyi olabileceğini paylaş.

Benzer modeller

Aynı kategori ya da benzer etiketler