Codels
삼각형 1.7천개4.16 × 5.74 × 4.23 m

코드에서 사용하기

에디터에서 리믹스
독립형 ES 모듈이에요 — three에만 의존해요. 팩토리 함수를 호출하고 그룹을 씬에 추가하세요.
/**
 * Giant Mushroom Tree — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 1,740 · Size (W × H × D): 4.16 × 5.74 × 4.23 m
 *
 * Usage:
 *   import { createMushroomTree } from './mushroom-tree.js';
 *   
 *   const model = createMushroomTree();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

// Revolve a 2D profile [[radius, y], ...] around the Y axis.
function lathe(points, segments, phiStart = 0, phiLength = Math.PI * 2) {
  return new THREE.LatheGeometry(points.map(([x, y]) => new THREE.Vector2(x, y)), segments, phiStart, phiLength);
}

export function createMushroomTree() {
  const root = new THREE.Group();
  root.name = 'MushroomTree';

  // Materials
  const stalkMat = new THREE.MeshStandardMaterial({ name: 'stalk', color: 0xe4d9c3, roughness: 0.8, flatShading: true });
  const stalkDarkMat = new THREE.MeshStandardMaterial({ name: 'stalkDark', color: 0xc4b59b, roughness: 0.85, flatShading: true });
  const capMat = new THREE.MeshStandardMaterial({ name: 'cap', color: 0x7a4ab0, roughness: 0.6, flatShading: true });
  const capAltMat = new THREE.MeshStandardMaterial({ name: 'capAlt', color: 0x643d90, roughness: 0.6, flatShading: true });
  const gillMat = new THREE.MeshStandardMaterial({ name: 'gill', color: 0xbca0c6, roughness: 0.8, emissive: 0x6ff3e8, emissiveIntensity: 0.25, flatShading: true });
  const spotMat = new THREE.MeshStandardMaterial({ name: 'spot', color: 0x6ff3e8, roughness: 0.3, emissive: 0x6ff3e8, emissiveIntensity: 1.2, flatShading: true });

  // Shared geometries
  const cylinderGeo = new THREE.CylinderGeometry(0.0787, 0.1609, 0.555, 5);

  // Parts
  const foot = new THREE.Mesh(lathe([[0, 0], [0.6793, 0], [0.6256, 0.275], [0.4469, 0.66], [0.3647, 0.99], [0, 1.1]], 10), stalkMat);
  foot.name = 'foot';
  foot.position.set(-0.1648, 0, 0);
  root.add(foot);
  const stalk1 = new THREE.Mesh(new THREE.CylinderGeometry(0.3414, 0.3575, 1.2577, 9), stalkMat);
  stalk1.name = 'stalk1';
  stalk1.position.set(0.0122, 1.0051, 0.0502);
  stalk1.rotation.set(deg(2.7141), deg(-0.2152), deg(-9.0661));
  root.add(stalk1);
  const stalk2 = new THREE.Mesh(new THREE.CylinderGeometry(0.3253, 0.3414, 1.2458, 9), stalkMat);
  stalk2.name = 'stalk2';
  stalk2.position.set(0.131, 2.0694, 0.0946);
  stalk2.rotation.set(deg(2.0227), deg(-0.0641), deg(-3.6284));
  root.add(stalk2);
  const stalk3 = new THREE.Mesh(new THREE.CylinderGeometry(0.3092, 0.3253, 1.2449, 9), stalkMat);
  stalk3.name = 'stalk3';
  stalk3.position.set(0.134, 3.1336, 0.1222);
  stalk3.rotation.set(deg(0.9437), deg(0.0272), deg(3.3003));
  root.add(stalk3);
  const stalk4 = new THREE.Mesh(new THREE.CylinderGeometry(0.2932, 0.3092, 1.2559, 9), stalkMat);
  stalk4.name = 'stalk4';
  stalk4.position.set(0.0202, 4.1979, 0.1282);
  stalk4.rotation.set(deg(-0.3008), deg(-0.0234), deg(8.8796));
  root.add(stalk4);
  const skirt = new THREE.Mesh(new THREE.CylinderGeometry(0.3754, 0.572, 0.22, 10, 1, true), stalkDarkMat);
  skirt.name = 'skirt';
  skirt.position.set(-0.0827, 4.07, 0.1254);
  root.add(skirt);
  const mainCap = new THREE.Group();
  mainCap.name = 'mainCap';
  mainCap.position.set(-0.0629, 4.4924, 0.1254);
  mainCap.rotation.set(deg(2.0709), 0, deg(2.7496));
  root.add(mainCap);
  const cap = new THREE.Mesh(lathe([[1.9206, -0.0594], [1.98, 0.1188], [1.8216, 0.4752], [1.4256, 0.8712], [0.8316, 1.1484], [0, 1.2474]], 12), capMat);
  cap.name = 'cap';
  mainCap.add(cap);
  const gills = new THREE.Mesh(lathe([[0.2127, 0.4356], [0.99, 0.198], [1.9206, -0.0594]], 12), gillMat);
  gills.name = 'gills';
  mainCap.add(gills);
  const spot1 = new THREE.Mesh(new THREE.SphereGeometry(0.1868, 7, 3), spotMat);
  spot1.name = 'spot1';
  spot1.position.set(1.3303, 0.9141, 0.0123);
  spot1.rotation.set(deg(6.4667), deg(-1.4265), deg(-24.8552));
  spot1.scale.set(1, 0.3, 1);
  mainCap.add(spot1);
  const spot2 = new THREE.Mesh(new THREE.SphereGeometry(0.1812, 7, 3), spotMat);
  spot2.name = 'spot2';
  spot2.position.set(0.5971, 1.1346, 0.5793);
  spot2.rotation.set(deg(17.938), deg(-2.8539), deg(-17.938));
  spot2.scale.set(1, 0.3, 1);
  mainCap.add(spot2);
  const spot3 = new THREE.Mesh(new THREE.SphereGeometry(0.1867, 7, 3), spotMat);
  spot3.name = 'spot3';
  spot3.position.set(0.6502, 0.9134, 1.1609);
  spot3.rotation.set(deg(24.8552), deg(-1.4265), deg(-6.4667));
  spot3.scale.set(1, 0.3, 1);
  mainCap.add(spot3);
  const spot4 = new THREE.Mesh(new THREE.SphereGeometry(0.2054, 7, 3), spotMat);
  spot4.name = 'spot4';
  spot4.position.set(-0.3187, 1.165, 0.6065);
  spot4.rotation.set(deg(6.7856), deg(0.1076), deg(1.8142));
  spot4.scale.set(1, 0.3, 1);
  mainCap.add(spot4);
  const spot5 = new THREE.Mesh(new THREE.SphereGeometry(0.1926, 7, 3), spotMat);
  spot5.name = 'spot5';
  spot5.position.set(-1.2769, 0.8699, 0.5597);
  spot5.rotation.set(deg(10.7603), deg(4.3767), deg(44.1691));
  spot5.scale.set(1, 0.3, 1);
  mainCap.add(spot5);
  const spot6 = new THREE.Mesh(new THREE.SphereGeometry(0.1605, 7, 3), spotMat);
  spot6.name = 'spot6';
  spot6.position.set(-0.564, 1.1789, -0.0439);
  spot6.rotation.set(deg(-1.8142), deg(-0.1076), deg(6.7856));
  spot6.scale.set(1, 0.3, 1);
  mainCap.add(spot6);
  const spot7 = new THREE.Mesh(new THREE.SphereGeometry(0.1847, 7, 3), spotMat);
  spot7.name = 'spot7';
  spot7.position.set(-0.719, 0.9371, -1.0356);
  spot7.rotation.set(deg(-17.938), deg(-2.8539), deg(17.938));
  spot7.scale.set(1, 0.3, 1);
  mainCap.add(spot7);
  const spot8 = new THREE.Mesh(new THREE.SphereGeometry(0.1843, 7, 3), spotMat);
  spot8.name = 'spot8';
  spot8.position.set(-0.0901, 1.1581, -0.7259);
  spot8.rotation.set(deg(-6.7856), deg(-0.1076), deg(1.8142));
  spot8.scale.set(1, 0.3, 1);
  mainCap.add(spot8);
  const spot9 = new THREE.Mesh(new THREE.SphereGeometry(0.2024, 7, 3), spotMat);
  spot9.name = 'spot9';
  spot9.position.set(1.0646, 0.7717, -1.0187);
  spot9.rotation.set(deg(-30.972), deg(8.7792), deg(-30.972));
  spot9.scale.set(1, 0.3, 1);
  mainCap.add(spot9);
  const sideStem1 = new THREE.Mesh(new THREE.CylinderGeometry(0.1448, 0.1609, 0.9823, 7), stalkMat);
  sideStem1.name = 'sideStem1';
  sideStem1.position.set(0.4625, 3.0363, -0.1826);
  sideStem1.rotation.set(deg(-47.738), deg(22.0745), deg(-47.5766));
  root.add(sideStem1);
  const sideStem1Tip = new THREE.Mesh(new THREE.CylinderGeometry(0.1287, 0.1448, 0.8148, 7), stalkMat);
  sideStem1Tip.name = 'sideStem1Tip';
  sideStem1Tip.position.set(0.9286, 3.4213, -0.6499);
  sideStem1Tip.rotation.set(deg(-27.2933), deg(6.7275), deg(-27.2176));
  root.add(sideStem1Tip);
  const sideCap1 = new THREE.Group();
  sideCap1.name = 'sideCap1';
  sideCap1.position.set(1.0917, 3.5934, -0.8134);
  sideCap1.rotation.set(deg(-9.8889), deg(0.8554), deg(-9.8633));
  root.add(sideCap1);
  const cap2 = new THREE.Mesh(lathe([[0.9987, -0.0309], [1.0296, 0.0618], [0.9472, 0.2471], [0.7413, 0.453], [0.4324, 0.5972], [0, 0.6486]], 12), capAltMat);
  cap2.name = 'cap';
  sideCap1.add(cap2);
  const gills2 = new THREE.Mesh(lathe([[0.1126, 0.2265], [0.5148, 0.103], [0.9987, -0.0309]], 12), gillMat);
  gills2.name = 'gills';
  sideCap1.add(gills2);
  const spot12 = new THREE.Mesh(new THREE.SphereGeometry(0.0981, 7, 3), spotMat);
  spot12.name = 'spot1';
  spot12.position.set(0.5518, 0.5181, -0.1864);
  spot12.rotation.set(deg(-6.4684), deg(1.4273), deg(-24.8622));
  spot12.scale.set(1, 0.3, 1);
  sideCap1.add(spot12);
  const spot22 = new THREE.Mesh(new THREE.SphereGeometry(0.0809, 7, 3), spotMat);
  spot22.name = 'spot2';
  spot22.position.set(0.2036, 0.6089, 0.2522);
  spot22.rotation.set(deg(4.9548), deg(-0.2145), deg(-4.9548));
  spot22.scale.set(1, 0.3, 1);
  sideCap1.add(spot22);
  const spot32 = new THREE.Mesh(new THREE.SphereGeometry(0.1061, 7, 3), spotMat);
  spot32.name = 'spot3';
  spot32.position.set(-0.4026, 0.4002, 0.6821);
  spot32.rotation.set(deg(30.972), deg(8.7792), deg(30.972));
  spot32.scale.set(1, 0.3, 1);
  sideCap1.add(spot32);
  const spot42 = new THREE.Mesh(new THREE.SphereGeometry(0.0807, 7, 3), spotMat);
  spot42.name = 'spot4';
  spot42.position.set(-0.3726, 0.5994, 0.1544);
  spot42.rotation.set(deg(1.8116), deg(0.1073), deg(6.7756));
  spot42.scale.set(1, 0.3, 1);
  sideCap1.add(spot42);
  const spot52 = new THREE.Mesh(new THREE.SphereGeometry(0.1066, 7, 3), spotMat);
  spot52.name = 'spot5';
  spot52.position.set(-0.6032, 0.3684, -0.525);
  spot52.rotation.set(deg(-30.972), deg(-8.7792), deg(30.972));
  spot52.scale.set(1, 0.3, 1);
  sideCap1.add(spot52);
  const spot62 = new THREE.Mesh(new THREE.SphereGeometry(0.0744, 7, 3), spotMat);
  spot62.name = 'spot6';
  spot62.position.set(0.1971, 0.5996, -0.3596);
  spot62.rotation.set(deg(-6.7756), deg(0.1073), deg(-1.8116));
  spot62.scale.set(1, 0.3, 1);
  sideCap1.add(spot62);
  const sideStem2 = new THREE.Mesh(new THREE.CylinderGeometry(0.1448, 0.1609, 1.0865, 7), stalkMat);
  sideStem2.name = 'sideStem2';
  sideStem2.position.set(0.0147, 2.1979, 0.5614);
  sideStem2.rotation.set(deg(73.2898), deg(11.8967), deg(15.9467));
  root.add(sideStem2);
  const sideStem2Tip = new THREE.Mesh(new THREE.CylinderGeometry(0.1287, 0.1448, 0.8533, 7), stalkMat);
  sideStem2Tip.name = 'sideStem2Tip';
  sideStem2Tip.position.set(-0.1901, 2.5829, 1.2751);
  sideStem2Tip.rotation.set(deg(41.4486), deg(4.1523), deg(10.946));
  root.add(sideStem2Tip);
  const sideCap2 = new THREE.Group();
  sideCap2.name = 'sideCap2';
  sideCap2.position.set(-0.2617, 2.7708, 1.5249);
  sideCap2.rotation.set(deg(13.482), deg(0.4534), deg(3.8347));
  root.add(sideCap2);
  const cap3 = new THREE.Mesh(lathe([[0.8451, -0.0261], [0.8712, 0.0523], [0.8015, 0.2091], [0.6273, 0.3833], [0.3659, 0.5053], [0, 0.5489]], 12), capMat);
  cap3.name = 'cap';
  sideCap2.add(cap3);
  const gills3 = new THREE.Mesh(lathe([[0.1126, 0.1917], [0.4356, 0.0871], [0.8451, -0.0261]], 12), gillMat);
  gills3.name = 'gills';
  sideCap2.add(gills3);
  const spot13 = new THREE.Mesh(new THREE.SphereGeometry(0.0867, 7, 3), spotMat);
  spot13.name = 'spot1';
  spot13.position.set(0.6197, 0.3814, -0.0355);
  spot13.rotation.set(deg(-10.7603), deg(4.3767), deg(-44.1691));
  spot13.scale.set(1, 0.3, 1);
  sideCap2.add(spot13);
  const spot23 = new THREE.Mesh(new THREE.SphereGeometry(0.0709, 7, 3), spotMat);
  spot23.name = 'spot2';
  spot23.position.set(0.0851, 0.5162, 0.2518);
  spot23.rotation.set(deg(6.7918), deg(-0.1078), deg(-1.8159));
  spot23.scale.set(1, 0.3, 1);
  sideCap2.add(spot23);
  const spot33 = new THREE.Mesh(new THREE.SphereGeometry(0.0946, 7, 3), spotMat);
  spot33.name = 'spot3';
  spot33.position.set(-0.2235, 0.4417, 0.4424);
  spot33.rotation.set(deg(24.8576), deg(1.4268), deg(6.4673));
  spot33.scale.set(1, 0.3, 1);
  sideCap2.add(spot33);
  const spot43 = new THREE.Mesh(new THREE.SphereGeometry(0.0902, 7, 3), spotMat);
  spot43.name = 'spot4';
  spot43.position.set(-0.3777, 0.4973, 0.0199);
  spot43.rotation.set(deg(6.4673), deg(1.4268), deg(24.8576));
  spot43.scale.set(1, 0.3, 1);
  sideCap2.add(spot43);
  const spot53 = new THREE.Mesh(new THREE.SphereGeometry(0.0723, 7, 3), spotMat);
  spot53.name = 'spot5';
  spot53.position.set(-0.104, 0.4388, -0.4806);
  spot53.rotation.set(deg(-24.8576), deg(-1.4268), deg(6.4673));
  spot53.scale.set(1, 0.3, 1);
  sideCap2.add(spot53);
  const spot63 = new THREE.Mesh(new THREE.SphereGeometry(0.0626, 7, 3), spotMat);
  spot63.name = 'spot6';
  spot63.position.set(0.2801, 0.4975, -0.2425);
  spot63.rotation.set(deg(-17.9396), deg(2.8544), deg(-17.9396));
  spot63.scale.set(1, 0.3, 1);
  sideCap2.add(spot63);
  const root1 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root1.name = 'root1';
  root1.position.set(0.3871, 0.143, 0.2947);
  root1.rotation.set(deg(32.2653), deg(-31.5055), deg(-88.5617));
  root.add(root1);
  const root2 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root2.name = 'root2';
  root2.position.set(-0.2402, 0.143, 0.6211);
  root2.rotation.set(deg(104.0115), deg(8.6637), deg(6.7725));
  root.add(root2);
  const root3 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root3.name = 'root3';
  root3.position.set(-0.7486, 0.143, -0.2249);
  root3.rotation.set(deg(-22.5262), deg(-24.9536), deg(96.0234));
  root.add(root3);
  const root4 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root4.name = 'root4';
  root4.position.set(-0.0324, 0.143, -0.6115);
  root4.rotation.set(deg(-102.0356), deg(15.0769), deg(-12.2256));
  root.add(root4);
  const babyMushroom1 = new THREE.Group();
  babyMushroom1.name = 'babyMushroom1';
  babyMushroom1.position.set(1.1172, 0.0077, 0.6312);
  babyMushroom1.rotation.set(deg(-8.2994), deg(299.0295), deg(-2.5648));
  root.add(babyMushroom1);
  const stem = new THREE.Mesh(new THREE.CylinderGeometry(0.0528, 0.0731, 0.4061, 6), stalkMat);
  stem.name = 'stem';
  stem.position.set(0, 0.2031, 0);
  babyMushroom1.add(stem);
  const cap4 = new THREE.Mesh(new THREE.SphereGeometry(0.1705, 8, 3, 0, Math.PI * 2, 0, Math.PI / 2), spotMat);
  cap4.name = 'cap';
  cap4.position.set(0, 0.3654, 0);
  cap4.scale.set(1, 0.75, 1);
  babyMushroom1.add(cap4);
  const babyMushroom2 = new THREE.Group();
  babyMushroom2.name = 'babyMushroom2';
  babyMushroom2.position.set(-1.6388, 0.0067, -0.4437);
  babyMushroom2.rotation.set(deg(6.8698), deg(357.6838), deg(-0.6519));
  root.add(babyMushroom2);
  const stem2 = new THREE.Mesh(new THREE.CylinderGeometry(0.0405, 0.0561, 0.3119, 6), stalkMat);
  stem2.name = 'stem';
  stem2.position.set(0, 0.156, 0);
  babyMushroom2.add(stem2);
  const cap5 = new THREE.Mesh(new THREE.SphereGeometry(0.131, 8, 3, 0, Math.PI * 2, 0, Math.PI / 2), spotMat);
  cap5.name = 'cap';
  cap5.position.set(0, 0.2807, 0);
  cap5.scale.set(1, 0.75, 1);
  babyMushroom2.add(cap5);
  const babyMushroom3 = new THREE.Group();
  babyMushroom3.name = 'babyMushroom3';
  babyMushroom3.position.set(-0.6436, 0.0026, -1.0128);
  babyMushroom3.rotation.set(deg(3.5432), deg(277.8287), deg(5.4572));
  root.add(babyMushroom3);
  const stem3 = new THREE.Mesh(new THREE.CylinderGeometry(0.0572, 0.0791, 0.4397, 6), stalkMat);
  stem3.name = 'stem';
  stem3.position.set(0, 0.2199, 0);
  babyMushroom3.add(stem3);
  const cap6 = new THREE.Mesh(new THREE.SphereGeometry(0.1847, 8, 3, 0, Math.PI * 2, 0, Math.PI / 2), spotMat);
  cap6.name = 'cap';
  cap6.position.set(0, 0.3957, 0);
  cap6.scale.set(1, 0.75, 1);
  babyMushroom3.add(cap6);

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

export default createMushroomTree;

평점 및 댓글

—
아직 평점이 없어요 — 첫 평점을 남겨 보세요.
5
0
4
0
3
0
2
0
1
0

평점과 댓글을 남기려면 로그인하세요.

댓글 0개

아직 댓글이 없어요. 이 모델을 어떻게 사용했는지, 어떤 점이 더 나아질 수 있을지 공유해 주세요.

관련 모델

같은 카테고리 또는 비슷한 태그