삼각형 1.7천개5.87 × 7.27 × 5.05 m
코드에서 사용하기
에디터에서 리믹스floating-island.js · 436줄
독립형 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;
평점 및 댓글
댓글 0개
아직 댓글이 없어요. 이 모델을 어떻게 사용했는지, 어떤 점이 더 나아질 수 있을지 공유해 주세요.
관련 모델
같은 카테고리 또는 비슷한 태그









