2000 三角面4.68 × 3.78 × 5.39 m
在代码中使用
在编辑器中改编waterfall.js · 756 行
自包含的 ES 模块,仅依赖 three。调用工厂函数,然后把返回的 group 添加到场景中。
/**
* Waterfall — Codels 3D model library
* License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
* Triangles: 2,000 · Size (W × H × D): 4.68 × 3.78 × 5.39 m
*
* Usage:
* import { createWaterfall } from './waterfall.js';
*
* const model = createWaterfall();
* model.position.set(0, 0, 0);
* scene.add(model);
*/
import * as THREE from 'three';
const deg = THREE.MathUtils.degToRad;
// Deterministic vertex displacement (organic low-poly look).
function jitter(geometry, amount, seed) {
const pos = geometry.attributes.position;
const h = (a, b, c, s) => {
let x = Math.imul(a, 73856093) ^ Math.imul(b, 19349663) ^ Math.imul(c, 83492791) ^ Math.imul(s, 2654435761);
x = Math.imul(x ^ (x >>> 16), 2246822507);
x = Math.imul(x ^ (x >>> 13), 3266489909);
return ((x ^ (x >>> 16)) >>> 0) / 4294967295 - 0.5;
};
for (let i = 0; i < pos.count; i++) {
const x = pos.getX(i), y = pos.getY(i), z = pos.getZ(i);
const qx = Math.round(x * 1000), qy = Math.round(y * 1000), qz = Math.round(z * 1000);
pos.setXYZ(i, x + h(qx, qy, qz, seed) * 2 * amount, y + h(qx, qy, qz, seed + 1) * 2 * amount, z + h(qx, qy, qz, seed + 2) * 2 * amount);
}
pos.needsUpdate = true;
geometry.computeVertexNormals();
return geometry;
}
// 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);
}
// 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 createWaterfall() {
const root = new THREE.Group();
root.name = 'Waterfall';
// Materials
const fallMat = new THREE.MeshStandardMaterial({ name: 'fall', color: 0x7cc8f0, roughness: 0.1, emissive: 0x51829c, emissiveIntensity: 0.35, transparent: true, opacity: 0.85, flatShading: true });
const poolMat = new THREE.MeshStandardMaterial({ name: 'pool', color: 0x5d96b4, roughness: 0.06, metalness: 0.1, transparent: true, opacity: 0.85, flatShading: true });
const foamMat = new THREE.MeshStandardMaterial({ name: 'foam', color: 0xf4fbff, roughness: 0.4, emissive: 0xbfe6ff, emissiveIntensity: 0.25, flatShading: true });
const grassMat = new THREE.MeshStandardMaterial({ name: 'grass', color: 0x6aae45, roughness: 0.9, flatShading: true });
const grassDarkMat = new THREE.MeshStandardMaterial({ name: 'grassDark', color: 0x5b8836, roughness: 0.9, flatShading: true });
const rockMat = new THREE.MeshStandardMaterial({ name: 'rock', color: 0x857868, roughness: 0.92, flatShading: true });
const rockLightMat = new THREE.MeshStandardMaterial({ name: 'rockLight', color: 0x9b8c79, roughness: 0.9, flatShading: true });
const rockDarkMat = new THREE.MeshStandardMaterial({ name: 'rockDark', color: 0x6c6053, roughness: 0.95, flatShading: true });
const deepMat = new THREE.MeshStandardMaterial({ name: 'deep', color: 0x3d5a52, roughness: 0.95, flatShading: true });
const cattailMat = new THREE.MeshStandardMaterial({ name: 'cattail', color: 0x6b4528, roughness: 0.9, flatShading: true });
// Shared geometries
const boxGeo = new THREE.BoxGeometry(1.48, 0.12, 2.22);
// Parts
const core = new THREE.Mesh(new THREE.BoxGeometry(4.48, 3.33, 1.8), rockDarkMat);
core.name = 'core';
core.position.set(0, 1.665, -1.25);
root.add(core);
const cliff = new THREE.Group();
cliff.name = 'cliff';
root.add(cliff);
const ledge11 = new THREE.Mesh(extrude([[-2.2, 0], [0.1801, 0], [0.2641, 0.2669], [0.2221, 0.5406], [0.096, 0.6982], [-2.2, 0.6982]], 1.8396), rockLightMat);
ledge11.name = 'ledge1_1';
ledge11.position.set(-1.3802, 0, 0);
ledge11.rotation.set(0, deg(-90), 0);
cliff.add(ledge11);
const ledge12 = new THREE.Mesh(extrude([[-2.2, 0], [-0.0014, 0], [0.0958, 0.2918], [0.0472, 0.5525], [-0.0985, 0.6982], [-2.2, 0.6982]], 1.4224), rockMat);
ledge12.name = 'ledge1_2';
ledge12.position.set(0.1508, 0, 0);
ledge12.rotation.set(0, deg(-90), 0);
cliff.add(ledge12);
const ledge13 = new THREE.Mesh(extrude([[-2.2, 0], [0.0422, 0], [0.1113, 0.2336], [0.0767, 0.466], [-0.0269, 0.6982], [-2.2, 0.6982]], 1.538), rockDarkMat);
ledge13.name = 'ledge1_3';
ledge13.position.set(1.531, 0, 0);
ledge13.rotation.set(0, deg(-90), 0);
cliff.add(ledge13);
const ledge21 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [0.0433, 0], [0.1678, 0.3312], [0.1056, 0.6385], [-0.0812, 0.9631], [-2.2, 0.9631]], 1.5817), 0.06, 69), rockMat);
ledge21.name = 'ledge2_1';
ledge21.position.set(-1.5091, 0.6982, 0);
ledge21.rotation.set(0, deg(-90), 0);
cliff.add(ledge21);
const ledge22 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [0.0831, 0], [0.1801, 0.2931], [0.1316, 0.6413], [-0.0139, 0.9631], [-2.2, 0.9631]], 1.838), 0.06, 70), rockDarkMat);
ledge22.name = 'ledge2_2';
ledge22.position.set(0.1007, 0.6982, 0);
ledge22.rotation.set(0, deg(-90), 0);
cliff.add(ledge22);
const ledge23 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [-0.0478, 0], [0.0775, 0.2987], [0.0148, 0.7699], [-0.1731, 0.9631], [-2.2, 0.9631]], 1.3803), 0.06, 71), rockLightMat);
ledge23.name = 'ledge2_3';
ledge23.position.set(1.6099, 0.6982, 0);
ledge23.rotation.set(0, deg(-90), 0);
cliff.add(ledge23);
const ledge31 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [-0.0808, 0], [0.0414, 0.3618], [-0.0197, 0.7096], [-0.2029, 0.9755], [-2.2, 0.9755]], 1.6357), 0.06, 76), rockDarkMat);
ledge31.name = 'ledge3_1';
ledge31.position.set(-1.4821, 1.6613, 0);
ledge31.rotation.set(0, deg(-90), 0);
cliff.add(ledge31);
const ledge32 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [0.0285, 0], [0.1141, 0.4071], [0.0713, 0.7202], [-0.057, 0.9755], [-2.2, 0.9755]], 1.5016), 0.06, 77), rockLightMat);
ledge32.name = 'ledge3_2';
ledge32.position.set(-0.0135, 1.6613, 0);
ledge32.rotation.set(0, deg(-90), 0);
cliff.add(ledge32);
const ledge33 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [0.0028, 0], [0.087, 0.4071], [0.0449, 0.7211], [-0.0814, 0.9755], [-2.2, 0.9755]], 1.6627), 0.06, 78), rockMat);
ledge33.name = 'ledge3_3';
ledge33.position.set(1.4686, 1.6613, 0);
ledge33.rotation.set(0, deg(-90), 0);
cliff.add(ledge33);
const ledge41 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [-0.0095, 0], [0.0666, 0.2895], [0.0286, 0.5011], [-0.0857, 0.7432], [-2.2, 0.7432]], 1.2417), 0.052, 83), rockLightMat);
ledge41.name = 'ledge4_1';
ledge41.position.set(-1.6791, 2.6368, 0);
ledge41.rotation.set(0, deg(-90), 0);
cliff.add(ledge41);
const ledge42 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [-0.2052, 0], [-0.1237, 0.2762], [-0.1645, 0.4911], [-0.2866, 0.7432], [-2.2, 0.7432]], 1.3127), 0.052, 84), rockMat);
ledge42.name = 'ledge4_2';
ledge42.position.set(-0.5019, 2.6368, 0);
ledge42.rotation.set(0, deg(-90), 0);
cliff.add(ledge42);
const ledge43 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [-0.2079, 0], [-0.1271, 0.2471], [-0.1675, 0.5391], [-0.2887, 0.7432], [-2.2, 0.7432]], 1.2621), 0.052, 85), rockDarkMat);
ledge43.name = 'ledge4_3';
ledge43.position.set(0.6855, 2.6368, 0);
ledge43.rotation.set(0, deg(-90), 0);
cliff.add(ledge43);
const ledge44 = new THREE.Mesh(jitter(extrude([[-2.2, 0], [-0.0843, 0], [0.0181, 0.2577], [-0.0331, 0.5611], [-0.1866, 0.7432], [-2.2, 0.7432]], 1.0834), 0.052, 86), rockLightMat);
ledge44.name = 'ledge4_4';
ledge44.position.set(1.7583, 2.6368, 0);
ledge44.rotation.set(0, deg(-90), 0);
cliff.add(ledge44);
const grassLeft = new THREE.Mesh(boxGeo, grassMat);
grassLeft.name = 'grassLeft';
grassLeft.position.set(-1.56, 3.44, -1.09);
root.add(grassLeft);
const grassRight = new THREE.Mesh(boxGeo, grassMat);
grassRight.name = 'grassRight';
grassRight.position.set(1.56, 3.44, -1.09);
root.add(grassRight);
const channelBed = new THREE.Mesh(new THREE.BoxGeometry(1.64, 0.072, 2.22), rockDarkMat);
channelBed.name = 'channelBed';
channelBed.position.set(0, 3.354, -1.09);
root.add(channelBed);
const stream = new THREE.Mesh(new THREE.BoxGeometry(1.4, 0.06, 2.2), fallMat);
stream.name = 'stream';
stream.position.set(0, 3.43, -1.1);
root.add(stream);
const banks = new THREE.Group();
banks.name = 'banks';
root.add(banks);
const bankRockL1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2187, 0), 0.0328, 10), rockLightMat);
bankRockL1.name = 'bankRockL1';
bankRockL1.position.set(-0.8856, 3.5794, -1.5633);
bankRockL1.rotation.set(0, deg(24.8657), 0);
bankRockL1.scale.set(1, 0.7, 1.3);
banks.add(bankRockL1);
const bankRockL2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2175, 0), 0.0326, 11), rockMat);
bankRockL2.name = 'bankRockL2';
bankRockL2.position.set(-0.8852, 3.5752, -0.99);
bankRockL2.rotation.set(0, deg(56.8479), 0);
bankRockL2.scale.set(1, 0.7, 1.3);
banks.add(bankRockL2);
const bankRockL3 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2346, 0), 0.0352, 12), rockLightMat);
bankRockL3.name = 'bankRockL3';
bankRockL3.position.set(-0.8904, 3.5912, -0.4167);
bankRockL3.rotation.set(0, deg(50.8729), 0);
bankRockL3.scale.set(1, 0.7, 1.3);
banks.add(bankRockL3);
const bankRockR1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2386, 0), 0.0358, 20), rockLightMat);
bankRockR1.name = 'bankRockR1';
bankRockR1.position.set(0.8916, 3.5985, -1.5633);
bankRockR1.rotation.set(0, deg(72.0841), 0);
bankRockR1.scale.set(1, 0.7, 1.3);
banks.add(bankRockR1);
const bankRockR2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.233, 0), 0.035, 21), rockMat);
bankRockR2.name = 'bankRockR2';
bankRockR2.position.set(0.8899, 3.5662, -0.99);
bankRockR2.rotation.set(0, deg(18.4431), 0);
bankRockR2.scale.set(1, 0.7, 1.3);
banks.add(bankRockR2);
const bankRockR3 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.1693, 0), 0.0254, 22), rockLightMat);
bankRockR3.name = 'bankRockR3';
bankRockR3.position.set(0.8708, 3.5431, -0.4167);
bankRockR3.rotation.set(0, deg(24.2278), 0);
bankRockR3.scale.set(1, 0.7, 1.3);
banks.add(bankRockR3);
const waterSheet = new THREE.Mesh(extrude([[0, 3.46], [0.3088, 3.38], [0.4925, 3.11], [0.545, 2.61], [0.545, 0.22], [0.475, 0.22], [0.475, 2.61], [0.4225, 3.08], [0.2825, 3.33], [0, 3.39]], 1.4), fallMat);
waterSheet.name = 'waterSheet';
waterSheet.rotation.set(0, deg(-90), 0);
root.add(waterSheet);
const streaks = new THREE.Group();
streaks.name = 'streaks';
root.add(streaks);
const streak1 = new THREE.Mesh(new THREE.BoxGeometry(0.0271, 0.4339, 0.012), foamMat);
streak1.name = 'streak1';
streak1.position.set(-0.5711, 1.4631, 0.549);
streaks.add(streak1);
const streak2 = new THREE.Mesh(new THREE.BoxGeometry(0.0443, 1.2617, 0.012), foamMat);
streak2.name = 'streak2';
streak2.position.set(-0.3501, 1.1679, 0.549);
streaks.add(streak2);
const streak3 = new THREE.Mesh(new THREE.BoxGeometry(0.0269, 0.8646, 0.012), foamMat);
streak3.name = 'streak3';
streak3.position.set(-0.1877, 1.2477, 0.549);
streaks.add(streak3);
const streak4 = new THREE.Mesh(new THREE.BoxGeometry(0.0341, 0.9834, 0.012), foamMat);
streak4.name = 'streak4';
streak4.position.set(0.0336, 1.5023, 0.549);
streaks.add(streak4);
const streak5 = new THREE.Mesh(new THREE.BoxGeometry(0.0403, 0.5988, 0.012), foamMat);
streak5.name = 'streak5';
streak5.position.set(0.1499, 1.7439, 0.549);
streaks.add(streak5);
const streak6 = new THREE.Mesh(new THREE.BoxGeometry(0.0367, 1.3875, 0.012), foamMat);
streak6.name = 'streak6';
streak6.position.set(0.3535, 1.3681, 0.549);
streaks.add(streak6);
const streak7 = new THREE.Mesh(new THREE.BoxGeometry(0.0358, 0.9928, 0.012), foamMat);
streak7.name = 'streak7';
streak7.position.set(0.5895, 1.9018, 0.549);
streaks.add(streak7);
const lipFoam = new THREE.Mesh(new THREE.CylinderGeometry(0.05, 0.05, 1.344, 6), foamMat);
lipFoam.name = 'lipFoam';
lipFoam.position.set(0, 3.44, 0.2563);
lipFoam.rotation.set(0, 0, deg(90));
streaks.add(lipFoam);
const pool = new THREE.Group();
pool.name = 'pool';
pool.position.set(0, 0, 1.2264);
pool.scale.set(1, 1, 0.82);
root.add(pool);
const poolRim = new THREE.Mesh(lathe([[2.32, 0], [2.07, 0.14], [1.97, 0.36], [1.85, 0.37]], 16), grassMat);
poolRim.name = 'poolRim';
pool.add(poolRim);
const innerPool = new THREE.Mesh(lathe([[1.85, 0.37], [1.71, 0.3], [1.42, 0.14], [0.835, 0.03], [0, 0.03]], 16), deepMat);
innerPool.name = 'innerPool';
pool.add(innerPool);
const poolWater = new THREE.Mesh(new THREE.CylinderGeometry(1.73, 1.73, 0.21, 16), poolMat);
poolWater.name = 'poolWater';
poolWater.position.set(0, 0.155, 0);
pool.add(poolWater);
const splash = new THREE.Group();
splash.name = 'splash';
root.add(splash);
const foamRing = new THREE.Mesh(new THREE.TorusGeometry(0.588, 0.05, 4, 14), foamMat);
foamRing.name = 'foamRing';
foamRing.position.set(0, 0.26, 0.63);
foamRing.rotation.set(deg(90), 0, 0);
foamRing.scale.set(1.25, 0.75, 1);
splash.add(foamRing);
const foam1 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.1628, 0), 0.0195, 3), foamMat);
foam1.name = 'foam1';
foam1.position.set(-0.5887, 0.2844, 0.5606);
foam1.scale.set(1.2, 0.6, 1);
splash.add(foam1);
const foam2 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.1165, 0), 0.014, 4), foamMat);
foam2.name = 'foam2';
foam2.position.set(-0.5024, 0.2775, 0.6284);
foam2.scale.set(1.2, 0.6, 1);
splash.add(foam2);
const foam3 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.1391, 0), 0.0167, 5), foamMat);
foam3.name = 'foam3';
foam3.position.set(-0.3222, 0.2809, 0.5721);
foam3.scale.set(1.2, 0.6, 1);
splash.add(foam3);
const foam4 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.1519, 0), 0.0182, 6), foamMat);
foam4.name = 'foam4';
foam4.position.set(-0.1453, 0.2828, 0.5277);
foam4.scale.set(1.2, 0.6, 1);
splash.add(foam4);
const foam5 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.13, 0), 0.0156, 7), foamMat);
foam5.name = 'foam5';
foam5.position.set(0.0434, 0.2795, 0.5365);
foam5.scale.set(1.2, 0.6, 1);
splash.add(foam5);
const foam6 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.1689, 0), 0.0203, 8), foamMat);
foam6.name = 'foam6';
foam6.position.set(0.2858, 0.2853, 0.6309);
foam6.scale.set(1.2, 0.6, 1);
splash.add(foam6);
const foam7 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.1209, 0), 0.0145, 9), foamMat);
foam7.name = 'foam7';
foam7.position.set(0.4057, 0.2781, 0.5642);
foam7.scale.set(1.2, 0.6, 1);
splash.add(foam7);
const foam8 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.1123, 0), 0.0135, 10), foamMat);
foam8.name = 'foam8';
foam8.position.set(0.6938, 0.2768, 0.5164);
foam8.scale.set(1.2, 0.6, 1);
splash.add(foam8);
const dressing = new THREE.Group();
dressing.name = 'dressing';
root.add(dressing);
const boulder1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4326, 0), 0.0649, 22), rockMat);
boulder1.name = 'boulder1';
boulder1.position.set(-1.6795, 0.447, 0.3821);
boulder1.rotation.set(0, deg(61.3397), 0);
boulder1.scale.set(1.15, 0.85, 1);
dressing.add(boulder1);
const boulder2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.3708, 0), 0.0556, 23), rockDarkMat);
boulder2.name = 'boulder2';
boulder2.position.set(1.7288, 0.3888, 0.4519);
boulder2.rotation.set(0, deg(82.9889), 0);
boulder2.scale.set(1.15, 0.85, 1);
dressing.add(boulder2);
const boulder3 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2472, 0), 0.0371, 24), rockMat);
boulder3.name = 'boulder3';
boulder3.position.set(-1.5683, 0.2673, 2.204);
boulder3.rotation.set(0, deg(82.7079), 0);
boulder3.scale.set(1.15, 0.85, 1);
dressing.add(boulder3);
const boulder4 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2884, 0), 0.0433, 25), rockDarkMat);
boulder4.name = 'boulder4';
boulder4.position.set(1.4414, 0.3011, 2.3275);
boulder4.rotation.set(0, deg(23.8625), 0);
boulder4.scale.set(1.15, 0.85, 1);
dressing.add(boulder4);
const reedsL = new THREE.Group();
reedsL.name = 'reedsL';
reedsL.position.set(-1.7097, 0.3, 1.7381);
dressing.add(reedsL);
const cylinder57 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7491, 4), grassDarkMat);
cylinder57.position.set(0.1076, 0.3719, 0.0394);
cylinder57.rotation.set(deg(2.3478), deg(-0.1318), deg(-6.4238));
reedsL.add(cylinder57);
const capsule58 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1537, 1, 6), cattailMat);
capsule58.position.set(0.1517, 0.7629, 0.0555);
capsule58.rotation.set(deg(2.3478), deg(-0.1318), deg(-6.4238));
reedsL.add(capsule58);
const cylinder59 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1152, 3), grassDarkMat);
cylinder59.position.set(0.17, 0.925, 0.0622);
cylinder59.rotation.set(deg(2.3478), deg(-0.1318), deg(-6.4238));
reedsL.add(cylinder59);
const cone60 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.5255, 3), grassDarkMat);
cone60.position.set(0.1155, 0.2517, 0.0808);
cone60.rotation.set(deg(22.5876), deg(41.6372), deg(-14.6827));
cone60.scale.set(1, 1, 0.3);
reedsL.add(cone60);
const cylinder61 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7171, 4), grassDarkMat);
cylinder61.position.set(-0.0421, 0.356, 0.1046);
cylinder61.rotation.set(deg(6.3453), deg(0.1414), deg(2.551));
reedsL.add(cylinder61);
const capsule62 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1471, 1, 6), cattailMat);
capsule62.position.set(-0.0589, 0.7302, 0.1462);
capsule62.rotation.set(deg(6.3453), deg(0.1414), deg(2.551));
reedsL.add(capsule62);
const cylinder63 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1103, 3), grassDarkMat);
cylinder63.position.set(-0.0658, 0.8854, 0.1635);
cylinder63.rotation.set(deg(6.3453), deg(0.1414), deg(2.551));
reedsL.add(cylinder63);
const cone64 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.487, 3), grassDarkMat);
cone64.position.set(-0.0802, 0.2332, 0.1094);
cone64.rotation.set(deg(-41.1423), deg(73.8698), deg(53.0387));
cone64.scale.set(1, 1, 0.3);
reedsL.add(cone64);
const cone65 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.5351, 3), grassDarkMat);
cone65.position.set(-0.142, 0.2563, 0.0091);
cone65.rotation.set(deg(-45.774), deg(66.525), deg(45.2694));
cone65.scale.set(1, 1, 0.3);
reedsL.add(cone65);
const cone66 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.6967, 3), grassDarkMat);
cone66.position.set(0.0983, 0.3337, -0.1325);
cone66.rotation.set(deg(-0.3287), deg(40.8515), deg(-16.4824));
cone66.scale.set(1, 1, 0.3);
reedsL.add(cone66);
const reedsR = new THREE.Group();
reedsR.name = 'reedsR';
reedsR.position.set(1.5516, 0.3, 2.0065);
dressing.add(reedsR);
const cylinder68 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.755, 4), grassDarkMat);
cylinder68.position.set(0.1135, 0.3748, 0.0181);
cylinder68.rotation.set(deg(1.075), deg(-0.0635), deg(-6.757));
reedsR.add(cylinder68);
const capsule69 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1549, 1, 6), cattailMat);
capsule69.position.set(0.1602, 0.7688, 0.0255);
capsule69.rotation.set(deg(1.075), deg(-0.0635), deg(-6.757));
reedsR.add(capsule69);
const cylinder70 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1162, 3), grassDarkMat);
cylinder70.position.set(0.1796, 0.9322, 0.0286);
cylinder70.rotation.set(deg(1.075), deg(-0.0635), deg(-6.757));
reedsR.add(cylinder70);
const cone71 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.6617, 3), grassDarkMat);
cone71.position.set(0.1443, 0.3169, 0.0692);
cone71.rotation.set(deg(40.5144), deg(65.0499), deg(-32.6104));
cone71.scale.set(1, 1, 0.3);
reedsR.add(cone71);
const cylinder72 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.6748, 4), grassDarkMat);
cylinder72.position.set(-0.005, 0.335, 0.1101);
cylinder72.rotation.set(deg(6.8356), deg(0.0186), deg(0.3116));
reedsR.add(cylinder72);
const capsule73 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1384, 1, 6), cattailMat);
capsule73.position.set(-0.007, 0.6872, 0.1523);
capsule73.rotation.set(deg(6.8356), deg(0.0186), deg(0.3116));
reedsR.add(capsule73);
const cylinder74 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1038, 3), grassDarkMat);
cylinder74.position.set(-0.0078, 0.8333, 0.1698);
cylinder74.rotation.set(deg(6.8356), deg(0.0186), deg(0.3116));
reedsR.add(cylinder74);
const cone75 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.558, 3), grassDarkMat);
cone75.position.set(-0.0448, 0.2672, 0.1385);
cone75.rotation.set(deg(5.9505), deg(44.1958), deg(12.0052));
cone75.scale.set(1, 1, 0.3);
reedsR.add(cone75);
const cone76 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.569, 3), grassDarkMat);
cone76.position.set(-0.1469, 0.2725, 0.0059);
cone76.rotation.set(deg(-8.2731), deg(16.5854), deg(17.1221));
cone76.scale.set(1, 1, 0.3);
reedsR.add(cone76);
const cone77 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.4779, 3), grassDarkMat);
cone77.position.set(0.0041, 0.2289, -0.1343);
cone77.rotation.set(deg(-14.7013), deg(16.4889), deg(-4.806));
cone77.scale.set(1, 1, 0.3);
reedsR.add(cone77);
const topTuft1 = new THREE.Group();
topTuft1.name = 'topTuft1';
topTuft1.position.set(-2.076, 3.5, -1.5205);
dressing.add(topTuft1);
const cone79 = new THREE.Mesh(new THREE.ConeGeometry(0.0473, 0.2043, 3), grassDarkMat);
cone79.position.set(0.041, 0.0821, -0.0112);
cone79.rotation.set(deg(1.2125), deg(20.3961), deg(-12.9209));
cone79.scale.set(1, 1, 0.45);
topTuft1.add(cone79);
const cone80 = new THREE.Mesh(new THREE.ConeGeometry(0.0473, 0.252, 3), grassMat);
cone80.position.set(-0.0214, 0.106, 0.0367);
cone80.rotation.set(deg(-109.7335), deg(79.4874), deg(124.4321));
cone80.scale.set(1, 1, 0.45);
topTuft1.add(cone80);
const cone81 = new THREE.Mesh(new THREE.ConeGeometry(0.0473, 0.2388, 3), grassDarkMat);
cone81.position.set(-0.0225, 0.0994, -0.0361);
cone81.rotation.set(deg(-31.4872), deg(56.5264), deg(18.1495));
cone81.scale.set(1, 1, 0.45);
topTuft1.add(cone81);
const topTuft2 = new THREE.Group();
topTuft2.name = 'topTuft2';
topTuft2.position.set(2.0119, 3.5, -1.5155);
dressing.add(topTuft2);
const cone83 = new THREE.Mesh(new THREE.ConeGeometry(0.0502, 0.2068, 3), grassDarkMat);
cone83.position.set(0.0423, 0.0834, 0.0161);
cone83.rotation.set(deg(122.4908), deg(78.8672), deg(-118.2758));
cone83.scale.set(1, 1, 0.45);
topTuft2.add(cone83);
const cone84 = new THREE.Mesh(new THREE.ConeGeometry(0.0502, 0.2527, 3), grassMat);
cone84.position.set(-0.0271, 0.1064, 0.0362);
cone84.rotation.set(deg(11.9475), deg(22.2464), deg(13.4023));
cone84.scale.set(1, 1, 0.45);
topTuft2.add(cone84);
const cone85 = new THREE.Mesh(new THREE.ConeGeometry(0.0502, 0.2721, 3), grassDarkMat);
cone85.position.set(-0.0082, 0.116, -0.0445);
cone85.rotation.set(deg(-33.4729), deg(85.2359), deg(23.2538));
cone85.scale.set(1, 1, 0.45);
topTuft2.add(cone85);
const topTuft3 = new THREE.Group();
topTuft3.name = 'topTuft3';
topTuft3.position.set(-1.9263, 3.5, -1.4343);
dressing.add(topTuft3);
const cone87 = new THREE.Mesh(new THREE.ConeGeometry(0.0551, 0.2943, 3), grassDarkMat);
cone87.position.set(0.0466, 0.1272, -0.0169);
cone87.rotation.set(deg(156.688), deg(62.0763), deg(-158.0258));
cone87.scale.set(1, 1, 0.45);
topTuft3.add(cone87);
const cone88 = new THREE.Mesh(new THREE.ConeGeometry(0.0551, 0.2668, 3), grassMat);
cone88.position.set(-0.0334, 0.1134, 0.0366);
cone88.rotation.set(deg(-102.864), deg(75.7786), deg(116.4359));
cone88.scale.set(1, 1, 0.45);
topTuft3.add(cone88);
const cone89 = new THREE.Mesh(new THREE.ConeGeometry(0.0551, 0.2842, 3), grassDarkMat);
cone89.position.set(-0.0348, 0.1221, -0.0353);
cone89.rotation.set(deg(-32.6499), deg(67.261), deg(24.7692));
cone89.scale.set(1, 1, 0.45);
topTuft3.add(cone89);
const topTuft4 = new THREE.Group();
topTuft4.name = 'topTuft4';
topTuft4.position.set(1.3981, 3.5, -0.7102);
dressing.add(topTuft4);
const cone91 = new THREE.Mesh(new THREE.ConeGeometry(0.0444, 0.1538, 3), grassDarkMat);
cone91.position.set(0.0355, 0.0569, 0.0184);
cone91.rotation.set(deg(9.314), deg(4.9657), deg(-15.0733));
cone91.scale.set(1, 1, 0.45);
topTuft4.add(cone91);
const cone92 = new THREE.Mesh(new THREE.ConeGeometry(0.0444, 0.206, 3), grassMat);
cone92.position.set(-0.0095, 0.083, 0.0389);
cone92.rotation.set(deg(12.8078), deg(11.8435), deg(3.3307));
cone92.scale.set(1, 1, 0.45);
topTuft4.add(cone92);
const cone93 = new THREE.Mesh(new THREE.ConeGeometry(0.0444, 0.2335, 3), grassDarkMat);
cone93.position.set(-0.0385, 0.0967, 0.011);
cone93.rotation.set(deg(-146.2633), deg(60.4151), deg(147.2719));
cone93.scale.set(1, 1, 0.45);
topTuft4.add(cone93);
const cone94 = new THREE.Mesh(new THREE.ConeGeometry(0.0444, 0.1758, 3), grassMat);
cone94.position.set(0.0111, 0.0679, -0.0384);
cone94.rotation.set(deg(5.3831), deg(78.5395), deg(-17.9516));
cone94.scale.set(1, 1, 0.45);
topTuft4.add(cone94);
const topTuft5 = new THREE.Group();
topTuft5.name = 'topTuft5';
topTuft5.position.set(-1.6484, 3.5, -1.3496);
dressing.add(topTuft5);
const cone96 = new THREE.Mesh(new THREE.ConeGeometry(0.0506, 0.2172, 3), grassDarkMat);
cone96.position.set(0.0454, 0.0886, 0.004);
cone96.rotation.set(deg(110.755), deg(77.3022), deg(-109.2304));
cone96.scale.set(1, 1, 0.45);
topTuft5.add(cone96);
const cone97 = new THREE.Mesh(new THREE.ConeGeometry(0.0506, 0.1916, 3), grassMat);
cone97.position.set(-0.018, 0.0758, 0.0419);
cone97.rotation.set(deg(14.3672), deg(29.2288), deg(9.0274));
cone97.scale.set(1, 1, 0.45);
topTuft5.add(cone97);
const cone98 = new THREE.Mesh(new THREE.ConeGeometry(0.0506, 0.2561, 3), grassDarkMat);
cone98.position.set(-0.0341, 0.108, -0.0302);
cone98.rotation.set(deg(-12.099), deg(16.0511), deg(10.577));
cone98.scale.set(1, 1, 0.45);
topTuft5.add(cone98);
const topTuft6 = new THREE.Group();
topTuft6.name = 'topTuft6';
topTuft6.position.set(1.8092, 3.5, -1.3236);
dressing.add(topTuft6);
const cone100 = new THREE.Mesh(new THREE.ConeGeometry(0.0582, 0.2427, 3), grassDarkMat);
cone100.position.set(0.05, 0.1013, -0.0157);
cone100.rotation.set(deg(7.1847), deg(45.48), deg(-14.3936));
cone100.scale.set(1, 1, 0.45);
topTuft6.add(cone100);
const cone101 = new THREE.Mesh(new THREE.ConeGeometry(0.0582, 0.3075, 3), grassMat);
cone101.position.set(-0.0437, 0.1337, 0.0289);
cone101.rotation.set(deg(-18.2155), deg(58.9006), deg(33.5109));
cone101.scale.set(1, 1, 0.45);
topTuft6.add(cone101);
const cone102 = new THREE.Mesh(new THREE.ConeGeometry(0.0582, 0.3031, 3), grassDarkMat);
cone102.position.set(-0.0392, 0.1316, -0.0347);
cone102.rotation.set(deg(-8.7805), deg(0.0392), deg(9.7877));
cone102.scale.set(1, 1, 0.45);
topTuft6.add(cone102);
const topTuft7 = new THREE.Group();
topTuft7.name = 'topTuft7';
topTuft7.position.set(-1.5679, 3.5, -1.6517);
dressing.add(topTuft7);
const cone104 = new THREE.Mesh(new THREE.ConeGeometry(0.0622, 0.255, 3), grassDarkMat);
cone104.position.set(0.0553, 0.1075, -0.0088);
cone104.rotation.set(deg(-1.4771), deg(4.1123), deg(-16.514));
cone104.scale.set(1, 1, 0.45);
topTuft7.add(cone104);
const cone105 = new THREE.Mesh(new THREE.ConeGeometry(0.0622, 0.2902, 3), grassMat);
cone105.position.set(0.01, 0.1251, 0.0551);
cone105.rotation.set(deg(-173.9582), deg(69.6906), deg(-173.8948));
cone105.scale.set(1, 1, 0.45);
topTuft7.add(cone105);
const cone106 = new THREE.Mesh(new THREE.ConeGeometry(0.0622, 0.2982, 3), grassDarkMat);
cone106.position.set(-0.0496, 0.1291, 0.0261);
cone106.rotation.set(deg(5.6255), deg(9.292), deg(15.3081));
cone106.scale.set(1, 1, 0.45);
topTuft7.add(cone106);
const cone107 = new THREE.Mesh(new THREE.ConeGeometry(0.0622, 0.2453, 3), grassMat);
cone107.position.set(-0.0167, 0.1027, -0.0535);
cone107.rotation.set(deg(-11.4417), deg(11.1279), deg(3.4024));
cone107.scale.set(1, 1, 0.45);
topTuft7.add(cone107);
const topTuft8 = new THREE.Group();
topTuft8.name = 'topTuft8';
topTuft8.position.set(1.8227, 3.5, -1.3546);
dressing.add(topTuft8);
const cone109 = new THREE.Mesh(new THREE.ConeGeometry(0.0615, 0.2556, 3), grassDarkMat);
cone109.position.set(0.0528, 0.1078, -0.0165);
cone109.rotation.set(deg(31.5558), deg(62.8211), deg(-40.3805));
cone109.scale.set(1, 1, 0.45);
topTuft8.add(cone109);
const cone110 = new THREE.Mesh(new THREE.ConeGeometry(0.0615, 0.2655, 3), grassMat);
cone110.position.set(-0.0152, 0.1128, 0.0532);
cone110.rotation.set(deg(-12.7995), deg(81.8488), deg(25.2993));
cone110.scale.set(1, 1, 0.45);
topTuft8.add(cone110);
const cone111 = new THREE.Mesh(new THREE.ConeGeometry(0.0615, 0.3004, 3), grassDarkMat);
cone111.position.set(-0.043, 0.1302, -0.0349);
cone111.rotation.set(deg(-18.1409), deg(18.6303), deg(16.1929));
cone111.scale.set(1, 1, 0.45);
topTuft8.add(cone111);
const rimTuft1 = new THREE.Group();
rimTuft1.name = 'rimTuft1';
rimTuft1.position.set(0.162, 0.33, 2.8775);
dressing.add(rimTuft1);
const cone113 = new THREE.Mesh(new THREE.ConeGeometry(0.0598, 0.1965, 3), grassDarkMat);
cone113.position.set(0.0538, 0.0782, 0.0013);
cone113.rotation.set(deg(11.6327), deg(42.0839), deg(-16.6379));
cone113.scale.set(1, 1, 0.45);
rimTuft1.add(cone113);
const cone114 = new THREE.Mesh(new THREE.ConeGeometry(0.0598, 0.317, 3), grassMat);
cone114.position.set(-0.0449, 0.1385, 0.0297);
cone114.rotation.set(deg(-62.8941), deg(80.6176), deg(69.0124));
cone114.scale.set(1, 1, 0.45);
rimTuft1.add(cone114);
const cone115 = new THREE.Mesh(new THREE.ConeGeometry(0.0598, 0.2764, 3), grassDarkMat);
cone115.position.set(-0.0306, 0.1182, -0.0443);
cone115.rotation.set(deg(-107.2729), deg(81.8599), deg(95.3377));
cone115.scale.set(1, 1, 0.45);
rimTuft1.add(cone115);
const rimTuft2 = new THREE.Group();
rimTuft2.name = 'rimTuft2';
rimTuft2.position.set(1.7075, 0.33, 2.1114);
dressing.add(rimTuft2);
const cone117 = new THREE.Mesh(new THREE.ConeGeometry(0.0424, 0.1832, 3), grassDarkMat);
cone117.position.set(0.0379, 0.0716, 0.0043);
cone117.rotation.set(deg(40.9547), deg(73.3003), deg(-40.9161));
cone117.scale.set(1, 1, 0.45);
rimTuft2.add(cone117);
const cone118 = new THREE.Mesh(new THREE.ConeGeometry(0.0424, 0.1606, 3), grassMat);
cone118.position.set(-0.003, 0.0603, 0.0381);
cone118.rotation.set(deg(17.8323), deg(43.3457), deg(2.0522));
cone118.scale.set(1, 1, 0.45);
rimTuft2.add(cone118);
const cone119 = new THREE.Mesh(new THREE.ConeGeometry(0.0424, 0.2166, 3), grassDarkMat);
cone119.position.set(-0.038, 0.0883, -0.0035);
cone119.rotation.set(deg(-8.378), deg(22.9428), deg(17.2104));
cone119.scale.set(1, 1, 0.45);
rimTuft2.add(cone119);
const cone120 = new THREE.Mesh(new THREE.ConeGeometry(0.0424, 0.2188, 3), grassMat);
cone120.position.set(0.0093, 0.0894, -0.037);
cone120.rotation.set(deg(2.2768), deg(77.7721), deg(-16.2115));
cone120.scale.set(1, 1, 0.45);
rimTuft2.add(cone120);
const rimTuft3 = new THREE.Group();
rimTuft3.name = 'rimTuft3';
rimTuft3.position.set(-1.6195, 0.33, 2.2164);
dressing.add(rimTuft3);
const cone122 = new THREE.Mesh(new THREE.ConeGeometry(0.0599, 0.233, 3), grassDarkMat);
cone122.position.set(0.0539, 0.0965, 0.002);
cone122.rotation.set(deg(72.9693), deg(73.2744), deg(-73.0655));
cone122.scale.set(1, 1, 0.45);
rimTuft3.add(cone122);
const cone123 = new THREE.Mesh(new THREE.ConeGeometry(0.0599, 0.2496, 3), grassMat);
cone123.position.set(0.0017, 0.1048, 0.0539);
cone123.rotation.set(deg(10.9409), deg(29.0587), deg(-0.3818));
cone123.scale.set(1, 1, 0.45);
rimTuft3.add(cone123);
const cone124 = new THREE.Mesh(new THREE.ConeGeometry(0.0599, 0.2646, 3), grassDarkMat);
cone124.position.set(-0.0536, 0.1123, -0.0059);
cone124.rotation.set(deg(-6.1047), deg(20.3267), deg(13.3477));
cone124.scale.set(1, 1, 0.45);
rimTuft3.add(cone124);
const cone125 = new THREE.Mesh(new THREE.ConeGeometry(0.0599, 0.2072, 3), grassMat);
cone125.position.set(0.0187, 0.0836, -0.0506);
cone125.rotation.set(deg(-18.6226), deg(6.6443), deg(-7.0853));
cone125.scale.set(1, 1, 0.45);
rimTuft3.add(cone125);
const rimTuft4 = new THREE.Group();
rimTuft4.name = 'rimTuft4';
rimTuft4.position.set(1.7631, 0.33, 2.0347);
dressing.add(rimTuft4);
const cone127 = new THREE.Mesh(new THREE.ConeGeometry(0.0447, 0.239, 3), grassDarkMat);
cone127.position.set(0.0397, 0.0995, 0.0065);
cone127.rotation.set(deg(104.2172), deg(79.0056), deg(-102.2136));
cone127.scale.set(1, 1, 0.45);
rimTuft4.add(cone127);
const cone128 = new THREE.Mesh(new THREE.ConeGeometry(0.0447, 0.1807, 3), grassMat);
cone128.position.set(0.0085, 0.0704, 0.0393);
cone128.rotation.set(deg(14.9078), deg(27.5547), deg(-3.2569));
cone128.scale.set(1, 1, 0.45);
rimTuft4.add(cone128);
const cone129 = new THREE.Mesh(new THREE.ConeGeometry(0.0447, 0.2347, 3), grassDarkMat);
cone129.position.set(-0.04, 0.0974, 0.0038);
cone129.rotation.set(deg(-81.5695), deg(75.0295), deg(83.2441));
cone129.scale.set(1, 1, 0.45);
rimTuft4.add(cone129);
const cone130 = new THREE.Mesh(new THREE.ConeGeometry(0.0447, 0.1594, 3), grassMat);
cone130.position.set(0.0032, 0.0597, -0.0401);
cone130.rotation.set(deg(-19.9307), deg(20.8736), deg(-1.7293));
cone130.scale.set(1, 1, 0.45);
rimTuft4.add(cone130);
const rimTuft5 = new THREE.Group();
rimTuft5.name = 'rimTuft5';
rimTuft5.position.set(-1.9858, 0.33, 1.5301);
dressing.add(rimTuft5);
const cone132 = new THREE.Mesh(new THREE.ConeGeometry(0.0472, 0.1877, 3), grassDarkMat);
cone132.position.set(0.0387, 0.0739, 0.0176);
cone132.rotation.set(deg(99.2052), deg(72.3159), deg(-90.8389));
cone132.scale.set(1, 1, 0.45);
rimTuft5.add(cone132);
const cone133 = new THREE.Mesh(new THREE.ConeGeometry(0.0472, 0.2052, 3), grassMat);
cone133.position.set(-0.0004, 0.0826, 0.0425);
cone133.rotation.set(deg(-163.8419), deg(77.9826), deg(179.3709));
cone133.scale.set(1, 1, 0.45);
rimTuft5.add(cone133);
const cone134 = new THREE.Mesh(new THREE.ConeGeometry(0.0472, 0.1859, 3), grassDarkMat);
cone134.position.set(-0.0422, 0.0729, 0.0051);
cone134.rotation.set(deg(-6.6129), deg(33.4986), deg(14.4356));
cone134.scale.set(1, 1, 0.45);
rimTuft5.add(cone134);
const cone135 = new THREE.Mesh(new THREE.ConeGeometry(0.0472, 0.2282, 3), grassMat);
cone135.position.set(0.0065, 0.0941, -0.042);
cone135.rotation.set(deg(29.2954), deg(85.8398), deg(-50.3866));
cone135.scale.set(1, 1, 0.45);
rimTuft5.add(cone135);
const rimTuft6 = new THREE.Group();
rimTuft6.name = 'rimTuft6';
rimTuft6.position.set(-1.9995, 0.33, 1.4617);
dressing.add(rimTuft6);
const cone137 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.1643, 3), grassDarkMat);
cone137.position.set(0.0347, 0.0621, 0.0098);
cone137.rotation.set(deg(8.3941), deg(11.5973), deg(-17.1018));
cone137.scale.set(1, 1, 0.45);
rimTuft6.add(cone137);
const cone138 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.1844, 3), grassMat);
cone138.position.set(-0.0126, 0.0722, 0.0338);
cone138.rotation.set(deg(-106.6499), deg(81.5383), deg(125.3097));
cone138.scale.set(1, 1, 0.45);
rimTuft6.add(cone138);
const cone139 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.1913, 3), grassDarkMat);
cone139.position.set(-0.0342, 0.0756, -0.0113);
cone139.rotation.set(deg(-18.5393), deg(50.6437), deg(18.6239));
cone139.scale.set(1, 1, 0.45);
rimTuft6.add(cone139);
const cone140 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.1634, 3), grassMat);
cone140.position.set(-0.0049, 0.0617, -0.0357);
cone140.rotation.set(deg(-23.3762), deg(51.0419), deg(4.3023));
cone140.scale.set(1, 1, 0.45);
rimTuft6.add(cone140);
const rimTuft7 = new THREE.Group();
rimTuft7.name = 'rimTuft7';
rimTuft7.position.set(1.6436, 0.33, 2.1893);
dressing.add(rimTuft7);
const cone142 = new THREE.Mesh(new THREE.ConeGeometry(0.055, 0.1953, 3), grassDarkMat);
cone142.position.set(0.0491, 0.0777, -0.0057);
cone142.rotation.set(deg(19.9781), deg(60.7097), deg(-24.1267));
cone142.scale.set(1, 1, 0.45);
rimTuft7.add(cone142);
const cone143 = new THREE.Mesh(new THREE.ConeGeometry(0.055, 0.2955, 3), grassMat);
cone143.position.set(-0.0172, 0.1277, 0.0464);
cone143.rotation.set(deg(-30.8681), deg(81.331), deg(49.2812));
cone143.scale.set(1, 1, 0.45);
rimTuft7.add(cone143);
const cone144 = new THREE.Mesh(new THREE.ConeGeometry(0.055, 0.2964, 3), grassDarkMat);
cone144.position.set(-0.0396, 0.1282, -0.0297);
cone144.rotation.set(deg(-12.3268), deg(30.6215), deg(10.5745));
cone144.scale.set(1, 1, 0.45);
rimTuft7.add(cone144);
root.traverse((o) => {
if (o.isMesh) {
o.castShadow = true;
o.receiveShadow = true;
}
});
return root;
}
export default createWaterfall;
评分与评论
0 条评论
暂无评论。分享一下你是如何使用这个模型的,或者有哪些可以改进的地方。
相关模型
同一分类或相似标签









