Codels
삼각형 1.7천개5.87 × 7.27 × 5.05 m

코드에서 사용하기

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

// Tube along a smooth curve through the given points.
function tube(path, radius, tubularSegments, radialSegments, closed = false) {
  const curve = new THREE.CatmullRomCurve3(path.map(([x, y, z]) => new THREE.Vector3(x, y, z)), closed);
  return new THREE.TubeGeometry(curve, tubularSegments, radius, radialSegments, closed);
}

export function createFloatingIsland() {
  const root = new THREE.Group();
  root.name = 'FloatingIsland';

  // Materials
  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 leafMat = new THREE.MeshStandardMaterial({ name: 'leaf', color: 0x63993d, roughness: 0.85, flatShading: true });
  const dirtMat = new THREE.MeshStandardMaterial({ name: 'dirt', color: 0x8b5d3b, roughness: 0.95, flatShading: true });
  const rockMat = new THREE.MeshStandardMaterial({ name: 'rock', color: 0x8f8579, roughness: 0.92, flatShading: true });
  const rockDarkMat = new THREE.MeshStandardMaterial({ name: 'rockDark', color: 0x6f665c, roughness: 0.95, flatShading: true });
  const barkMat = new THREE.MeshStandardMaterial({ name: 'bark', color: 0x6a4a30, roughness: 0.95, flatShading: true });
  const petalMat = new THREE.MeshStandardMaterial({ name: 'petal', color: 0xfff3c4, roughness: 0.7, flatShading: true });
  const petalPinkMat = new THREE.MeshStandardMaterial({ name: 'petalPink', color: 0xf58fb0, roughness: 0.7, flatShading: true });

  // Shared geometries
  const icosahedronGeo = new THREE.IcosahedronGeometry(0.078, 0);
  const coneGeo = new THREE.ConeGeometry(0.0576, 0.2745, 3);
  const coneGeo2 = new THREE.ConeGeometry(0.0576, 0.221, 3);
  const cylinderGeo = new THREE.CylinderGeometry(0.012, 0.016, 0.2112, 4);
  const dodecahedronGeo = new THREE.DodecahedronGeometry(0.0549, 0);
  const coneGeo3 = new THREE.ConeGeometry(0.0338, 0.0845, 3);

  // Parts
  const island = new THREE.Group();
  island.name = 'island';
  island.position.set(0, 0.0368, 0);
  island.scale.set(1, 1, 0.8475);
  root.add(island);
  const meadow = new THREE.Mesh(jitter(lathe([[2.91, 4.38], [3, 4.5], [2.79, 4.65], [1.65, 4.77], [0, 4.8]], 14), 0.056, 35), grassMat);
  meadow.name = 'meadow';
  island.add(meadow);
  const earth = new THREE.Mesh(jitter(lathe([[2.58, 3.92], [2.85, 4.239], [2.91, 4.38]], 14), 0.056, 35), dirtMat);
  earth.name = 'earth';
  island.add(earth);
  const underside = new THREE.Mesh(jitter(lathe([[0, 0], [0.27, 0.4704], [0.6, 1.176], [1.08, 1.6464], [1.26, 2.1952], [1.86, 2.744], [2.1, 3.2928], [2.58, 3.92]], 14), 0.056, 35), rockMat);
  underside.name = 'underside';
  island.add(underside);
  const stalactite1 = new THREE.Mesh(jitter(new THREE.ConeGeometry(0.5915, 1.6952, 5), 0.071, 36), rockMat);
  stalactite1.name = 'stalactite1';
  stalactite1.position.set(1.5239, 2.0686, -0.3034);
  stalactite1.rotation.set(deg(180), deg(66.1855), 0);
  island.add(stalactite1);
  const stalactite2 = new THREE.Mesh(jitter(new THREE.ConeGeometry(0.4996, 1.6737, 5), 0.06, 37), rockDarkMat);
  stalactite2.name = 'stalactite2';
  stalactite2.position.set(0.1655, 1.7523, 1.2508);
  stalactite2.rotation.set(deg(180), deg(46.2945), 0);
  island.add(stalactite2);
  const stalactite3 = new THREE.Mesh(jitter(new THREE.ConeGeometry(0.586, 1.8327, 5), 0.0703, 38), rockMat);
  stalactite3.name = 'stalactite3';
  stalactite3.position.set(-1.2398, 1.6483, 0);
  stalactite3.rotation.set(deg(180), deg(59.4492), 0);
  island.add(stalactite3);
  const stalactite4 = new THREE.Mesh(jitter(new THREE.ConeGeometry(0.4173, 1.3961, 5), 0.0501, 39), rockDarkMat);
  stalactite4.name = 'stalactite4';
  stalactite4.position.set(-0.5167, 2.0784, -1.3323);
  stalactite4.rotation.set(deg(180), deg(20.8977), 0);
  island.add(stalactite4);
  const rockChunk1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.3953, 0), 0.0593, 75), rockDarkMat);
  rockChunk1.name = 'rockChunk1';
  rockChunk1.position.set(0.2867, 2.9206, 1.5177);
  island.add(rockChunk1);
  const rockChunk2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.5262, 0), 0.0789, 76), rockDarkMat);
  rockChunk2.name = 'rockChunk2';
  rockChunk2.position.set(-0.5638, 3.4194, 1.8579);
  island.add(rockChunk2);
  const rockChunk3 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.5367, 0), 0.0805, 77), rockDarkMat);
  rockChunk3.name = 'rockChunk3';
  rockChunk3.position.set(1.6745, 3.1009, 0.2135);
  island.add(rockChunk3);
  const vine1 = new THREE.Mesh(tube([[2.8671, 4.4, -0.401], [2.8473, 3.9354, -0.3982], [2.7681, 3.5552, -0.3872]], 0.031, 6, 4), grassDarkMat);
  vine1.name = 'vine1';
  island.add(vine1);
  const vineLeaf1 = new THREE.Mesh(icosahedronGeo, leafMat);
  vineLeaf1.name = 'vineLeaf1';
  vineLeaf1.position.set(2.7681, 3.5552, -0.3872);
  island.add(vineLeaf1);
  const vine2 = new THREE.Mesh(tube([[1.15, 4.4, 2.6568], [1.1421, 3.9251, 2.6384], [1.1103, 3.5366, 2.565]], 0.031, 6, 4), grassDarkMat);
  vine2.name = 'vine2';
  island.add(vine2);
  const vineLeaf2 = new THREE.Mesh(icosahedronGeo, leafMat);
  vineLeaf2.name = 'vineLeaf2';
  vineLeaf2.position.set(1.1103, 3.5366, 2.565);
  island.add(vineLeaf2);
  const vine3 = new THREE.Mesh(tube([[-2.5349, 4.4, 1.3983], [-2.5174, 3.7872, 1.3887], [-2.4473, 3.2859, 1.35]], 0.031, 6, 4), grassDarkMat);
  vine3.name = 'vine3';
  island.add(vine3);
  const vineLeaf3 = new THREE.Mesh(icosahedronGeo, leafMat);
  vineLeaf3.name = 'vineLeaf3';
  vineLeaf3.position.set(-2.4473, 3.2859, 1.35);
  island.add(vineLeaf3);
  const vine4 = new THREE.Mesh(tube([[-2.6773, 4.4, -1.1013], [-2.6588, 3.8717, -1.0937], [-2.5849, 3.4395, -1.0633]], 0.031, 6, 4), grassDarkMat);
  vine4.name = 'vine4';
  island.add(vine4);
  const vineLeaf4 = new THREE.Mesh(icosahedronGeo, leafMat);
  vineLeaf4.name = 'vineLeaf4';
  vineLeaf4.position.set(-2.5849, 3.4395, -1.0633);
  island.add(vineLeaf4);
  const vine5 = new THREE.Mesh(tube([[1.1757, 4.4, -2.6455], [1.1676, 4.0606, -2.6272], [1.1351, 3.783, -2.5541]], 0.031, 6, 4), grassDarkMat);
  vine5.name = 'vine5';
  island.add(vine5);
  const vineLeaf5 = new THREE.Mesh(icosahedronGeo, leafMat);
  vineLeaf5.name = 'vineLeaf5';
  vineLeaf5.position.set(1.1351, 3.783, -2.5541);
  island.add(vineLeaf5);
  const meadowDressing = new THREE.Group();
  meadowDressing.name = 'meadowDressing';
  root.add(meadowDressing);
  const tree = new THREE.Group();
  tree.name = 'tree';
  tree.position.set(0.7298, 4.7918, -0.3526);
  meadowDressing.add(tree);
  const trunk = new THREE.Mesh(new THREE.CylinderGeometry(0.0838, 0.1397, 1.4001, 6), barkMat);
  trunk.name = 'trunk';
  trunk.position.set(0.0014, 0.6985, -0.0462);
  trunk.rotation.set(deg(-3.7859), deg(0.0037), deg(-0.1131));
  tree.add(trunk);
  const branch = new THREE.Mesh(new THREE.CylinderGeometry(0.0419, 0.0699, 0.6248, 5), barkMat);
  branch.name = 'branch';
  branch.position.set(0.2032, 1.0414, 0.0635);
  branch.rotation.set(deg(11.7636), deg(-4.3791), deg(-40.7226));
  tree.add(branch);
  const crown = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.6604, 1), 0.0635, 38), leafMat);
  crown.name = 'crown';
  crown.position.set(0, 1.6764, 0);
  crown.scale.set(1.1, 0.85, 1.1);
  tree.add(crown);
  const crownSide = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.4572, 1), 0.0508, 39), grassMat);
  crownSide.name = 'crownSide';
  crownSide.position.set(0.508, 1.4732, 0.2032);
  tree.add(crownSide);
  const crownBack = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.4064, 1), 0.0508, 40), grassDarkMat);
  crownBack.name = 'crownBack';
  crownBack.position.set(-0.4064, 1.524, -0.3048);
  tree.add(crownBack);
  const crownTop = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.3556, 1), 0.0508, 41), leafMat);
  crownTop.name = 'crownTop';
  crownTop.position.set(0.1016, 2.1336, -0.0508);
  tree.add(crownTop);
  const boulder1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2689, 0), 0.0403, 95), rockMat);
  boulder1.name = 'boulder1';
  boulder1.position.set(-1.3155, 4.9708, -0.8727);
  boulder1.rotation.set(0, deg(1.718), 0);
  boulder1.scale.set(1.2, 0.8, 1);
  meadowDressing.add(boulder1);
  const boulder2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.264, 0), 0.0396, 96), rockDarkMat);
  boulder2.name = 'boulder2';
  boulder2.position.set(-1.8418, 4.9287, 0.4174);
  boulder2.rotation.set(0, deg(54.1851), 0);
  boulder2.scale.set(1.2, 0.8, 1);
  meadowDressing.add(boulder2);
  const tuft2 = new THREE.Group();
  tuft2.name = 'tuft2';
  tuft2.position.set(-0.7718, 4.8291, 0.3293);
  meadowDressing.add(tuft2);
  const cone33 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.1926, 3), grassDarkMat);
  cone33.position.set(0.0466, 0.0763, 0.0227);
  cone33.rotation.set(deg(151.2146), deg(63.4613), deg(-139.6257));
  cone33.scale.set(1, 1, 0.45);
  tuft2.add(cone33);
  const cone34 = new THREE.Mesh(coneGeo, grassMat);
  cone34.position.set(-0.0099, 0.1172, 0.0509);
  cone34.rotation.set(deg(12.7071), deg(9.9793), deg(2.5703));
  cone34.scale.set(1, 1, 0.45);
  tuft2.add(cone34);
  const cone35 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2554, 3), leafMat);
  cone35.position.set(-0.0077, 0.1077, -0.0513);
  cone35.rotation.set(deg(-96.6489), deg(87.665), deg(81.037));
  cone35.scale.set(1, 1, 0.45);
  tuft2.add(cone35);
  const tuft4 = new THREE.Group();
  tuft4.name = 'tuft4';
  tuft4.position.set(0.956, 4.7704, 0.7713);
  meadowDressing.add(tuft4);
  const cone37 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2616, 3), grassDarkMat);
  cone37.position.set(0.0501, 0.1108, 0.0133);
  cone37.rotation.set(deg(84.3123), deg(74.1251), deg(-80.4266));
  cone37.scale.set(1, 1, 0.45);
  tuft4.add(cone37);
  const cone38 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.309, 3), grassMat);
  cone38.position.set(-0.0188, 0.1345, 0.0483);
  cone38.rotation.set(deg(-9.5621), deg(76.8984), deg(23.6621));
  cone38.scale.set(1, 1, 0.45);
  tuft4.add(cone38);
  const cone39 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2505, 3), leafMat);
  cone39.position.set(-0.0517, 0.1052, -0.0032);
  cone39.rotation.set(deg(-6.5997), deg(30.0324), deg(11.7762));
  cone39.scale.set(1, 1, 0.45);
  tuft4.add(cone39);
  const cone40 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2021, 3), grassDarkMat);
  cone40.position.set(0.0015, 0.081, -0.0518);
  cone40.rotation.set(deg(-16.5192), deg(77.1101), deg(-2.3615));
  cone40.scale.set(1, 1, 0.45);
  tuft4.add(cone40);
  const tuft7 = new THREE.Group();
  tuft7.name = 'tuft7';
  tuft7.position.set(-0.8734, 4.8052, 1.3328);
  meadowDressing.add(tuft7);
  const cone42 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2961, 3), grassDarkMat);
  cone42.position.set(0.0467, 0.128, -0.0224);
  cone42.rotation.set(deg(-0.5491), deg(24.3294), deg(-20.5954));
  cone42.scale.set(1, 1, 0.45);
  tuft7.add(cone42);
  const cone43 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2054, 3), grassMat);
  cone43.position.set(0.021, 0.0827, 0.0474);
  cone43.rotation.set(deg(54.6327), deg(84.4082), deg(-45.7021));
  cone43.scale.set(1, 1, 0.45);
  tuft7.add(cone43);
  const cone44 = new THREE.Mesh(coneGeo2, leafMat);
  cone44.position.set(-0.0458, 0.0905, -0.0242);
  cone44.rotation.set(deg(-149.1902), deg(65.027), deg(137.3396));
  cone44.scale.set(1, 1, 0.45);
  tuft7.add(cone44);
  const cone45 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2257, 3), grassDarkMat);
  cone45.position.set(-0.0176, 0.0929, -0.0487);
  cone45.rotation.set(deg(-19.7595), deg(50.9219), deg(7.7887));
  cone45.scale.set(1, 1, 0.45);
  tuft7.add(cone45);
  const tuft8 = new THREE.Group();
  tuft8.name = 'tuft8';
  tuft8.position.set(-0.3522, 4.7967, -1.6102);
  meadowDressing.add(tuft8);
  const cone47 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2854, 3), grassDarkMat);
  cone47.position.set(0.0518, 0.1227, 0.0004);
  cone47.rotation.set(deg(106.4269), deg(69.6578), deg(-105.3074));
  cone47.scale.set(1, 1, 0.45);
  tuft8.add(cone47);
  const cone48 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2866, 3), grassMat);
  cone48.position.set(0, 0.1233, 0.0518);
  cone48.rotation.set(deg(13.8602), deg(22.1554), deg(0.0093));
  cone48.scale.set(1, 1, 0.45);
  tuft8.add(cone48);
  const cone49 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2196, 3), leafMat);
  cone49.position.set(-0.0492, 0.0898, 0.0165);
  cone49.rotation.set(deg(-5.3812), deg(30.2179), deg(23.9125));
  cone49.scale.set(1, 1, 0.45);
  tuft8.add(cone49);
  const cone50 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.1983, 3), grassDarkMat);
  cone50.position.set(0.0108, 0.0791, -0.0507);
  cone50.rotation.set(deg(-7.9445), deg(46.4754), deg(-3.14));
  cone50.scale.set(1, 1, 0.45);
  tuft8.add(cone50);
  const flower9 = new THREE.Group();
  flower9.name = 'flower9';
  flower9.position.set(1.9656, 4.7156, 0.5141);
  meadowDressing.add(flower9);
  const cylinder52 = new THREE.Mesh(cylinderGeo, grassDarkMat);
  cylinder52.position.set(0, 0.0856, 0);
  flower9.add(cylinder52);
  const dodecahedron53 = new THREE.Mesh(dodecahedronGeo, petalMat);
  dodecahedron53.position.set(0, 0.2012, 0);
  dodecahedron53.scale.set(1, 0.6, 1);
  flower9.add(dodecahedron53);
  const cone54 = new THREE.Mesh(coneGeo3, grassDarkMat);
  cone54.position.set(0.0169, 0.0296, 0);
  cone54.rotation.set(0, deg(272.5467), deg(-40));
  cone54.scale.set(1, 1, 0.4);
  flower9.add(cone54);
  const tuft10 = new THREE.Group();
  tuft10.name = 'tuft10';
  tuft10.position.set(-1.8252, 4.7112, 1.0021);
  meadowDressing.add(tuft10);
  const cone56 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2876, 3), grassDarkMat);
  cone56.position.set(0.0507, 0.1238, 0.011);
  cone56.rotation.set(deg(6.8297), deg(24.8492), deg(-10.9643));
  cone56.scale.set(1, 1, 0.45);
  tuft10.add(cone56);
  const cone57 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2468, 3), grassMat);
  cone57.position.set(-0.0191, 0.1034, 0.0482);
  cone57.rotation.set(deg(-158.6797), deg(65.3844), deg(169.1714));
  cone57.scale.set(1, 1, 0.45);
  tuft10.add(cone57);
  const cone58 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2815, 3), leafMat);
  cone58.position.set(-0.0493, 0.1208, 0.0161);
  cone58.rotation.set(deg(-19.8483), deg(50.7371), deg(33.0792));
  cone58.scale.set(1, 1, 0.45);
  tuft10.add(cone58);
  const cone59 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2165, 3), grassDarkMat);
  cone59.position.set(-0.0231, 0.0883, -0.0464);
  cone59.rotation.set(deg(-11.3485), deg(11.3103), deg(5.2035));
  cone59.scale.set(1, 1, 0.45);
  tuft10.add(cone59);
  const tuft11 = new THREE.Group();
  tuft11.name = 'tuft11';
  tuft11.position.set(1.1207, 4.7176, -1.6889);
  meadowDressing.add(tuft11);
  const cone61 = new THREE.Mesh(coneGeo, grassDarkMat);
  cone61.position.set(0.048, 0.1172, -0.0195);
  cone61.rotation.set(deg(18.8401), deg(58.4179), deg(-28.5656));
  cone61.scale.set(1, 1, 0.45);
  tuft11.add(cone61);
  const cone62 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.3031, 3), grassMat);
  cone62.position.set(-0.0379, 0.1316, 0.0353);
  cone62.rotation.set(deg(-100.8453), deg(74.9121), deg(113.3611));
  cone62.scale.set(1, 1, 0.45);
  tuft11.add(cone62);
  const cone63 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2918, 3), leafMat);
  cone63.position.set(-0.0107, 0.1259, -0.0507);
  cone63.rotation.set(deg(-24.9968), deg(53.7131), deg(6.8218));
  cone63.scale.set(1, 1, 0.45);
  tuft11.add(cone63);
  const flower12 = new THREE.Group();
  flower12.name = 'flower12';
  flower12.position.set(0.6361, 4.7458, 1.9548);
  meadowDressing.add(flower12);
  const cylinder65 = new THREE.Mesh(cylinderGeo, grassDarkMat);
  cylinder65.position.set(0, 0.0856, 0);
  flower12.add(cylinder65);
  const dodecahedron66 = new THREE.Mesh(dodecahedronGeo, petalPinkMat);
  dodecahedron66.position.set(0, 0.2012, 0);
  dodecahedron66.scale.set(1, 0.6, 1);
  flower12.add(dodecahedron66);
  const cone67 = new THREE.Mesh(coneGeo3, grassDarkMat);
  cone67.position.set(0.0169, 0.0296, 0);
  cone67.rotation.set(0, deg(218.754), deg(-40));
  cone67.scale.set(1, 1, 0.4);
  flower12.add(cone67);
  const tuft13 = new THREE.Group();
  tuft13.name = 'tuft13';
  tuft13.position.set(-2.3003, 4.7223, -0.8179);
  meadowDressing.add(tuft13);
  const cone69 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.3042, 3), grassDarkMat);
  cone69.position.set(0.0476, 0.1321, 0.0204);
  cone69.rotation.set(deg(77.7387), deg(70.836), deg(-70.7486));
  cone69.scale.set(1, 1, 0.45);
  tuft13.add(cone69);
  const cone70 = new THREE.Mesh(coneGeo2, grassMat);
  cone70.position.set(-0.0188, 0.0905, 0.0483);
  cone70.rotation.set(deg(-147.343), deg(73.8542), deg(160.5168));
  cone70.scale.set(1, 1, 0.45);
  tuft13.add(cone70);
  const cone71 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2069, 3), leafMat);
  cone71.position.set(-0.0042, 0.0834, -0.0517);
  cone71.rotation.set(deg(-21.3736), deg(6.0545), deg(1.7));
  cone71.scale.set(1, 1, 0.45);
  tuft13.add(cone71);
  const tuft14 = new THREE.Group();
  tuft14.name = 'tuft14';
  tuft14.position.set(2.5916, 4.6457, 0.0564);
  meadowDressing.add(tuft14);
  const cone73 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2198, 3), grassDarkMat);
  cone73.position.set(0.0517, 0.0899, 0.0041);
  cone73.rotation.set(deg(11.5844), deg(27.8099), deg(-20.8786));
  cone73.scale.set(1, 1, 0.45);
  tuft14.add(cone73);
  const cone74 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2778, 3), grassMat);
  cone74.position.set(0.0095, 0.1189, 0.051);
  cone74.rotation.set(deg(28.7785), deg(74.1717), deg(-11.7837));
  cone74.scale.set(1, 1, 0.45);
  tuft14.add(cone74);
  const cone75 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.1915, 3), leafMat);
  cone75.position.set(-0.0506, 0.0758, 0.011);
  cone75.rotation.set(deg(-3.1065), deg(27.058), deg(11.7746));
  cone75.scale.set(1, 1, 0.45);
  tuft14.add(cone75);
  const cone76 = new THREE.Mesh(new THREE.ConeGeometry(0.0576, 0.2593, 3), grassDarkMat);
  cone76.position.set(0.0164, 0.1097, -0.0492);
  cone76.rotation.set(deg(112.6568), deg(83.0238), deg(-128.9548));
  cone76.scale.set(1, 1, 0.45);
  tuft14.add(cone76);
  const pebble1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.09, 0), 0.0162, 227), rockMat);
  pebble1.name = 'pebble1';
  pebble1.position.set(1.977, 4.749, -1.1531);
  pebble1.rotation.set(deg(-7.7971), deg(165.1714), deg(-3.5011));
  pebble1.scale.set(1.2669, 0.4963, 1);
  meadowDressing.add(pebble1);
  const pebble2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.09, 0), 0.0162, 234), rockMat);
  pebble2.name = 'pebble2';
  pebble2.position.set(-1.2233, 4.7326, 1.7499);
  pebble2.rotation.set(deg(-1.7104), deg(184.5319), deg(5.6244));
  pebble2.scale.set(1.129, 0.5104, 1);
  meadowDressing.add(pebble2);
  const pebble3 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.09, 0), 0.0162, 30), rockMat);
  pebble3.name = 'pebble3';
  pebble3.position.set(1.5898, 4.7604, 1.5238);
  pebble3.rotation.set(deg(7.3075), deg(320.0536), deg(-4.8517));
  pebble3.scale.set(1.1571, 0.511, 1);
  meadowDressing.add(pebble3);

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

export default createFloatingIsland;

평점 및 댓글

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

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

댓글 0개

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

관련 모델

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