삼각형 900개6.70 × 3.22 × 3.09 m
코드에서 사용하기
에디터에서 리믹스bus-stop.js · 305줄
독립형 ES 모듈이에요 — three에만 의존해요. 팩토리 함수를 호출하고 그룹을 씬에 추가하세요.
/**
* 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;
평점 및 댓글
댓글 0개
아직 댓글이 없어요. 이 모델을 어떻게 사용했는지, 어떤 점이 더 나아질 수 있을지 공유해 주세요.
관련 모델
같은 카테고리 또는 비슷한 태그









