Codels
삼각형 1.7천개5.02 × 1.31 × 3.98 m

코드에서 사용하기

에디터에서 리믹스
독립형 ES 모듈이에요 — three에만 의존해요. 팩토리 함수를 호출하고 그룹을 씬에 추가하세요.
/**
 * Pond — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 1,674 · Size (W × H × D): 5.02 × 1.31 × 3.98 m
 *
 * Usage:
 *   import { createPond } from './pond.js';
 *   
 *   const model = createPond();
 *   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 createPond() {
  const root = new THREE.Group();
  root.name = 'Pond';

  // Materials
  const waterMat = new THREE.MeshStandardMaterial({ name: 'water', color: 0x3a8fd8, roughness: 0.06, metalness: 0.1, transparent: true, opacity: 0.85, flatShading: true });
  const grassMat = new THREE.MeshStandardMaterial({ name: 'grass', color: 0x6aae45, roughness: 0.9, flatShading: true });
  const sandMat = new THREE.MeshStandardMaterial({ name: 'sand', color: 0xd3b072, roughness: 0.95, flatShading: true });
  const deepMat = new THREE.MeshStandardMaterial({ name: 'deep', color: 0x3d5a52, roughness: 0.95, flatShading: true });
  const padMat = new THREE.MeshStandardMaterial({ name: 'pad', color: 0x4f9a3c, roughness: 0.7, flatShading: true });
  const lilyMat = new THREE.MeshStandardMaterial({ name: 'lily', color: 0xf7b6cf, roughness: 0.6, flatShading: true });
  const lilyInnerMat = new THREE.MeshStandardMaterial({ name: 'lilyInner', color: 0xfde3ee, roughness: 0.6, flatShading: true });
  const heartMat = new THREE.MeshStandardMaterial({ name: 'heart', color: 0xf4c23c, roughness: 0.6, flatShading: true });
  const rockMat = new THREE.MeshStandardMaterial({ name: 'rock', color: 0x928e86, roughness: 0.9, flatShading: true });
  const cattailMat = new THREE.MeshStandardMaterial({ name: 'cattail', color: 0x6b4528, roughness: 0.9, flatShading: true });

  // Shared geometries
  const octahedronGeo = new THREE.OctahedronGeometry(1, 0);

  // Parts
  const basin = new THREE.Group();
  basin.name = 'basin';
  basin.scale.set(1, 1, 0.78);
  root.add(basin);
  const rim = new THREE.Mesh(lathe([[2.55, 0], [2.35, 0.09], [2.2, 0.28], [2.05, 0.3], [1.8, 0.27]], 18), grassMat);
  rim.name = 'rim';
  basin.add(rim);
  const innerShore = new THREE.Mesh(lathe([[1.8, 0.27], [1.6, 0.225], [1.35, 0.12], [0.93, 0.07]], 18), sandMat);
  innerShore.name = 'innerShore';
  basin.add(innerShore);
  const innerDeep = new THREE.Mesh(lathe([[0.93, 0.07], [0.45, 0.02], [0, 0.02]], 18), deepMat);
  innerDeep.name = 'innerDeep';
  basin.add(innerDeep);
  const water = new THREE.Mesh(new THREE.CylinderGeometry(1.54, 1.54, 0.16, 18), waterMat);
  water.name = 'water';
  water.position.set(0, 0.12, 0);
  basin.add(water);
  const lilies = new THREE.Group();
  lilies.name = 'lilies';
  root.add(lilies);
  const lilyPad1 = new THREE.Group();
  lilyPad1.name = 'lilyPad1';
  lilyPad1.position.set(-0.8205, 0.2, 0.4503);
  lilyPad1.rotation.set(0, deg(11.8206), 0);
  lilies.add(lilyPad1);
  const pad = new THREE.Mesh(extrude([[0, 0], [0.1596, -0.0488], [0.1197, -0.1163], [0.0534, -0.1581], [-0.0247, -0.165], [-0.0973, -0.1356], [-0.1485, -0.0762], [-0.1669, 0], [-0.1485, 0.0762], [-0.0973, 0.1356], [-0.0247, 0.165], [0.0534, 0.1581], [0.1197, 0.1163], [0.1596, 0.0488]], 0.012), padMat);
  pad.name = 'pad';
  pad.position.set(0, 0.006, 0);
  pad.rotation.set(deg(-90), 0, 0);
  lilyPad1.add(pad);
  const waterLily1 = new THREE.Group();
  waterLily1.name = 'waterLily1';
  waterLily1.position.set(-0.7954, 0.212, 0.4503);
  waterLily1.rotation.set(0, deg(19.3769), 0);
  lilies.add(waterLily1);
  const octahedron10 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron10.position.set(0.0611, 0.0339, 0);
  octahedron10.rotation.set(0, 0, deg(-72));
  octahedron10.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron10);
  const octahedron11 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron11.position.set(0.0432, 0.0339, 0.0432);
  octahedron11.rotation.set(deg(45.7767), deg(-20.2118), deg(-45.7767));
  octahedron11.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron11);
  const octahedron12 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron12.position.set(0, 0.0339, 0.0611);
  octahedron12.rotation.set(deg(72), 0, 0);
  octahedron12.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron12);
  const octahedron13 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron13.position.set(-0.0432, 0.0339, 0.0432);
  octahedron13.rotation.set(deg(45.7767), deg(20.2118), deg(45.7767));
  octahedron13.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron13);
  const octahedron14 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron14.position.set(-0.0611, 0.0339, 0);
  octahedron14.rotation.set(0, 0, deg(72));
  octahedron14.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron14);
  const octahedron15 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron15.position.set(-0.0432, 0.0339, -0.0432);
  octahedron15.rotation.set(deg(-45.7767), deg(-20.2118), deg(45.7767));
  octahedron15.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron15);
  const octahedron16 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron16.position.set(0, 0.0339, -0.0611);
  octahedron16.rotation.set(deg(-72), 0, 0);
  octahedron16.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron16);
  const octahedron17 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron17.position.set(0.0432, 0.0339, -0.0432);
  octahedron17.rotation.set(deg(-45.7767), deg(20.2118), deg(-45.7767));
  octahedron17.scale.set(0.0283, 0.0642, 0.0103);
  waterLily1.add(octahedron17);
  const octahedron18 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron18.position.set(0.0288, 0.0603, 0.0166);
  octahedron18.rotation.set(deg(19.6731), deg(-6.3857), deg(-35.669));
  octahedron18.scale.set(0.0218, 0.0496, 0.0079);
  waterLily1.add(octahedron18);
  const octahedron19 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron19.position.set(0, 0.0603, 0.0332);
  octahedron19.rotation.set(deg(42), 0, 0);
  octahedron19.scale.set(0.0218, 0.0496, 0.0079);
  waterLily1.add(octahedron19);
  const octahedron20 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron20.position.set(-0.0288, 0.0603, 0.0166);
  octahedron20.rotation.set(deg(19.6731), deg(6.3857), deg(35.669));
  octahedron20.scale.set(0.0218, 0.0496, 0.0079);
  waterLily1.add(octahedron20);
  const octahedron21 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron21.position.set(-0.0288, 0.0603, -0.0166);
  octahedron21.rotation.set(deg(-19.6731), deg(-6.3857), deg(35.669));
  octahedron21.scale.set(0.0218, 0.0496, 0.0079);
  waterLily1.add(octahedron21);
  const octahedron22 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron22.position.set(0, 0.0603, -0.0332);
  octahedron22.rotation.set(deg(-42), 0, 0);
  octahedron22.scale.set(0.0218, 0.0496, 0.0079);
  waterLily1.add(octahedron22);
  const octahedron23 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron23.position.set(0.0288, 0.0603, -0.0166);
  octahedron23.rotation.set(deg(-19.6731), deg(6.3857), deg(-35.669));
  octahedron23.scale.set(0.0218, 0.0496, 0.0079);
  waterLily1.add(octahedron23);
  const cylinder24 = new THREE.Mesh(new THREE.CylinderGeometry(0.0257, 0.0304, 0.035, 6), heartMat);
  cylinder24.position.set(0, 0.0315, 0);
  waterLily1.add(cylinder24);
  const lilyPad2 = new THREE.Group();
  lilyPad2.name = 'lilyPad2';
  lilyPad2.position.set(0.0234, 0.2, -0.6939);
  lilyPad2.rotation.set(0, deg(252.5515), 0);
  lilies.add(lilyPad2);
  const pad2 = new THREE.Mesh(extrude([[0, 0], [0.1888, -0.0577], [0.1416, -0.1375], [0.0632, -0.187], [-0.0292, -0.1952], [-0.1151, -0.1604], [-0.1756, -0.0901], [-0.1974, 0], [-0.1756, 0.0901], [-0.1151, 0.1604], [-0.0292, 0.1952], [0.0632, 0.187], [0.1416, 0.1375], [0.1888, 0.0577]], 0.012), padMat);
  pad2.name = 'pad';
  pad2.position.set(0, 0.006, 0);
  pad2.rotation.set(deg(-90), 0, 0);
  lilyPad2.add(pad2);
  const lilyPad3 = new THREE.Group();
  lilyPad3.name = 'lilyPad3';
  lilyPad3.position.set(0.311, 0.2, 0.6092);
  lilyPad3.rotation.set(0, deg(351.7839), 0);
  lilies.add(lilyPad3);
  const pad3 = new THREE.Mesh(extrude([[0, 0], [0.1247, -0.0381], [0.0935, -0.0908], [0.0417, -0.1235], [-0.0193, -0.129], [-0.076, -0.1059], [-0.116, -0.0595], [-0.1304, 0], [-0.116, 0.0595], [-0.076, 0.1059], [-0.0193, 0.129], [0.0417, 0.1235], [0.0935, 0.0908], [0.1247, 0.0381]], 0.012), padMat);
  pad3.name = 'pad';
  pad3.position.set(0, 0.006, 0);
  pad3.rotation.set(deg(-90), 0, 0);
  lilyPad3.add(pad3);
  const waterLily3 = new THREE.Group();
  waterLily3.name = 'waterLily3';
  waterLily3.position.set(0.3305, 0.212, 0.6092);
  waterLily3.rotation.set(0, deg(59.1406), 0);
  lilies.add(waterLily3);
  const octahedron30 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron30.position.set(0.0477, 0.0265, 0);
  octahedron30.rotation.set(0, 0, deg(-72));
  octahedron30.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron30);
  const octahedron31 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron31.position.set(0.0338, 0.0265, 0.0338);
  octahedron31.rotation.set(deg(45.7767), deg(-20.2118), deg(-45.7767));
  octahedron31.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron31);
  const octahedron32 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron32.position.set(0, 0.0265, 0.0477);
  octahedron32.rotation.set(deg(72), 0, 0);
  octahedron32.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron32);
  const octahedron33 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron33.position.set(-0.0338, 0.0265, 0.0338);
  octahedron33.rotation.set(deg(45.7767), deg(20.2118), deg(45.7767));
  octahedron33.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron33);
  const octahedron34 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron34.position.set(-0.0477, 0.0265, 0);
  octahedron34.rotation.set(0, 0, deg(72));
  octahedron34.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron34);
  const octahedron35 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron35.position.set(-0.0338, 0.0265, -0.0338);
  octahedron35.rotation.set(deg(-45.7767), deg(-20.2118), deg(45.7767));
  octahedron35.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron35);
  const octahedron36 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron36.position.set(0, 0.0265, -0.0477);
  octahedron36.rotation.set(deg(-72), 0, 0);
  octahedron36.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron36);
  const octahedron37 = new THREE.Mesh(octahedronGeo, lilyMat);
  octahedron37.position.set(0.0338, 0.0265, -0.0338);
  octahedron37.rotation.set(deg(-45.7767), deg(20.2118), deg(-45.7767));
  octahedron37.scale.set(0.0221, 0.0502, 0.008);
  waterLily3.add(octahedron37);
  const octahedron38 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron38.position.set(0.0225, 0.0471, 0.013);
  octahedron38.rotation.set(deg(19.6731), deg(-6.3857), deg(-35.669));
  octahedron38.scale.set(0.0171, 0.0388, 0.0062);
  waterLily3.add(octahedron38);
  const octahedron39 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron39.position.set(0, 0.0471, 0.026);
  octahedron39.rotation.set(deg(42), 0, 0);
  octahedron39.scale.set(0.0171, 0.0388, 0.0062);
  waterLily3.add(octahedron39);
  const octahedron40 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron40.position.set(-0.0225, 0.0471, 0.013);
  octahedron40.rotation.set(deg(19.6731), deg(6.3857), deg(35.669));
  octahedron40.scale.set(0.0171, 0.0388, 0.0062);
  waterLily3.add(octahedron40);
  const octahedron41 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron41.position.set(-0.0225, 0.0471, -0.013);
  octahedron41.rotation.set(deg(-19.6731), deg(-6.3857), deg(35.669));
  octahedron41.scale.set(0.0171, 0.0388, 0.0062);
  waterLily3.add(octahedron41);
  const octahedron42 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron42.position.set(0, 0.0471, -0.026);
  octahedron42.rotation.set(deg(-42), 0, 0);
  octahedron42.scale.set(0.0171, 0.0388, 0.0062);
  waterLily3.add(octahedron42);
  const octahedron43 = new THREE.Mesh(octahedronGeo, lilyInnerMat);
  octahedron43.position.set(0.0225, 0.0471, -0.013);
  octahedron43.rotation.set(deg(-19.6731), deg(6.3857), deg(-35.669));
  octahedron43.scale.set(0.0171, 0.0388, 0.0062);
  waterLily3.add(octahedron43);
  const cylinder44 = new THREE.Mesh(new THREE.CylinderGeometry(0.0201, 0.0237, 0.0274, 6), heartMat);
  cylinder44.position.set(0, 0.0247, 0);
  waterLily3.add(cylinder44);
  const lilyPad4 = new THREE.Group();
  lilyPad4.name = 'lilyPad4';
  lilyPad4.position.set(-0.6929, 0.2, -0.2823);
  lilyPad4.rotation.set(0, deg(317.8961), 0);
  lilies.add(lilyPad4);
  const pad4 = new THREE.Mesh(extrude([[0, 0], [0.1498, -0.0458], [0.1124, -0.1091], [0.0501, -0.1484], [-0.0232, -0.1549], [-0.0913, -0.1273], [-0.1394, -0.0715], [-0.1567, 0], [-0.1394, 0.0715], [-0.0913, 0.1273], [-0.0232, 0.1549], [0.0501, 0.1484], [0.1124, 0.1091], [0.1498, 0.0458]], 0.012), padMat);
  pad4.name = 'pad';
  pad4.position.set(0, 0.006, 0);
  pad4.rotation.set(deg(-90), 0, 0);
  lilyPad4.add(pad4);
  const reeds = new THREE.Group();
  reeds.name = 'reeds';
  root.add(reeds);
  const reedClump1 = new THREE.Group();
  reedClump1.name = 'reedClump1';
  reedClump1.position.set(-1.4979, 0.14, -0.3109);
  reeds.add(reedClump1);
  const cylinder49 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.6746, 4), padMat);
  cylinder49.position.set(0.1218, 0.334, -0.035);
  cylinder49.rotation.set(deg(-2.1925), deg(0.1468), deg(-7.6583));
  reedClump1.add(cylinder49);
  const capsule50 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1384, 1, 6), cattailMat);
  capsule50.position.set(0.1691, 0.6852, -0.0485);
  capsule50.rotation.set(deg(-2.1925), deg(0.1468), deg(-7.6583));
  reedClump1.add(capsule50);
  const cylinder51 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1038, 3), padMat);
  cylinder51.position.set(0.1887, 0.8308, -0.0542);
  cylinder51.rotation.set(deg(-2.1925), deg(0.1468), deg(-7.6583));
  reedClump1.add(cylinder51);
  const cone52 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.7151, 3), padMat);
  cone52.position.set(0.1803, 0.3406, 0.0123);
  cone52.rotation.set(deg(13.4849), deg(23.9922), deg(-18.4584));
  cone52.scale.set(1, 1, 0.3);
  reedClump1.add(cone52);
  const cylinder53 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.8933, 4), padMat);
  cylinder53.position.set(0.059, 0.4424, 0.1291);
  cylinder53.rotation.set(deg(7.2433), deg(-0.2093), deg(-3.3065));
  reedClump1.add(cylinder53);
  const capsule54 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1833, 1, 6), cattailMat);
  capsule54.position.set(0.0861, 0.9074, 0.1883);
  capsule54.rotation.set(deg(7.2433), deg(-0.2093), deg(-3.3065));
  reedClump1.add(capsule54);
  const cylinder55 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1374, 3), padMat);
  cylinder55.position.set(0.0974, 1.1002, 0.2128);
  cylinder55.rotation.set(deg(7.2433), deg(-0.2093), deg(-3.3065));
  reedClump1.add(cylinder55);
  const cone56 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.633, 3), padMat);
  cone56.position.set(0.0169, 0.3014, 0.1678);
  cone56.rotation.set(deg(15.3511), deg(35.8598), deg(3.6682));
  cone56.scale.set(1, 1, 0.3);
  reedClump1.add(cone56);
  const cylinder57 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.6582, 4), padMat);
  cylinder57.position.set(-0.1071, 0.3259, 0.0657);
  cylinder57.rotation.set(deg(4.1575), deg(0.2466), deg(6.7874));
  reedClump1.add(cylinder57);
  const capsule58 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.135, 1, 6), cattailMat);
  capsule58.position.set(-0.148, 0.6686, 0.0908);
  capsule58.rotation.set(deg(4.1575), deg(0.2466), deg(6.7874));
  reedClump1.add(capsule58);
  const cylinder59 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1013, 3), padMat);
  cylinder59.position.set(-0.1649, 0.8107, 0.1012);
  cylinder59.rotation.set(deg(4.1575), deg(0.2466), deg(6.7874));
  reedClump1.add(cylinder59);
  const cone60 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.6464, 3), padMat);
  cone60.position.set(-0.1666, 0.3078, 0.0369);
  cone60.rotation.set(deg(-10.8613), deg(28.3986), deg(20.2453));
  cone60.scale.set(1, 1, 0.3);
  reedClump1.add(cone60);
  const cone61 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.7641, 3), padMat);
  cone61.position.set(-0.1478, 0.3639, -0.1162);
  cone61.rotation.set(deg(-20.6205), deg(30.515), deg(12.5575));
  cone61.scale.set(1, 1, 0.3);
  reedClump1.add(cone61);
  const cone62 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.582, 3), padMat);
  cone62.position.set(0.1112, 0.2772, -0.1167);
  cone62.rotation.set(deg(11.4295), deg(52.0894), deg(-25.4121));
  cone62.scale.set(1, 1, 0.3);
  reedClump1.add(cone62);
  const reedClump2 = new THREE.Group();
  reedClump2.name = 'reedClump2';
  reedClump2.position.set(0.9143, 0.14, -0.9763);
  reeds.add(reedClump2);
  const cylinder64 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7903, 4), padMat);
  cylinder64.position.set(0.1346, 0.3913, 0.0064);
  cylinder64.rotation.set(deg(0.3774), deg(-0.0263), deg(-7.9606));
  reedClump2.add(cylinder64);
  const capsule65 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1621, 1, 6), cattailMat);
  capsule65.position.set(0.1922, 0.8027, 0.0091);
  capsule65.rotation.set(deg(0.3774), deg(-0.0263), deg(-7.9606));
  reedClump2.add(capsule65);
  const cylinder66 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1216, 3), padMat);
  cylinder66.position.set(0.216, 0.9733, 0.0103);
  cylinder66.rotation.set(deg(0.3774), deg(-0.0263), deg(-7.9606));
  reedClump2.add(cylinder66);
  const cone67 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.6697, 3), padMat);
  cone67.position.set(0.1613, 0.3189, 0.0654);
  cone67.rotation.set(deg(12.4464), deg(6.0462), deg(-14.1488));
  cone67.scale.set(1, 1, 0.3);
  reedClump2.add(cone67);
  const cylinder68 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.6903, 4), padMat);
  cylinder68.position.set(0.0783, 0.3418, 0.1011);
  cylinder68.rotation.set(deg(6.2949), deg(-0.2678), deg(-4.8681));
  reedClump2.add(cylinder68);
  const capsule69 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1416, 1, 6), cattailMat);
  capsule69.position.set(0.109, 0.7012, 0.1409);
  capsule69.rotation.set(deg(6.2949), deg(-0.2678), deg(-4.8681));
  reedClump2.add(capsule69);
  const cylinder70 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1062, 3), padMat);
  cylinder70.position.set(0.1218, 0.8501, 0.1574);
  cylinder70.rotation.set(deg(6.2949), deg(-0.2678), deg(-4.8681));
  reedClump2.add(cylinder70);
  const cone71 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.7409, 3), padMat);
  cone71.position.set(0.0556, 0.3528, 0.176);
  cone71.rotation.set(deg(30.8233), deg(85.4935), deg(-13.1465));
  cone71.scale.set(1, 1, 0.3);
  reedClump2.add(cone71);
  const cylinder72 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7012, 4), padMat);
  cylinder72.position.set(-0.0906, 0.3472, 0.0913);
  cylinder72.rotation.set(deg(5.6495), deg(0.2767), deg(5.6031));
  reedClump2.add(cylinder72);
  const capsule73 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1438, 1, 6), cattailMat);
  capsule73.position.set(-0.1266, 0.7122, 0.1276);
  capsule73.rotation.set(deg(5.6495), deg(0.2767), deg(5.6031));
  reedClump2.add(capsule73);
  const cylinder74 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1079, 3), padMat);
  cylinder74.position.set(-0.1415, 0.8636, 0.1426);
  cylinder74.rotation.set(deg(5.6495), deg(0.2767), deg(5.6031));
  reedClump2.add(cylinder74);
  const cone75 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.6301, 3), padMat);
  cone75.position.set(-0.1506, 0.3, 0.0749);
  cone75.rotation.set(deg(-42.4748), deg(66.4113), deg(48.4161));
  cone75.scale.set(1, 1, 0.3);
  reedClump2.add(cone75);
  const cone76 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.629, 3), padMat);
  cone76.position.set(-0.1408, 0.2996, -0.0917);
  cone76.rotation.set(deg(-44.0147), deg(67.9582), deg(32.441));
  cone76.scale.set(1, 1, 0.3);
  reedClump2.add(cone76);
  const cone77 = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.732, 3), padMat);
  cone77.position.set(0.0658, 0.3486, -0.171);
  cone77.rotation.set(deg(0.5526), deg(55.6479), deg(-18.1983));
  cone77.scale.set(1, 1, 0.3);
  reedClump2.add(cone77);
  const bank = new THREE.Group();
  bank.name = 'bank';
  root.add(bank);
  const rock1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.1977, 0), 0.0297, 50), rockMat);
  rock1.name = 'rock1';
  rock1.position.set(0.6033, 0.3377, 1.4292);
  rock1.rotation.set(0, deg(18.0171), 0);
  rock1.scale.set(1.2, 0.7, 1);
  bank.add(rock1);
  const rock2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2043, 0), 0.0307, 51), rockMat);
  rock2.name = 'rock2';
  rock2.position.set(1.3187, 0.3539, 1.1011);
  rock2.rotation.set(0, deg(64.732), 0);
  rock2.scale.set(1.2, 0.7, 1);
  bank.add(rock2);
  const tuft1 = new THREE.Group();
  tuft1.name = 'tuft1';
  tuft1.position.set(1.5387, 0.27, -0.9907);
  bank.add(tuft1);
  const cone82 = new THREE.Mesh(new THREE.ConeGeometry(0.0583, 0.2383, 3), padMat);
  cone82.position.set(0.048, 0.0991, 0.0213);
  cone82.rotation.set(deg(150.6251), deg(62.8743), deg(-139.4189));
  cone82.scale.set(1, 1, 0.45);
  tuft1.add(cone82);
  const cone83 = new THREE.Mesh(new THREE.ConeGeometry(0.0583, 0.2682, 3), grassMat);
  cone83.position.set(-0.0234, 0.1141, 0.047);
  cone83.rotation.set(deg(9.6179), deg(2.5546), deg(4.8576));
  cone83.scale.set(1, 1, 0.45);
  tuft1.add(cone83);
  const cone84 = new THREE.Mesh(new THREE.ConeGeometry(0.0583, 0.2659, 3), padMat);
  cone84.position.set(-0.0036, 0.113, -0.0524);
  cone84.rotation.set(deg(-49.1901), deg(87.1431), deg(28.7405));
  cone84.scale.set(1, 1, 0.45);
  tuft1.add(cone84);
  const tuft2 = new THREE.Group();
  tuft2.name = 'tuft2';
  tuft2.position.set(-0.8356, 0.27, -1.3635);
  bank.add(tuft2);
  const cone86 = new THREE.Mesh(new THREE.ConeGeometry(0.0455, 0.2119, 3), padMat);
  cone86.position.set(0.0409, 0.0859, 0.0016);
  cone86.rotation.set(deg(24.2283), deg(49.6671), deg(-29.6742));
  cone86.scale.set(1, 1, 0.45);
  tuft2.add(cone86);
  const cone87 = new THREE.Mesh(new THREE.ConeGeometry(0.0455, 0.1861, 3), grassMat);
  cone87.position.set(-0.0282, 0.073, 0.0297);
  cone87.rotation.set(deg(-77.4481), deg(78.0361), deg(90.3395));
  cone87.scale.set(1, 1, 0.45);
  tuft2.add(cone87);
  const cone88 = new THREE.Mesh(new THREE.ConeGeometry(0.0455, 0.2174, 3), padMat);
  cone88.position.set(-0.0144, 0.0887, -0.0383);
  cone88.rotation.set(deg(-17.1175), deg(23.299), deg(5.9558));
  cone88.scale.set(1, 1, 0.45);
  tuft2.add(cone88);
  const tuft3 = new THREE.Group();
  tuft3.name = 'tuft3';
  tuft3.position.set(-1.1988, 0.27, -1.1613);
  bank.add(tuft3);
  const cone90 = new THREE.Mesh(new THREE.ConeGeometry(0.059, 0.285, 3), padMat);
  cone90.position.set(0.0518, 0.1225, -0.0117);
  cone90.rotation.set(deg(17.8997), deg(46.1809), deg(-30.1115));
  cone90.scale.set(1, 1, 0.45);
  tuft3.add(cone90);
  const cone91 = new THREE.Mesh(new THREE.ConeGeometry(0.059, 0.238, 3), grassMat);
  cone91.position.set(-0.0193, 0.099, 0.0495);
  cone91.rotation.set(deg(-146.288), deg(75.7387), deg(158.9121));
  cone91.scale.set(1, 1, 0.45);
  tuft3.add(cone91);
  const cone92 = new THREE.Mesh(new THREE.ConeGeometry(0.059, 0.2275, 3), padMat);
  cone92.position.set(-0.0484, 0.0938, 0.0218);
  cone92.rotation.set(deg(-0.1077), deg(24.5438), deg(16.8752));
  cone92.scale.set(1, 1, 0.45);
  tuft3.add(cone92);
  const cone93 = new THREE.Mesh(new THREE.ConeGeometry(0.059, 0.2363, 3), grassMat);
  cone93.position.set(-0.0049, 0.0982, -0.0529);
  cone93.rotation.set(deg(172.1091), deg(78.9986), deg(172.8128));
  cone93.scale.set(1, 1, 0.45);
  tuft3.add(cone93);
  const tuft4 = new THREE.Group();
  tuft4.name = 'tuft4';
  tuft4.position.set(-0.1512, 0.27, 1.6203);
  bank.add(tuft4);
  const cone95 = new THREE.Mesh(new THREE.ConeGeometry(0.0525, 0.2204, 3), padMat);
  cone95.position.set(0.0428, 0.0902, -0.0199);
  cone95.rotation.set(deg(11.4271), deg(55.4823), deg(-20.011));
  cone95.scale.set(1, 1, 0.45);
  tuft4.add(cone95);
  const cone96 = new THREE.Mesh(new THREE.ConeGeometry(0.0525, 0.28, 3), grassMat);
  cone96.position.set(0.0179, 0.12, 0.0437);
  cone96.rotation.set(deg(20.9811), deg(68.0637), deg(-11.3751));
  cone96.scale.set(1, 1, 0.45);
  tuft4.add(cone96);
  const cone97 = new THREE.Mesh(new THREE.ConeGeometry(0.0525, 0.2773, 3), padMat);
  cone97.position.set(-0.0468, 0.1186, 0.0067);
  cone97.rotation.set(deg(-72.618), deg(74.3586), deg(75.3663));
  cone97.scale.set(1, 1, 0.45);
  tuft4.add(cone97);
  const cone98 = new THREE.Mesh(new THREE.ConeGeometry(0.0525, 0.2244, 3), grassMat);
  cone98.position.set(0.0181, 0.0922, -0.0437);
  cone98.rotation.set(deg(-10.6004), deg(24.9161), deg(-5.9002));
  cone98.scale.set(1, 1, 0.45);
  tuft4.add(cone98);
  const tuft5 = new THREE.Group();
  tuft5.name = 'tuft5';
  tuft5.position.set(-0.3858, 0.27, -1.4936);
  bank.add(tuft5);
  const cone100 = new THREE.Mesh(new THREE.ConeGeometry(0.0622, 0.3174, 3), padMat);
  cone100.position.set(0.0551, 0.1387, 0.0096);
  cone100.rotation.set(deg(51.9928), deg(69.1407), deg(-51.0161));
  cone100.scale.set(1, 1, 0.45);
  tuft5.add(cone100);
  const cone101 = new THREE.Mesh(new THREE.ConeGeometry(0.0622, 0.2323, 3), grassMat);
  cone101.position.set(-0.0458, 0.0962, 0.0322);
  cone101.rotation.set(deg(-22.2527), deg(60.8175), deg(39.169));
  cone101.scale.set(1, 1, 0.45);
  tuft5.add(cone101);
  const cone102 = new THREE.Mesh(new THREE.ConeGeometry(0.0622, 0.339, 3), padMat);
  cone102.position.set(-0.0453, 0.1495, -0.0328);
  cone102.rotation.set(deg(-10.8454), deg(18.1357), deg(10.7195));
  cone102.scale.set(1, 1, 0.45);
  tuft5.add(cone102);
  const tuft6 = new THREE.Group();
  tuft6.name = 'tuft6';
  tuft6.position.set(-1.0107, 0.27, 1.4796);
  bank.add(tuft6);
  const cone104 = new THREE.Mesh(new THREE.ConeGeometry(0.0499, 0.2141, 3), padMat);
  cone104.position.set(0.0435, 0.0871, -0.0111);
  cone104.rotation.set(deg(16.7879), deg(45.4993), deg(-29.7834));
  cone104.scale.set(1, 1, 0.45);
  tuft6.add(cone104);
  const cone105 = new THREE.Mesh(new THREE.ConeGeometry(0.0499, 0.2117, 3), grassMat);
  cone105.position.set(-0.0047, 0.0859, 0.0446);
  cone105.rotation.set(deg(17.5817), deg(24.9157), deg(2.1212));
  cone105.scale.set(1, 1, 0.45);
  tuft6.add(cone105);
  const cone106 = new THREE.Mesh(new THREE.ConeGeometry(0.0499, 0.1915, 3), padMat);
  cone106.position.set(-0.044, 0.0757, 0.009);
  cone106.rotation.set(deg(-140.9362), deg(56.5716), deg(140.3787));
  cone106.scale.set(1, 1, 0.45);
  tuft6.add(cone106);
  const cone107 = new THREE.Mesh(new THREE.ConeGeometry(0.0499, 0.1919, 3), grassMat);
  cone107.position.set(-0.0117, 0.0759, -0.0433);
  cone107.rotation.set(deg(-23.1557), deg(42.7077), deg(6.7085));
  cone107.scale.set(1, 1, 0.45);
  tuft6.add(cone107);
  const tuft7 = new THREE.Group();
  tuft7.name = 'tuft7';
  tuft7.position.set(-0.1949, 0.27, 1.5562);
  bank.add(tuft7);
  const cone109 = new THREE.Mesh(new THREE.ConeGeometry(0.0503, 0.1874, 3), padMat);
  cone109.position.set(0.0453, 0.0737, -0.0009);
  cone109.rotation.set(deg(120.1555), deg(72.6238), deg(-119.2905));
  cone109.scale.set(1, 1, 0.45);
  tuft7.add(cone109);
  const cone110 = new THREE.Mesh(new THREE.ConeGeometry(0.0503, 0.1729, 3), grassMat);
  cone110.position.set(-0.0126, 0.0664, 0.0435);
  cone110.rotation.set(deg(10.341), deg(38.7919), deg(4.9301));
  cone110.scale.set(1, 1, 0.45);
  tuft7.add(cone110);
  const cone111 = new THREE.Mesh(new THREE.ConeGeometry(0.0503, 0.1889, 3), padMat);
  cone111.position.set(-0.0283, 0.0745, -0.0354);
  cone111.rotation.set(deg(-155.4129), deg(75.8116), deg(144.1141));
  cone111.scale.set(1, 1, 0.45);
  tuft7.add(cone111);
  const tuft8 = new THREE.Group();
  tuft8.name = 'tuft8';
  tuft8.position.set(-1.686, 0.27, -0.742);
  bank.add(tuft8);
  const cone113 = new THREE.Mesh(new THREE.ConeGeometry(0.0614, 0.3053, 3), padMat);
  cone113.position.set(0.0529, 0.1326, -0.016);
  cone113.rotation.set(deg(118.4705), deg(70.802), deg(-122.0126));
  cone113.scale.set(1, 1, 0.45);
  tuft8.add(cone113);
  const cone114 = new THREE.Mesh(new THREE.ConeGeometry(0.0614, 0.2012, 3), grassMat);
  cone114.position.set(0.0159, 0.0806, 0.0529);
  cone114.rotation.set(deg(19.7827), deg(9.2203), deg(-5.644));
  cone114.scale.set(1, 1, 0.45);
  tuft8.add(cone114);
  const cone115 = new THREE.Mesh(new THREE.ConeGeometry(0.0614, 0.2484, 3), padMat);
  cone115.position.set(-0.0531, 0.1042, 0.0153);
  cone115.rotation.set(deg(-5.578), deg(30.0521), deg(21.3977));
  cone115.scale.set(1, 1, 0.45);
  tuft8.add(cone115);
  const cone116 = new THREE.Mesh(new THREE.ConeGeometry(0.0614, 0.2883, 3), grassMat);
  cone116.position.set(0.0052, 0.1241, -0.055);
  cone116.rotation.set(deg(-15.4693), deg(28.5931), deg(-1.7226));
  cone116.scale.set(1, 1, 0.45);
  tuft8.add(cone116);
  const tuft9 = new THREE.Group();
  tuft9.name = 'tuft9';
  tuft9.position.set(1.0129, 0.27, 1.3563);
  bank.add(tuft9);
  const cone118 = new THREE.Mesh(new THREE.ConeGeometry(0.0627, 0.3182, 3), padMat);
  cone118.position.set(0.0528, 0.1391, -0.0199);
  cone118.rotation.set(deg(9.5753), deg(51.9079), deg(-17.0206));
  cone118.scale.set(1, 1, 0.45);
  tuft9.add(cone118);
  const cone119 = new THREE.Mesh(new THREE.ConeGeometry(0.0627, 0.3267, 3), grassMat);
  cone119.position.set(-0.0362, 0.1434, 0.0433);
  cone119.rotation.set(deg(-3.0118), deg(58.0303), deg(13.7834));
  cone119.scale.set(1, 1, 0.45);
  tuft9.add(cone119);
  const cone120 = new THREE.Mesh(new THREE.ConeGeometry(0.0627, 0.224, 3), padMat);
  cone120.position.set(-0.0149, 0.092, -0.0544);
  cone120.rotation.set(deg(-16.4325), deg(27.5196), deg(4.3954));
  cone120.scale.set(1, 1, 0.45);
  tuft9.add(cone120);
  const tuft10 = new THREE.Group();
  tuft10.name = 'tuft10';
  tuft10.position.set(-1.9624, 0.27, -0.6727);
  bank.add(tuft10);
  const cone122 = new THREE.Mesh(new THREE.ConeGeometry(0.0621, 0.2816, 3), padMat);
  cone122.position.set(0.0557, 0.1208, -0.0036);
  cone122.rotation.set(deg(60.302), deg(72.6101), deg(-62.4324));
  cone122.scale.set(1, 1, 0.45);
  tuft10.add(cone122);
  const cone123 = new THREE.Mesh(new THREE.ConeGeometry(0.0621, 0.2401, 3), grassMat);
  cone123.position.set(-0.0069, 0.1001, 0.0554);
  cone123.rotation.set(deg(17.176), deg(30.302), deg(2.608));
  cone123.scale.set(1, 1, 0.45);
  tuft10.add(cone123);
  const cone124 = new THREE.Mesh(new THREE.ConeGeometry(0.0621, 0.2477, 3), padMat);
  cone124.position.set(-0.0476, 0.1038, -0.0293);
  cone124.rotation.set(deg(-15.1164), deg(25.5594), deg(15.0147));
  cone124.scale.set(1, 1, 0.45);
  tuft10.add(cone124);
  const tuft11 = new THREE.Group();
  tuft11.name = 'tuft11';
  tuft11.position.set(1.3752, 0.27, -1.2375);
  bank.add(tuft11);
  const cone126 = new THREE.Mesh(new THREE.ConeGeometry(0.0474, 0.1549, 3), padMat);
  cone126.position.set(0.0418, 0.0575, 0.0086);
  cone126.rotation.set(deg(141.68), deg(65.2917), deg(-135.2857));
  cone126.scale.set(1, 1, 0.45);
  tuft11.add(cone126);
  const cone127 = new THREE.Mesh(new THREE.ConeGeometry(0.0474, 0.2329, 3), grassMat);
  cone127.position.set(-0.0218, 0.0965, 0.0367);
  cone127.rotation.set(deg(-157.7776), deg(65.4235), deg(166.2021));
  cone127.scale.set(1, 1, 0.45);
  tuft11.add(cone127);
  const cone128 = new THREE.Mesh(new THREE.ConeGeometry(0.0474, 0.2026, 3), padMat);
  cone128.position.set(-0.0261, 0.0813, -0.0338);
  cone128.rotation.set(deg(-41.8988), deg(61.4323), deg(27.6857));
  cone128.scale.set(1, 1, 0.45);
  tuft11.add(cone128);
  const tuft12 = new THREE.Group();
  tuft12.name = 'tuft12';
  tuft12.position.set(2.0404, 0.27, -0.4861);
  bank.add(tuft12);
  const cone130 = new THREE.Mesh(new THREE.ConeGeometry(0.0546, 0.2791, 3), padMat);
  cone130.position.set(0.0476, 0.1195, -0.012);
  cone130.rotation.set(deg(145.8813), deg(59.5978), deg(-146.3053));
  cone130.scale.set(1, 1, 0.45);
  tuft12.add(cone130);
  const cone131 = new THREE.Mesh(new THREE.ConeGeometry(0.0546, 0.2041, 3), grassMat);
  cone131.position.set(0.0158, 0.082, 0.0465);
  cone131.rotation.set(deg(15.9878), deg(5.5181), deg(-5.2056));
  cone131.scale.set(1, 1, 0.45);
  tuft12.add(cone131);
  const cone132 = new THREE.Mesh(new THREE.ConeGeometry(0.0546, 0.2234, 3), padMat);
  cone132.position.set(-0.0448, 0.0917, -0.0201);
  cone132.rotation.set(deg(-163.4169), deg(59.4528), deg(154.4814));
  cone132.scale.set(1, 1, 0.45);
  tuft12.add(cone132);
  const cone133 = new THREE.Mesh(new THREE.ConeGeometry(0.0546, 0.2347, 3), grassMat);
  cone133.position.set(-0.0147, 0.0974, -0.0469);
  cone133.rotation.set(deg(-23.219), deg(41.1848), deg(7.4696));
  cone133.scale.set(1, 1, 0.45);
  tuft12.add(cone133);
  const shorePebble = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.07, 0), 0.0126, 320), rockMat);
  shorePebble.name = 'shorePebble';
  shorePebble.position.set(1.3567, 0.2455, -0.7729);
  shorePebble.rotation.set(deg(3.3285), deg(213.3687), deg(4.6477));
  shorePebble.scale.set(1.1778, 0.5313, 1);
  bank.add(shorePebble);

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

export default createPond;

평점 및 댓글

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

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

댓글 0개

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

관련 모델

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