Codels
1,3 mil tris4,00 × 1,37 × 4,00 m

Úsalo en código

Hacer remix en el editor
Módulo ES autónomo — solo depende de three. Llama a la función factory y añade el grupo a tu escena.
/**
 * River Tile — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 1,314 · Size (W × H × D): 4.00 × 1.37 × 4.00 m
 *
 * Usage:
 *   import { createRiverTile } from './river-tile.js';
 *   
 *   const model = createRiverTile();
 *   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;
}

// 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 createRiverTile() {
  const root = new THREE.Group();
  root.name = 'RiverTile';

  // Materials
  const waterMat = new THREE.MeshStandardMaterial({ name: 'water', color: 0x3c8fd6, roughness: 0.08, metalness: 0.1, transparent: true, opacity: 0.82, flatShading: true });
  const foamMat = new THREE.MeshStandardMaterial({ name: 'foam', color: 0xcee3f5, roughness: 0.3, 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 sandMat = new THREE.MeshStandardMaterial({ name: 'sand', color: 0xd3b072, roughness: 0.95, flatShading: true });
  const dirtMat = new THREE.MeshStandardMaterial({ name: 'dirt', color: 0x8b5d3b, roughness: 0.95, flatShading: true });
  const bedMat = new THREE.MeshStandardMaterial({ name: 'bed', color: 0x5e4a35, roughness: 0.95, flatShading: true });
  const rockMat = new THREE.MeshStandardMaterial({ name: 'rock', color: 0x8f8b84, roughness: 0.9, flatShading: true });
  const reedMat = new THREE.MeshStandardMaterial({ name: 'reed', color: 0x5d8c3a, 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);
  const coneGeo = new THREE.ConeGeometry(0.051, 0.2486, 3);

  // Parts
  const riverbed = new THREE.Mesh(new THREE.BoxGeometry(4, 0.2, 4), bedMat);
  riverbed.name = 'riverbed';
  riverbed.position.set(0, 0.1, 0);
  root.add(riverbed);
  const bank1 = new THREE.Mesh(extrude([[-2, 2], [-1.35, 2], [-1.35, -2], [-2, -2]], 0.18), dirtMat);
  bank1.name = 'bank1';
  bank1.position.set(0, 0.29, 0);
  bank1.rotation.set(deg(-90), 0, 0);
  root.add(bank1);
  const grass1 = new THREE.Mesh(extrude([[-2, 2], [-1.35, 2], [-1.35, -2], [-2, -2]], 0.12), grassMat);
  grass1.name = 'grass1';
  grass1.position.set(0, 0.44, 0);
  grass1.rotation.set(deg(-90), 0, 0);
  root.add(grass1);
  const bank2 = new THREE.Mesh(extrude([[1.35, 2], [2, 2], [2, -2], [1.35, -2]], 0.18), dirtMat);
  bank2.name = 'bank2';
  bank2.position.set(0, 0.29, 0);
  bank2.rotation.set(deg(-90), 0, 0);
  root.add(bank2);
  const grass2 = new THREE.Mesh(extrude([[1.35, 2], [2, 2], [2, -2], [1.35, -2]], 0.12), grassMat);
  grass2.name = 'grass2';
  grass2.position.set(0, 0.44, 0);
  grass2.rotation.set(deg(-90), 0, 0);
  root.add(grass2);
  const shelf1 = new THREE.Mesh(extrude([[-1.35, 2], [-1, 2], [-1, -2], [-1.35, -2]], 0.2), sandMat);
  shelf1.name = 'shelf1';
  shelf1.position.set(0, 0.3, 0);
  shelf1.rotation.set(deg(-90), 0, 0);
  root.add(shelf1);
  const shelf2 = new THREE.Mesh(extrude([[1, 2], [1.35, 2], [1.35, -2], [1, -2]], 0.2), sandMat);
  shelf2.name = 'shelf2';
  shelf2.position.set(0, 0.3, 0);
  shelf2.rotation.set(deg(-90), 0, 0);
  root.add(shelf2);
  const water = new THREE.Mesh(extrude([[-1, 2], [1, 2], [1, -2], [-1, -2]], 0.13), waterMat);
  water.name = 'water';
  water.position.set(0, 0.265, 0);
  water.rotation.set(deg(-90), 0, 0);
  root.add(water);
  const dressing = new THREE.Group();
  dressing.name = 'dressing';
  root.add(dressing);
  const streak1 = new THREE.Mesh(octahedronGeo, foamMat);
  streak1.name = 'streak1';
  streak1.position.set(-0.1818, 0.33, -0.2228);
  streak1.rotation.set(0, deg(84.8471), 0);
  streak1.scale.set(0.2287, 0.012, 0.03);
  dressing.add(streak1);
  const streak2 = new THREE.Mesh(octahedronGeo, foamMat);
  streak2.name = 'streak2';
  streak2.position.set(-0.6412, 0.33, 1.5564);
  streak2.rotation.set(0, deg(85.0945), 0);
  streak2.scale.set(0.2838, 0.012, 0.03);
  dressing.add(streak2);
  const streak3 = new THREE.Mesh(octahedronGeo, foamMat);
  streak3.name = 'streak3';
  streak3.position.set(0.4818, 0.33, -0.1958);
  streak3.rotation.set(0, deg(91.8668), 0);
  streak3.scale.set(0.3567, 0.012, 0.03);
  dressing.add(streak3);
  const streak4 = new THREE.Mesh(octahedronGeo, foamMat);
  streak4.name = 'streak4';
  streak4.position.set(-0.4337, 0.33, 0.7013);
  streak4.rotation.set(0, deg(90.7286), 0);
  streak4.scale.set(0.2857, 0.012, 0.03);
  dressing.add(streak4);
  const streak5 = new THREE.Mesh(octahedronGeo, foamMat);
  streak5.name = 'streak5';
  streak5.position.set(0.1501, 0.33, -0.2598);
  streak5.rotation.set(0, deg(85.4721), 0);
  streak5.scale.set(0.3364, 0.012, 0.03);
  dressing.add(streak5);
  const streak6 = new THREE.Mesh(octahedronGeo, foamMat);
  streak6.name = 'streak6';
  streak6.position.set(0.2026, 0.33, 0.2203);
  streak6.rotation.set(0, deg(88.0696), 0);
  streak6.scale.set(0.2386, 0.012, 0.03);
  dressing.add(streak6);
  const streak7 = new THREE.Mesh(octahedronGeo, foamMat);
  streak7.name = 'streak7';
  streak7.position.set(-0.1255, 0.33, -0.826);
  streak7.rotation.set(0, deg(85.0745), 0);
  streak7.scale.set(0.2767, 0.012, 0.03);
  dressing.add(streak7);
  const rock1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.24, 0), 0.036, 7), rockMat);
  rock1.name = 'rock1';
  rock1.position.set(-0.45, 0.4415, 0.8);
  rock1.rotation.set(0, deg(3.6266), 0);
  rock1.scale.set(1.25, 0.95, 1);
  dressing.add(rock1);
  const foam1 = new THREE.Mesh(new THREE.CylinderGeometry(0.348, 0.348, 0.008, 8), foamMat);
  foam1.name = 'foam1';
  foam1.position.set(-0.45, 0.334, 0.8);
  foam1.rotation.set(0, deg(90), 0);
  foam1.scale.set(1.4, 1, 1);
  dressing.add(foam1);
  const rock2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.18, 0), 0.027, 8), rockMat);
  rock2.name = 'rock2';
  rock2.position.set(0.5, 0.3611, -0.72);
  rock2.rotation.set(0, deg(5.5244), 0);
  rock2.scale.set(1.25, 0.95, 1);
  dressing.add(rock2);
  const foam2 = new THREE.Mesh(new THREE.CylinderGeometry(0.261, 0.261, 0.008, 8), foamMat);
  foam2.name = 'foam2';
  foam2.position.set(0.5, 0.334, -0.72);
  foam2.rotation.set(0, deg(90), 0);
  foam2.scale.set(1.4, 1, 1);
  dressing.add(foam2);
  const pebble1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.051, 0), 0.0092, 725), sandMat);
  pebble1.name = 'pebble1';
  pebble1.position.set(-1.2538, 0.4175, 0.6736);
  pebble1.rotation.set(deg(-4.4732), deg(131.5162), deg(-3.2939));
  pebble1.scale.set(1.2457, 0.4537, 1);
  dressing.add(pebble1);
  const pebble2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.0457, 0), 0.0082, 414), rockMat);
  pebble2.name = 'pebble2';
  pebble2.position.set(1.0957, 0.4221, -0.0955);
  pebble2.rotation.set(deg(-6.108), deg(61.8337), deg(-3.8046));
  pebble2.scale.set(1.3233, 0.4732, 1);
  dressing.add(pebble2);
  const pebble3 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.0448, 0), 0.0081, 106), rockMat);
  pebble3.name = 'pebble3';
  pebble3.position.set(-1.2242, 0.4225, 1.0578);
  pebble3.rotation.set(deg(-3.7876), deg(324.0964), deg(7.931));
  pebble3.scale.set(1.2682, 0.4758, 1);
  dressing.add(pebble3);
  const pebble4 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.0634, 0), 0.0114, 150), sandMat);
  pebble4.name = 'pebble4';
  pebble4.position.set(1.0889, 0.4351, 0.394);
  pebble4.rotation.set(deg(-4.1077), deg(49.9921), deg(3.136));
  pebble4.scale.set(1.2911, 0.6435, 1);
  dressing.add(pebble4);
  const pebble5 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.0609, 0), 0.011, 904), rockMat);
  pebble5.name = 'pebble5';
  pebble5.position.set(-1.1568, 0.4238, 0.4168);
  pebble5.rotation.set(deg(2.2827), deg(252.6187), deg(3.4708));
  pebble5.scale.set(1.3232, 0.5574, 1);
  dressing.add(pebble5);
  const pebble6 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.0654, 0), 0.0118, 271), rockMat);
  pebble6.name = 'pebble6';
  pebble6.position.set(1.1813, 0.4305, -0.8824);
  pebble6.rotation.set(deg(2.3467), deg(74.9796), deg(-3.0628));
  pebble6.scale.set(1.2189, 0.5307, 1);
  dressing.add(pebble6);
  const reeds1 = new THREE.Group();
  reeds1.name = 'reeds1';
  reeds1.position.set(-1.17, 0.38, 1.12);
  dressing.add(reeds1);
  const cylinder28 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.5991, 4), reedMat);
  cylinder28.position.set(0.1007, 0.2974, -0.0323);
  cylinder28.rotation.set(deg(-2.0837), deg(0.1186), deg(-6.5149));
  reeds1.add(cylinder28);
  const capsule29 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1229, 1, 6), cattailMat);
  capsule29.position.set(0.1364, 0.6101, -0.0437);
  capsule29.rotation.set(deg(-2.0837), deg(0.1186), deg(-6.5149));
  reeds1.add(capsule29);
  const cylinder30 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.0922, 3), reedMat);
  cylinder30.position.set(0.1512, 0.7398, -0.0485);
  cylinder30.rotation.set(deg(-2.0837), deg(0.1186), deg(-6.5149));
  reeds1.add(cylinder30);
  const cone31 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.6437, 3), reedMat);
  cone31.position.set(0.1575, 0.3083, -0.0039);
  cone31.rotation.set(deg(6.1458), deg(9.7756), deg(-16.639));
  cone31.scale.set(1, 1, 0.3);
  reeds1.add(cone31);
  const cylinder32 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7388, 4), reedMat);
  cylinder32.position.set(-0.0381, 0.3668, 0.1074);
  cylinder32.rotation.set(deg(6.4466), deg(0.1287), deg(2.2848));
  reeds1.add(cylinder32);
  const capsule33 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1515, 1, 6), cattailMat);
  capsule33.position.set(-0.0536, 0.7523, 0.151);
  capsule33.rotation.set(deg(6.4466), deg(0.1287), deg(2.2848));
  reeds1.add(capsule33);
  const cylinder34 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1137, 3), reedMat);
  cylinder34.position.set(-0.06, 0.9122, 0.1691);
  cylinder34.rotation.set(deg(6.4466), deg(0.1287), deg(2.2848));
  reeds1.add(cylinder34);
  const cone35 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.5398, 3), reedMat);
  cone35.position.set(-0.0812, 0.2585, 0.1177);
  cone35.rotation.set(deg(-49.6233), deg(75.9157), deg(61.6684));
  cone35.scale.set(1, 1, 0.3);
  reeds1.add(cone35);
  const cone36 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.4868, 3), reedMat);
  cone36.position.set(-0.114, 0.2331, -0.0734);
  cone36.rotation.set(deg(-18.8562), deg(29.4273), deg(12.9726));
  cone36.scale.set(1, 1, 0.3);
  reeds1.add(cone36);
  const cone37 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.5736, 3), reedMat);
  cone37.position.set(-0.0031, 0.2747, -0.1477);
  cone37.rotation.set(deg(-14.355), deg(30.3836), deg(-3.9536));
  cone37.scale.set(1, 1, 0.3);
  reeds1.add(cone37);
  const reeds2 = new THREE.Group();
  reeds2.name = 'reeds2';
  reeds2.position.set(1.17, 0.38, -0.96);
  dressing.add(reeds2);
  const cylinder39 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.619, 4), reedMat);
  cylinder39.position.set(0.1063, 0.3073, -0.0107);
  cylinder39.rotation.set(deg(-0.6818), deg(0.0406), deg(-6.8084));
  reeds2.add(cylinder39);
  const capsule40 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.127, 1, 6), cattailMat);
  capsule40.position.set(0.1449, 0.6303, -0.0145);
  capsule40.rotation.set(deg(-0.6818), deg(0.0406), deg(-6.8084));
  reeds2.add(capsule40);
  const cylinder41 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.0952, 3), reedMat);
  cylinder41.position.set(0.1609, 0.7643, -0.0161);
  cylinder41.rotation.set(deg(-0.6818), deg(0.0406), deg(-6.8084));
  reeds2.add(cylinder41);
  const cone42 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.6066, 3), reedMat);
  cone42.position.set(0.1499, 0.2905, 0.0269);
  cone42.rotation.set(deg(38.8373), deg(62.7329), deg(-35.2892));
  cone42.scale.set(1, 1, 0.3);
  reeds2.add(cone42);
  const cylinder43 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7494, 4), reedMat);
  cylinder43.position.set(0.0162, 0.372, 0.1135);
  cylinder43.rotation.set(deg(6.7739), deg(-0.0571), deg(-0.9643));
  reeds2.add(cylinder43);
  const capsule44 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1537, 1, 6), cattailMat);
  capsule44.position.set(0.0228, 0.7631, 0.16);
  capsule44.rotation.set(deg(6.7739), deg(-0.0571), deg(-0.9643));
  reeds2.add(capsule44);
  const cylinder45 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1153, 3), reedMat);
  cylinder45.position.set(0.0256, 0.9253, 0.1792);
  cylinder45.rotation.set(deg(6.7739), deg(-0.0571), deg(-0.9643));
  reeds2.add(cylinder45);
  const cone46 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.6899, 3), reedMat);
  cone46.position.set(-0.0249, 0.3304, 0.1621);
  cone46.rotation.set(deg(8.2209), deg(52.0877), deg(9.4384));
  cone46.scale.set(1, 1, 0.3);
  reeds2.add(cone46);
  const cone47 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.4734, 3), reedMat);
  cone47.position.set(-0.1327, 0.2267, 0.0163);
  cone47.rotation.set(deg(-18.278), deg(42.8978), deg(22.8845));
  cone47.scale.set(1, 1, 0.3);
  reeds2.add(cone47);
  const cone48 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.6606, 3), reedMat);
  cone48.position.set(0.008, 0.3164, -0.1597);
  cone48.rotation.set(deg(-10.5621), deg(52.6046), deg(-7.0337));
  cone48.scale.set(1, 1, 0.3);
  reeds2.add(cone48);
  const reeds3 = new THREE.Group();
  reeds3.name = 'reeds3';
  reeds3.position.set(-1.17, 0.38, -0.2);
  dressing.add(reeds3);
  const cylinder50 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7318, 4), reedMat);
  cylinder50.position.set(0.1088, 0.3633, 0.0328);
  cylinder50.rotation.set(deg(1.9697), deg(-0.1127), deg(-6.5506));
  reeds3.add(cylinder50);
  const capsule51 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.1501, 1, 6), cattailMat);
  capsule51.position.set(0.1526, 0.7452, 0.046);
  capsule51.rotation.set(deg(1.9697), deg(-0.1127), deg(-6.5506));
  reeds3.add(capsule51);
  const cylinder52 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1126, 3), reedMat);
  cylinder52.position.set(0.1708, 0.9036, 0.0515);
  cylinder52.rotation.set(deg(1.9697), deg(-0.1127), deg(-6.5506));
  reeds3.add(cylinder52);
  const cone53 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.67, 3), reedMat);
  cone53.position.set(0.1346, 0.3209, 0.0888);
  cone53.rotation.set(deg(55.3136), deg(73.2718), deg(-44.4907));
  cone53.scale.set(1, 1, 0.3);
  reeds3.add(cone53);
  const cylinder54 = new THREE.Mesh(new THREE.CylinderGeometry(0.0096, 0.012, 0.7557, 4), reedMat);
  cylinder54.position.set(0.042, 0.3752, 0.1071);
  cylinder54.rotation.set(deg(6.3687), deg(-0.1387), deg(-2.4923));
  reeds3.add(cylinder54);
  const capsule55 = new THREE.Mesh(new THREE.CapsuleGeometry(0.0312, 0.155, 1, 6), cattailMat);
  capsule55.position.set(0.0593, 0.7696, 0.1511);
  capsule55.rotation.set(deg(6.3687), deg(-0.1387), deg(-2.4923));
  reeds3.add(capsule55);
  const cylinder56 = new THREE.Mesh(new THREE.CylinderGeometry(0.0024, 0.0054, 0.1163, 3), reedMat);
  cylinder56.position.set(0.0664, 0.9331, 0.1694);
  cylinder56.rotation.set(deg(6.3687), deg(-0.1387), deg(-2.4923));
  reeds3.add(cylinder56);
  const cone57 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.6363, 3), reedMat);
  cone57.position.set(0.014, 0.3048, 0.1559);
  cone57.rotation.set(deg(16.3518), deg(6.0904), deg(2.0876));
  cone57.scale.set(1, 1, 0.3);
  reeds3.add(cone57);
  const cone58 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.4571, 3), reedMat);
  cone58.position.set(-0.1312, 0.2189, 0.0085);
  cone58.rotation.set(deg(-44.8573), deg(66.1034), deg(44.1171));
  cone58.scale.set(1, 1, 0.3);
  reeds3.add(cone58);
  const cone59 = new THREE.Mesh(new THREE.ConeGeometry(0.035, 0.5349, 3), reedMat);
  cone59.position.set(-0.0025, 0.2562, -0.1423);
  cone59.rotation.set(deg(-15.4216), deg(13.9538), deg(-3.7098));
  cone59.scale.set(1, 1, 0.3);
  reeds3.add(cone59);
  const lilyPad1 = new THREE.Group();
  lilyPad1.name = 'lilyPad1';
  lilyPad1.position.set(0.75, 0.33, 0.3393);
  lilyPad1.rotation.set(0, deg(183.5514), 0);
  dressing.add(lilyPad1);
  const pad = new THREE.Mesh(extrude([[0, 0], [0.1097, -0.0335], [0.0823, -0.0799], [0.0367, -0.1087], [-0.017, -0.1134], [-0.0669, -0.0932], [-0.1021, -0.0524], [-0.1147, 0], [-0.1021, 0.0524], [-0.0669, 0.0932], [-0.017, 0.1134], [0.0367, 0.1087], [0.0823, 0.0799], [0.1097, 0.0335]], 0.012), reedMat);
  pad.name = 'pad';
  pad.position.set(0, 0.006, 0);
  pad.rotation.set(deg(-90), 0, 0);
  lilyPad1.add(pad);
  const lilyPad2 = new THREE.Group();
  lilyPad2.name = 'lilyPad2';
  lilyPad2.position.set(0.63, 0.33, -0.038);
  lilyPad2.rotation.set(0, deg(334.7669), 0);
  dressing.add(lilyPad2);
  const pad2 = new THREE.Mesh(extrude([[0, 0], [0.1518, -0.0464], [0.1139, -0.1106], [0.0508, -0.1504], [-0.0235, -0.157], [-0.0925, -0.1289], [-0.1412, -0.0725], [-0.1587, 0], [-0.1412, 0.0725], [-0.0925, 0.1289], [-0.0235, 0.157], [0.0508, 0.1504], [0.1139, 0.1106], [0.1518, 0.0464]], 0.012), reedMat);
  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.75, 0.33, -0.2563);
  lilyPad3.rotation.set(0, deg(3.9737), 0);
  dressing.add(lilyPad3);
  const pad3 = new THREE.Mesh(extrude([[0, 0], [0.1449, -0.0443], [0.1087, -0.1056], [0.0485, -0.1435], [-0.0224, -0.1499], [-0.0883, -0.1231], [-0.1348, -0.0692], [-0.1515, 0], [-0.1348, 0.0692], [-0.0883, 0.1231], [-0.0224, 0.1499], [0.0485, 0.1435], [0.1087, 0.1056], [0.1449, 0.0443]], 0.012), reedMat);
  pad3.name = 'pad';
  pad3.position.set(0, 0.006, 0);
  pad3.rotation.set(deg(-90), 0, 0);
  lilyPad3.add(pad3);
  const tuft1 = new THREE.Group();
  tuft1.name = 'tuft1';
  tuft1.position.set(-1.5666, 0.5, -0.6353);
  dressing.add(tuft1);
  const cone67 = new THREE.Mesh(new THREE.ConeGeometry(0.0596, 0.2776, 3), grassDarkMat);
  cone67.position.set(0.0537, 0.1188, 0.0012);
  cone67.rotation.set(deg(7.3271), deg(18.7647), deg(-20.5432));
  cone67.scale.set(1, 1, 0.45);
  tuft1.add(cone67);
  const cone68 = new THREE.Mesh(new THREE.ConeGeometry(0.0596, 0.2948, 3), grassMat);
  cone68.position.set(-0.0402, 0.1274, 0.0356);
  cone68.rotation.set(deg(-150.297), deg(58.6633), deg(157.6153));
  cone68.scale.set(1, 1, 0.45);
  tuft1.add(cone68);
  const cone69 = new THREE.Mesh(new THREE.ConeGeometry(0.0596, 0.2124, 3), reedMat);
  cone69.position.set(-0.0256, 0.0862, -0.0472);
  cone69.rotation.set(deg(-116.5925), deg(81.2256), deg(100.2486));
  cone69.scale.set(1, 1, 0.45);
  tuft1.add(cone69);
  const tuft2 = new THREE.Group();
  tuft2.name = 'tuft2';
  tuft2.position.set(1.6001, 0.5, -1.1651);
  dressing.add(tuft2);
  const cone71 = new THREE.Mesh(new THREE.ConeGeometry(0.051, 0.2507, 3), grassDarkMat);
  cone71.position.set(0.0449, 0.1053, -0.0096);
  cone71.rotation.set(deg(3.8761), deg(21.1468), deg(-22.7604));
  cone71.scale.set(1, 1, 0.45);
  tuft2.add(cone71);
  const cone72 = new THREE.Mesh(coneGeo, grassMat);
  cone72.position.set(-0.0118, 0.1043, 0.0443);
  cone72.rotation.set(deg(1.3187), deg(74.1185), deg(18.8908));
  cone72.scale.set(1, 1, 0.45);
  tuft2.add(cone72);
  const cone73 = new THREE.Mesh(new THREE.ConeGeometry(0.051, 0.181, 3), reedMat);
  cone73.position.set(-0.0426, 0.0705, 0.0171);
  cone73.rotation.set(deg(-50.7909), deg(69.9732), deg(59.4874));
  cone73.scale.set(1, 1, 0.45);
  tuft2.add(cone73);
  const cone74 = new THREE.Mesh(coneGeo, grassDarkMat);
  cone74.position.set(-0.0167, 0.1043, -0.0427);
  cone74.rotation.set(deg(-174.6282), deg(75.8297), deg(164.6188));
  cone74.scale.set(1, 1, 0.45);
  tuft2.add(cone74);
  const tuft3 = new THREE.Group();
  tuft3.name = 'tuft3';
  tuft3.position.set(-1.8441, 0.5, -0.2503);
  dressing.add(tuft3);
  const cone76 = new THREE.Mesh(new THREE.ConeGeometry(0.0501, 0.2639, 3), grassDarkMat);
  cone76.position.set(0.0433, 0.112, 0.0124);
  cone76.rotation.set(deg(51.4565), deg(62.0721), deg(-48.7913));
  cone76.scale.set(1, 1, 0.45);
  tuft3.add(cone76);
  const cone77 = new THREE.Mesh(new THREE.ConeGeometry(0.0501, 0.2193, 3), grassMat);
  cone77.position.set(-0.0122, 0.0897, 0.0434);
  cone77.rotation.set(deg(-0.3009), deg(74.7125), deg(12.274));
  cone77.scale.set(1, 1, 0.45);
  tuft3.add(cone77);
  const cone78 = new THREE.Mesh(new THREE.ConeGeometry(0.0501, 0.1756, 3), reedMat);
  cone78.position.set(-0.0169, 0.0678, -0.0418);
  cone78.rotation.set(deg(178.0386), deg(63.3404), deg(171.0874));
  cone78.scale.set(1, 1, 0.45);
  tuft3.add(cone78);
  const tuft4 = new THREE.Group();
  tuft4.name = 'tuft4';
  tuft4.position.set(1.6944, 0.5, -1.3539);
  dressing.add(tuft4);
  const cone80 = new THREE.Mesh(new THREE.ConeGeometry(0.0476, 0.1998, 3), grassDarkMat);
  cone80.position.set(0.0419, 0.0799, 0.0088);
  cone80.rotation.set(deg(8.6571), deg(23.8117), deg(-14.3063));
  cone80.scale.set(1, 1, 0.45);
  tuft4.add(cone80);
  const cone81 = new THREE.Mesh(new THREE.ConeGeometry(0.0476, 0.1925, 3), grassMat);
  cone81.position.set(-0.0246, 0.0762, 0.0351);
  cone81.rotation.set(deg(-156.9008), deg(60.8132), deg(165.3209));
  cone81.scale.set(1, 1, 0.45);
  tuft4.add(cone81);
  const cone82 = new THREE.Mesh(new THREE.ConeGeometry(0.0476, 0.2531, 3), reedMat);
  cone82.position.set(-0.022, 0.1065, -0.0368);
  cone82.rotation.set(deg(-25.7252), deg(41.6257), deg(13.2169));
  cone82.scale.set(1, 1, 0.45);
  tuft4.add(cone82);
  const tuft5 = new THREE.Group();
  tuft5.name = 'tuft5';
  tuft5.position.set(-1.8428, 0.5, -1.1456);
  dressing.add(tuft5);
  const cone84 = new THREE.Mesh(new THREE.ConeGeometry(0.0446, 0.1734, 3), grassDarkMat);
  cone84.position.set(0.04, 0.0667, 0.0033);
  cone84.rotation.set(deg(2.5629), deg(2.6705), deg(-19.1468));
  cone84.scale.set(1, 1, 0.45);
  tuft5.add(cone84);
  const cone85 = new THREE.Mesh(new THREE.ConeGeometry(0.0446, 0.148, 3), grassMat);
  cone85.position.set(-0.0223, 0.054, 0.0334);
  cone85.rotation.set(deg(-7.6211), deg(68.3835), deg(19.71));
  cone85.scale.set(1, 1, 0.45);
  tuft5.add(cone85);
  const cone86 = new THREE.Mesh(new THREE.ConeGeometry(0.0446, 0.1586, 3), reedMat);
  cone86.position.set(-0.0267, 0.0593, -0.03);
  cone86.rotation.set(deg(-24.0203), deg(40.2759), deg(15.7232));
  cone86.scale.set(1, 1, 0.45);
  tuft5.add(cone86);
  const tuft6 = new THREE.Group();
  tuft6.name = 'tuft6';
  tuft6.position.set(1.5599, 0.5, 0.1548);
  dressing.add(tuft6);
  const cone88 = new THREE.Mesh(new THREE.ConeGeometry(0.0497, 0.2528, 3), grassDarkMat);
  cone88.position.set(0.0434, 0.1064, -0.0108);
  cone88.rotation.set(deg(139.7096), deg(57.5483), deg(-140.2376));
  cone88.scale.set(1, 1, 0.45);
  tuft6.add(cone88);
  const cone89 = new THREE.Mesh(new THREE.ConeGeometry(0.0497, 0.2619, 3), grassMat);
  cone89.position.set(-0.0373, 0.1109, 0.0247);
  cone89.rotation.set(deg(7.3552), deg(13.7582), deg(17.4086));
  cone89.scale.set(1, 1, 0.45);
  tuft6.add(cone89);
  const cone90 = new THREE.Mesh(new THREE.ConeGeometry(0.0497, 0.1731, 3), reedMat);
  cone90.position.set(-0.0272, 0.0665, -0.0355);
  cone90.rotation.set(deg(-15.9301), deg(42.2778), deg(9.6633));
  cone90.scale.set(1, 1, 0.45);
  tuft6.add(cone90);
  const tuft7 = new THREE.Group();
  tuft7.name = 'tuft7';
  tuft7.position.set(-1.5728, 0.5, 1.379);
  dressing.add(tuft7);
  const cone92 = new THREE.Mesh(new THREE.ConeGeometry(0.0625, 0.3391, 3), grassDarkMat);
  cone92.position.set(0.0534, 0.1495, 0.0175);
  cone92.rotation.set(deg(15.9445), deg(49.5494), deg(-16.2269));
  cone92.scale.set(1, 1, 0.45);
  tuft7.add(cone92);
  const cone93 = new THREE.Mesh(new THREE.ConeGeometry(0.0625, 0.3287, 3), grassMat);
  cone93.position.set(0.024, 0.1443, 0.0509);
  cone93.rotation.set(deg(37.2492), deg(61.7655), deg(-19.5373));
  cone93.scale.set(1, 1, 0.45);
  tuft7.add(cone93);
  const cone94 = new THREE.Mesh(new THREE.ConeGeometry(0.0625, 0.2935, 3), reedMat);
  cone94.position.set(-0.0525, 0.1268, -0.0201);
  cone94.rotation.set(deg(-73.8416), deg(79.5202), deg(70.3358));
  cone94.scale.set(1, 1, 0.45);
  tuft7.add(cone94);
  const cone95 = new THREE.Mesh(new THREE.ConeGeometry(0.0625, 0.2993, 3), grassDarkMat);
  cone95.position.set(-0.0094, 0.1297, -0.0554);
  cone95.rotation.set(deg(175.1552), deg(74.6412), deg(172.1024));
  cone95.scale.set(1, 1, 0.45);
  tuft7.add(cone95);
  const tuft8 = new THREE.Group();
  tuft8.name = 'tuft8';
  tuft8.position.set(1.7082, 0.5, -0.0766);
  dressing.add(tuft8);
  const cone97 = new THREE.Mesh(new THREE.ConeGeometry(0.0598, 0.2773, 3), grassDarkMat);
  cone97.position.set(0.0536, 0.1187, -0.0056);
  cone97.rotation.set(deg(3.1085), deg(13.8969), deg(-21.5126));
  cone97.scale.set(1, 1, 0.45);
  tuft8.add(cone97);
  const cone98 = new THREE.Mesh(new THREE.ConeGeometry(0.0598, 0.2688, 3), grassMat);
  cone98.position.set(-0.0142, 0.1144, 0.052);
  cone98.rotation.set(deg(-162.8137), deg(64.3575), deg(173.1102));
  cone98.scale.set(1, 1, 0.45);
  tuft8.add(cone98);
  const cone99 = new THREE.Mesh(new THREE.ConeGeometry(0.0598, 0.2567, 3), reedMat);
  cone99.position.set(-0.0213, 0.1084, -0.0495);
  cone99.rotation.set(deg(-10.6422), deg(18.5355), deg(4.2058));
  cone99.scale.set(1, 1, 0.45);
  tuft8.add(cone99);
  const tuft9 = new THREE.Group();
  tuft9.name = 'tuft9';
  tuft9.position.set(-1.8438, 0.5, 0.8481);
  dressing.add(tuft9);
  const cone101 = new THREE.Mesh(new THREE.ConeGeometry(0.063, 0.2566, 3), grassDarkMat);
  cone101.position.set(0.0557, 0.1083, -0.0107);
  cone101.rotation.set(deg(15.8435), deg(53.656), deg(-22.4422));
  cone101.scale.set(1, 1, 0.45);
  tuft9.add(cone101);
  const cone102 = new THREE.Mesh(new THREE.ConeGeometry(0.063, 0.3456, 3), grassMat);
  cone102.position.set(-0.0424, 0.1528, 0.0377);
  cone102.rotation.set(deg(6.4236), deg(19.0398), deg(12.2484));
  cone102.scale.set(1, 1, 0.45);
  tuft9.add(cone102);
  const cone103 = new THREE.Mesh(new THREE.ConeGeometry(0.063, 0.2554, 3), reedMat);
  cone103.position.set(-0.0381, 0.1077, -0.0421);
  cone103.rotation.set(deg(-170.9733), deg(66.5918), deg(161.4355));
  cone103.scale.set(1, 1, 0.45);
  tuft9.add(cone103);
  const tuft10 = new THREE.Group();
  tuft10.name = 'tuft10';
  tuft10.position.set(1.7723, 0.5, 0.2077);
  dressing.add(tuft10);
  const cone105 = new THREE.Mesh(new THREE.ConeGeometry(0.0587, 0.2373, 3), grassDarkMat);
  cone105.position.set(0.0529, 0.0986, -0.0006);
  cone105.rotation.set(deg(3.8549), deg(17.2094), deg(-13.2995));
  cone105.scale.set(1, 1, 0.45);
  tuft10.add(cone105);
  const cone106 = new THREE.Mesh(new THREE.ConeGeometry(0.0587, 0.2448, 3), grassMat);
  cone106.position.set(0.022, 0.1024, 0.0481);
  cone106.rotation.set(deg(27.4601), deg(51.2801), deg(-12.63));
  cone106.scale.set(1, 1, 0.45);
  tuft10.add(cone106);
  const cone107 = new THREE.Mesh(new THREE.ConeGeometry(0.0587, 0.192, 3), reedMat);
  cone107.position.set(-0.0476, 0.076, 0.0229);
  cone107.rotation.set(deg(-14.5347), deg(49.9012), deg(30.232));
  cone107.scale.set(1, 1, 0.45);
  tuft10.add(cone107);
  const cone108 = new THREE.Mesh(new THREE.ConeGeometry(0.0587, 0.2375, 3), grassDarkMat);
  cone108.position.set(0.0186, 0.0987, -0.0495);
  cone108.rotation.set(deg(-8.5023), deg(50.2212), deg(-8.9522));
  cone108.scale.set(1, 1, 0.45);
  tuft10.add(cone108);

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

export default createRiverTile;

Valoraciones y comentarios

—
Aún no hay valoraciones — sé el primero.
5
0
4
0
3
0
2
0
1
0

Inicia sesión para valorar y comentar.

0 comentarios

Aún no hay comentarios. Cuenta cómo usaste este modelo o qué se podría mejorar.

Modelos relacionados

Misma categoría o etiquetas similares