1740 ポリゴン4.16 × 5.74 × 4.23 m
コードで使う
エディターでリミックスmushroom-tree.js · 318 行
自己完結型の ES モジュールで、依存先は three のみです。ファクトリー関数を呼び出し、返された group をシーンに追加してください。
/**
* 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;
評価とコメント
0 件のコメント
まだコメントはありません。このモデルの使い方や改善できる点を共有しましょう。
関連モデル
同じカテゴリまたは似たタグ









