삼각형 1.6천개3.68 × 7.07 × 2.88 m
코드에서 사용하기
에디터에서 리믹스birch-tree.js · 463줄
독립형 ES 모듈이에요 — three에만 의존해요. 팩토리 함수를 호출하고 그룹을 씬에 추가하세요.
/**
* Birch Tree — Codels 3D model library
* License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
* Triangles: 1,628 · Size (W × H × D): 3.67 × 7.07 × 2.88 m
*
* Usage:
* import { createBirchTree } from './birch-tree.js';
*
* const model = createBirchTree();
* 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;
}
export function createBirchTree() {
const root = new THREE.Group();
root.name = 'BirchTree';
// Materials
const barkMat = new THREE.MeshStandardMaterial({ name: 'bark', color: 0xece8de, roughness: 0.8, flatShading: true });
const stripeMat = new THREE.MeshStandardMaterial({ name: 'stripe', color: 0x2e2925, roughness: 0.95, flatShading: true });
const baseMat = new THREE.MeshStandardMaterial({ name: 'base', color: 0x6b625a, roughness: 0.95, flatShading: true });
const leafMat = new THREE.MeshStandardMaterial({ name: 'leaf', color: 0x9cc95a, roughness: 0.85, flatShading: true });
const leafLightMat = new THREE.MeshStandardMaterial({ name: 'leafLight', color: 0xa4d171, roughness: 0.85, flatShading: true });
const leafDarkMat = new THREE.MeshStandardMaterial({ name: 'leafDark', color: 0x86a54a, roughness: 0.9, flatShading: true });
// Parts
const trunk1 = new THREE.Group();
trunk1.name = 'trunk1';
trunk1.position.set(0.1407, 0.0226, 0.104);
trunk1.rotation.set(deg(4.2818), 0, deg(-5.7937));
root.add(trunk1);
const stem = new THREE.Mesh(new THREE.CylinderGeometry(0.042, 0.154, 7, 6), barkMat);
stem.name = 'stem';
stem.position.set(0, 3.5, 0);
trunk1.add(stem);
const rootBand = new THREE.Mesh(new THREE.CylinderGeometry(0.1608, 0.1817, 0.49, 6), baseMat);
rootBand.name = 'rootBand';
rootBand.position.set(0, 0.245, 0);
trunk1.add(rootBand);
const dash1 = new THREE.Mesh(new THREE.BoxGeometry(0.0735, 0.0769, 0.0176), stripeMat);
dash1.name = 'dash1';
dash1.position.set(-0.0788, 4.13, 0);
dash1.rotation.set(0, deg(270), 0);
trunk1.add(dash1);
const dash2 = new THREE.Mesh(new THREE.BoxGeometry(0.0838, 0.0576, 0.02), stripeMat);
dash2.name = 'dash2';
dash2.position.set(-0.0448, 3.3812, -0.0775);
dash2.rotation.set(0, deg(210), 0);
trunk1.add(dash2);
const dash3 = new THREE.Mesh(new THREE.BoxGeometry(0.0917, 0.0602, 0.0235), stripeMat);
dash3.name = 'dash3';
dash3.position.set(0.0526, 2.2936, -0.091);
dash3.rotation.set(0, deg(150), 0);
trunk1.add(dash3);
const dash4 = new THREE.Mesh(new THREE.BoxGeometry(0.0673, 0.0637, 0.0162), stripeMat);
dash4.name = 'dash4';
dash4.position.set(0.0363, 4.5585, -0.0629);
dash4.rotation.set(0, deg(150), 0);
trunk1.add(dash4);
const dash5 = new THREE.Mesh(new THREE.BoxGeometry(0.0465, 0.0802, 0.0168), stripeMat);
dash5.name = 'dash5';
dash5.position.set(0.0377, 4.3633, -0.0653);
dash5.rotation.set(0, deg(150), 0);
trunk1.add(dash5);
const dash6 = new THREE.Mesh(new THREE.BoxGeometry(0.057, 0.0669, 0.0152), stripeMat);
dash6.name = 'dash6';
dash6.position.set(-0.034, 4.8788, 0.0589);
dash6.rotation.set(0, deg(330), 0);
trunk1.add(dash6);
const dash7 = new THREE.Mesh(new THREE.BoxGeometry(0.0827, 0.0606, 0.0187), stripeMat);
dash7.name = 'dash7';
dash7.position.set(0.0837, 3.7884, 0);
dash7.rotation.set(0, deg(90), 0);
trunk1.add(dash7);
const dash8 = new THREE.Mesh(new THREE.BoxGeometry(0.079, 0.0798, 0.0216), stripeMat);
dash8.name = 'dash8';
dash8.position.set(0.0485, 2.8635, 0.0839);
dash8.rotation.set(0, deg(30), 0);
trunk1.add(dash8);
const dash9 = new THREE.Mesh(new THREE.BoxGeometry(0.0582, 0.0638, 0.0184), stripeMat);
dash9.name = 'dash9';
dash9.position.set(0.0824, 3.8758, 0);
dash9.rotation.set(0, deg(90), 0);
trunk1.add(dash9);
const dash10 = new THREE.Mesh(new THREE.BoxGeometry(0.0911, 0.0625, 0.0257), stripeMat);
dash10.name = 'dash10';
dash10.position.set(-0.0575, 1.6059, 0.0996);
dash10.rotation.set(0, deg(330), 0);
trunk1.add(dash10);
const dash11 = new THREE.Mesh(new THREE.BoxGeometry(0.077, 0.0677, 0.0219), stripeMat);
dash11.name = 'dash11';
dash11.position.set(0.0491, 2.7747, -0.0851);
dash11.rotation.set(0, deg(150), 0);
trunk1.add(dash11);
const dash12 = new THREE.Mesh(new THREE.BoxGeometry(0.0547, 0.059, 0.0223), stripeMat);
dash12.name = 'dash12';
dash12.position.set(0.05, 2.6471, 0.0866);
dash12.rotation.set(0, deg(30), 0);
trunk1.add(dash12);
const dash13 = new THREE.Mesh(new THREE.BoxGeometry(0.0747, 0.0636, 0.026), stripeMat);
dash13.name = 'dash13';
dash13.position.set(-0.1164, 1.506, 0);
dash13.rotation.set(0, deg(270), 0);
trunk1.add(dash13);
const dash14 = new THREE.Mesh(new THREE.BoxGeometry(0.0805, 0.0502, 0.0259), stripeMat);
dash14.name = 'dash14';
dash14.position.set(0.058, 1.5332, 0.1005);
dash14.rotation.set(0, deg(30), 0);
trunk1.add(dash14);
const dash15 = new THREE.Mesh(new THREE.BoxGeometry(0.0668, 0.07, 0.0214), stripeMat);
dash15.name = 'dash15';
dash15.position.set(-0.0479, 2.9458, 0.0829);
dash15.rotation.set(0, deg(330), 0);
trunk1.add(dash15);
const dash16 = new THREE.Mesh(new THREE.BoxGeometry(0.0699, 0.0755, 0.0228), stripeMat);
dash16.name = 'dash16';
dash16.position.set(0.0511, 2.4929, -0.0886);
dash16.rotation.set(0, deg(150), 0);
trunk1.add(dash16);
const dash17 = new THREE.Mesh(new THREE.BoxGeometry(0.0539, 0.0671, 0.023), stripeMat);
dash17.name = 'dash17';
dash17.position.set(-0.1031, 2.435, 0);
dash17.rotation.set(0, deg(270), 0);
trunk1.add(dash17);
const leaves1 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.5592, 0), 0.0671, 388), leafDarkMat);
leaves1.name = 'leaves1';
leaves1.position.set(0.5727, 2.9497, 0.0738);
leaves1.rotation.set(deg(73.4034), deg(288.6261), deg(42.9238));
leaves1.scale.set(1, 0.72, 1);
trunk1.add(leaves1);
const twig1 = new THREE.Mesh(new THREE.CylinderGeometry(0.021, 0.0516, 0.5632, 4), barkMat);
twig1.name = 'twig1';
twig1.position.set(0.2291, 2.6208, 0.0295);
twig1.rotation.set(deg(6.0237), deg(-3.108), deg(-54.5519));
trunk1.add(twig1);
const leaves2 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.5773, 0), 0.0693, 389), leafDarkMat);
leaves2.name = 'leaves2';
leaves2.position.set(-0.2871, 3.1907, -0.6457);
leaves2.rotation.set(deg(59.2857), deg(35.4968), deg(59.5406));
leaves2.scale.set(1, 0.72, 1);
trunk1.add(leaves2);
const leaves3 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.6098, 0), 0.0732, 390), leafDarkMat);
leaves3.name = 'leaves3';
leaves3.position.set(-0.4395, 3.4749, 0.6826);
leaves3.rotation.set(deg(84.639), deg(73.8131), deg(34.5893));
leaves3.scale.set(1, 0.72, 1);
trunk1.add(leaves3);
const twig3 = new THREE.Mesh(new THREE.CylinderGeometry(0.021, 0.0478, 0.7184, 4), barkMat);
twig3.name = 'twig3';
twig3.position.set(-0.1758, 3.1384, 0.273);
twig3.rotation.set(deg(51.934), deg(15.1079), deg(30.4637));
trunk1.add(twig3);
const leaves4 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.6463, 0), 0.0776, 391), leafDarkMat);
leaves4.name = 'leaves4';
leaves4.position.set(0.8883, 3.6966, 0.0192);
leaves4.rotation.set(deg(77.628), deg(213.0255), deg(59.7425));
leaves4.scale.set(1, 0.72, 1);
trunk1.add(leaves4);
const leaves5 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.5744, 0), 0.0689, 392), leafLightMat);
leaves5.name = 'leaves5';
leaves5.position.set(-0.8081, 4.3853, -0.4669);
leaves5.rotation.set(deg(37.7315), deg(196.91), deg(60.7737));
leaves5.scale.set(1, 0.72, 1);
trunk1.add(leaves5);
const twig5 = new THREE.Mesh(new THREE.CylinderGeometry(0.021, 0.0413, 0.8114, 4), barkMat);
twig5.name = 'twig5';
twig5.position.set(-0.3232, 4.0541, -0.1868);
twig5.rotation.set(deg(-28.5053), deg(-15.2831), deg(55.6842));
trunk1.add(twig5);
const leaves6 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.6348, 0), 0.0762, 393), leafLightMat);
leaves6.name = 'leaves6';
leaves6.position.set(-0.1046, 4.6604, 0.9387);
leaves6.rotation.set(deg(53.8574), deg(235.909), deg(34.6492));
leaves6.scale.set(1, 0.72, 1);
trunk1.add(leaves6);
const leaves7 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.6751, 0), 0.081, 394), leafMat);
leaves7.name = 'leaves7';
leaves7.position.set(0.8496, 4.6391, -0.3567);
leaves7.rotation.set(deg(84.0865), deg(82.2343), deg(5.4748));
leaves7.scale.set(1, 0.72, 1);
trunk1.add(leaves7);
const twig7 = new THREE.Mesh(new THREE.CylinderGeometry(0.021, 0.0394, 0.7912, 4), barkMat);
twig7.name = 'twig7';
twig7.position.set(0.3398, 4.2929, -0.1427);
twig7.rotation.set(deg(-21.7383), deg(13.1359), deg(-61.897));
trunk1.add(twig7);
const leaves8 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.5901, 0), 0.0708, 395), leafLightMat);
leaves8.name = 'leaves8';
leaves8.position.set(-0.8628, 5.3243, 0.0653);
leaves8.rotation.set(deg(83.8135), deg(142.9853), deg(50.3736));
leaves8.scale.set(1, 0.72, 1);
trunk1.add(leaves8);
const leaves9 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.6211, 0), 0.0745, 396), leafMat);
leaves9.name = 'leaves9';
leaves9.position.set(0.248, 5.3743, 0.7377);
leaves9.rotation.set(deg(28.2788), deg(208.5037), deg(69.9012));
leaves9.scale.set(1, 0.72, 1);
trunk1.add(leaves9);
const twig9 = new THREE.Mesh(new THREE.CylinderGeometry(0.021, 0.0341, 0.6927, 4), barkMat);
twig9.name = 'twig9';
twig9.position.set(0.0992, 5.0361, 0.2951);
twig9.rotation.set(deg(59.8244), deg(-9.7649), deg(-16.8911));
trunk1.add(twig9);
const leaves10 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4896, 0), 0.0588, 397), leafLightMat);
leaves10.name = 'leaves10';
leaves10.position.set(0.2388, 5.8158, -0.6198);
leaves10.rotation.set(deg(89.5795), deg(319.983), deg(54.1611));
leaves10.scale.set(1, 0.72, 1);
trunk1.add(leaves10);
const leaves11 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4504, 0), 0.054, 398), leafLightMat);
leaves11.name = 'leaves11';
leaves11.position.set(-0.5107, 6.0738, 0.1334);
leaves11.rotation.set(deg(11.9234), deg(82.0899), deg(51.8621));
leaves11.scale.set(1, 0.72, 1);
trunk1.add(leaves11);
const twig11 = new THREE.Mesh(new THREE.CylinderGeometry(0.021, 0.0291, 0.5516, 4), barkMat);
twig11.name = 'twig11';
twig11.position.set(-0.2043, 5.7612, 0.0533);
twig11.rotation.set(deg(11.1958), deg(5.0013), deg(48.0326));
trunk1.add(twig11);
const leaves12 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4632, 0), 0.0556, 399), leafLightMat);
leaves12.name = 'leaves12';
leaves12.position.set(0.1771, 6.1551, 0.3305);
leaves12.rotation.set(deg(20.8778), deg(126.0153), deg(9.4484));
leaves12.scale.set(1, 0.72, 1);
trunk1.add(leaves12);
const leaves13 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4165, 0), 0.05, 400), leafLightMat);
leaves13.name = 'leaves13';
leaves13.position.set(-0.0103, 6.6239, -0.2119);
leaves13.rotation.set(deg(37.4807), deg(271.1383), deg(39.9908));
leaves13.scale.set(1, 0.72, 1);
trunk1.add(leaves13);
const leaves14 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.3745, 0), 0.0449, 401), leafLightMat);
leaves14.name = 'leaves14';
leaves14.position.set(-0.1378, 6.8111, 0.0245);
leaves14.rotation.set(deg(3.2519), deg(290.2387), deg(53.6753));
leaves14.scale.set(1, 0.72, 1);
trunk1.add(leaves14);
const trunk2 = new THREE.Group();
trunk2.name = 'trunk2';
trunk2.position.set(-0.1282, 0.0204, -0.0286);
trunk2.rotation.set(deg(-1.965), 0, deg(8.7977));
root.add(trunk2);
const stem2 = new THREE.Mesh(new THREE.CylinderGeometry(0.0315, 0.1156, 5.2546, 6), barkMat);
stem2.name = 'stem';
stem2.position.set(0, 2.6273, 0);
trunk2.add(stem2);
const rootBand2 = new THREE.Mesh(new THREE.CylinderGeometry(0.1207, 0.1364, 0.3678, 6), baseMat);
rootBand2.name = 'rootBand';
rootBand2.position.set(0, 0.1839, 0);
trunk2.add(rootBand2);
const dash18 = new THREE.Mesh(new THREE.BoxGeometry(0.0645, 0.0391, 0.0149), stripeMat);
dash18.name = 'dash1';
dash18.position.set(0.0334, 2.5707, -0.0578);
dash18.rotation.set(0, deg(150), 0);
trunk2.add(dash18);
const dash22 = new THREE.Mesh(new THREE.BoxGeometry(0.0405, 0.0577, 0.0103), stripeMat);
dash22.name = 'dash2';
dash22.position.set(-0.0231, 3.9958, 0.0401);
dash22.rotation.set(0, deg(330), 0);
trunk2.add(dash22);
const dash32 = new THREE.Mesh(new THREE.BoxGeometry(0.0433, 0.0404, 0.0151), stripeMat);
dash32.name = 'dash3';
dash32.position.set(-0.0677, 2.4997, 0);
dash32.rotation.set(0, deg(270), 0);
trunk2.add(dash32);
const dash42 = new THREE.Mesh(new THREE.BoxGeometry(0.0454, 0.0399, 0.0101), stripeMat);
dash42.name = 'dash4';
dash42.position.set(-0.0454, 4.0614, 0);
dash42.rotation.set(0, deg(270), 0);
trunk2.add(dash42);
const dash52 = new THREE.Mesh(new THREE.BoxGeometry(0.0306, 0.0592, 0.0101), stripeMat);
dash52.name = 'dash5';
dash52.position.set(0.0454, 4.0588, 0);
dash52.rotation.set(0, deg(90), 0);
trunk2.add(dash52);
const dash62 = new THREE.Mesh(new THREE.BoxGeometry(0.0681, 0.0598, 0.0169), stripeMat);
dash62.name = 'dash6';
dash62.position.set(0.0755, 1.9578, 0);
dash62.rotation.set(0, deg(90), 0);
trunk2.add(dash62);
const dash72 = new THREE.Mesh(new THREE.BoxGeometry(0.0487, 0.0516, 0.0211), stripeMat);
dash72.name = 'dash7';
dash72.position.set(-0.0472, 0.6357, -0.0818);
dash72.rotation.set(0, deg(210), 0);
trunk2.add(dash72);
const dash82 = new THREE.Mesh(new THREE.BoxGeometry(0.0413, 0.0489, 0.0151), stripeMat);
dash82.name = 'dash8';
dash82.position.set(0.0338, 2.506, -0.0586);
dash82.rotation.set(0, deg(150), 0);
trunk2.add(dash82);
const dash92 = new THREE.Mesh(new THREE.BoxGeometry(0.0267, 0.0392, 0.011), stripeMat);
dash92.name = 'dash9';
dash92.position.set(-0.0246, 3.7913, -0.0426);
dash92.rotation.set(0, deg(210), 0);
trunk2.add(dash92);
const dash102 = new THREE.Mesh(new THREE.BoxGeometry(0.0622, 0.0317, 0.015), stripeMat);
dash102.name = 'dash10';
dash102.position.set(-0.0672, 2.5349, 0);
dash102.rotation.set(0, deg(270), 0);
trunk2.add(dash102);
const dash112 = new THREE.Mesh(new THREE.BoxGeometry(0.066, 0.0606, 0.0181), stripeMat);
dash112.name = 'dash11';
dash112.position.set(-0.0813, 1.5568, 0);
dash112.rotation.set(0, deg(270), 0);
trunk2.add(dash112);
const dash122 = new THREE.Mesh(new THREE.BoxGeometry(0.064, 0.0455, 0.0165), stripeMat);
dash122.name = 'dash12';
dash122.position.set(0.0369, 2.0723, 0.064);
dash122.rotation.set(0, deg(30), 0);
trunk2.add(dash122);
const dash132 = new THREE.Mesh(new THREE.BoxGeometry(0.0754, 0.0345, 0.0179), stripeMat);
dash132.name = 'dash13';
dash132.position.set(0.08, 1.643, 0);
dash132.rotation.set(0, deg(90), 0);
trunk2.add(dash132);
const dash142 = new THREE.Mesh(new THREE.BoxGeometry(0.0922, 0.0419, 0.0204), stripeMat);
dash142.name = 'dash14';
dash142.position.set(0.0913, 0.8548, 0);
dash142.rotation.set(0, deg(90), 0);
trunk2.add(dash142);
const dash152 = new THREE.Mesh(new THREE.BoxGeometry(0.0531, 0.0419, 0.0191), stripeMat);
dash152.name = 'dash15';
dash152.position.set(0.0428, 1.259, 0.0741);
dash152.rotation.set(0, deg(30), 0);
trunk2.add(dash152);
const leaves15 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.3374, 0), 0.0405, 419), leafDarkMat);
leaves15.name = 'leaves1';
leaves15.position.set(0.4146, 2.0729, -0.1397);
leaves15.rotation.set(deg(32.5028), deg(260.0932), deg(49.3144));
leaves15.scale.set(1, 0.72, 1);
trunk2.add(leaves15);
const twig12 = new THREE.Mesh(new THREE.CylinderGeometry(0.0158, 0.0397, 0.44, 4), barkMat);
twig12.name = 'twig1';
twig12.position.set(0.1658, 1.8384, -0.0559);
twig12.rotation.set(deg(-14.82), deg(6.8464), deg(-49.3995));
trunk2.add(twig12);
const leaves22 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4243, 0), 0.0509, 420), leafDarkMat);
leaves22.name = 'leaves2';
leaves22.position.set(-0.1915, 2.5193, -0.5055);
leaves22.rotation.set(deg(9.6746), deg(90.1417), deg(75.1377));
leaves22.scale.set(1, 0.72, 1);
trunk2.add(leaves22);
const leaves32 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.3894, 0), 0.0467, 421), leafDarkMat);
leaves32.name = 'leaves3';
leaves32.position.set(-0.3577, 2.603, 0.5091);
leaves32.rotation.set(deg(85.6194), deg(295.6045), deg(58.2741));
leaves32.scale.set(1, 0.72, 1);
trunk2.add(leaves32);
const twig32 = new THREE.Mesh(new THREE.CylinderGeometry(0.0158, 0.0359, 0.5575, 4), barkMat);
twig32.name = 'twig3';
twig32.position.set(-0.1431, 2.3606, 0.2036);
twig32.rotation.set(deg(49.1397), deg(14.9868), deg(32.1008));
trunk2.add(twig32);
const leaves42 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4527, 0), 0.0543, 422), leafDarkMat);
leaves42.name = 'leaves4';
leaves42.position.set(0.5355, 2.9215, -0.4166);
leaves42.rotation.set(deg(5.726), deg(336.5948), deg(37.4783));
leaves42.scale.set(1, 0.72, 1);
trunk2.add(leaves42);
const leaves52 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4298, 0), 0.0516, 423), leafLightMat);
leaves52.name = 'leaves5';
leaves52.position.set(-0.5349, 3.3869, -0.4614);
leaves52.rotation.set(deg(74.3543), deg(73.3702), deg(27.8049));
leaves52.scale.set(1, 0.72, 1);
trunk2.add(leaves52);
const twig52 = new THREE.Mesh(new THREE.CylinderGeometry(0.0158, 0.0303, 0.6135, 4), barkMat);
twig52.name = 'twig5';
twig52.position.set(-0.214, 3.1386, -0.1846);
twig52.rotation.set(deg(-39.1317), deg(-17.5789), deg(47.0221));
trunk2.add(twig52);
const leaves62 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4084, 0), 0.049, 424), leafMat);
leaves62.name = 'leaves6';
leaves62.position.set(-0.0082, 3.5833, 0.7047);
leaves62.rotation.set(deg(88.1426), deg(100.6363), deg(75.4095));
leaves62.scale.set(1, 0.72, 1);
trunk2.add(leaves62);
const leaves72 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.448, 0), 0.0538, 425), leafMat);
leaves72.name = 'leaves7';
leaves72.position.set(0.5824, 3.6927, -0.3386);
leaves72.rotation.set(deg(32.5608), deg(22.0269), deg(77.6961));
leaves72.scale.set(1, 0.72, 1);
trunk2.add(leaves72);
const twig72 = new THREE.Mesh(new THREE.CylinderGeometry(0.0158, 0.0281, 0.5873, 4), barkMat);
twig72.name = 'twig7';
twig72.position.set(0.233, 3.4415, -0.1354);
twig72.rotation.set(deg(-28.545), deg(15.1768), deg(-55.2823));
trunk2.add(twig72);
const leaves82 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4579, 0), 0.0549, 426), leafMat);
leaves82.name = 'leaves8';
leaves82.position.set(-0.5345, 4.0918, -0.3032);
leaves82.rotation.set(deg(12.0748), deg(61.2067), deg(57.9957));
leaves82.scale.set(1, 0.72, 1);
trunk2.add(leaves82);
const leaves92 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.4321, 0), 0.0519, 427), leafMat);
leaves92.name = 'leaves9';
leaves92.position.set(0.0788, 4.3516, 0.5244);
leaves92.rotation.set(deg(30.5166), deg(199.7705), deg(76.4922));
leaves92.scale.set(1, 0.72, 1);
trunk2.add(leaves92);
const twig92 = new THREE.Mesh(new THREE.CylinderGeometry(0.0158, 0.0233, 0.4865, 4), barkMat);
twig92.name = 'twig9';
twig92.position.set(0.0315, 4.1029, 0.2098);
twig92.rotation.set(deg(59.8514), deg(-4.2997), deg(-7.4626));
trunk2.add(twig92);
const leaves102 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.3329, 0), 0.04, 428), leafLightMat);
leaves102.name = 'leaves10';
leaves102.position.set(0.0914, 4.503, -0.4152);
leaves102.rotation.set(deg(25.5574), deg(291.2982), deg(21.1455));
leaves102.scale.set(1, 0.72, 1);
trunk2.add(leaves102);
const leaves112 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.3436, 0), 0.0412, 429), leafLightMat);
leaves112.name = 'leaves11';
leaves112.position.set(-0.2968, 4.6372, -0.0672);
leaves112.rotation.set(deg(31.2444), deg(134.3259), deg(20.1655));
leaves112.scale.set(1, 0.72, 1);
trunk2.add(leaves112);
const leaves122 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2708, 0), 0.0325, 430), leafLightMat);
leaves122.name = 'leaves12';
leaves122.position.set(0.09, 4.8945, 0.1484);
leaves122.rotation.set(deg(22.0519), deg(348.7076), deg(34.8204));
leaves122.scale.set(1, 0.72, 1);
trunk2.add(leaves122);
const leaves132 = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.2644, 0), 0.0317, 431), leafLightMat);
leaves132.name = 'leaves13';
leaves132.position.set(0.0236, 5.3364, -0.1024);
leaves132.rotation.set(deg(82.8508), deg(327.7062), deg(4.7871));
leaves132.scale.set(1, 0.72, 1);
trunk2.add(leaves132);
root.traverse((o) => {
if (o.isMesh) {
o.castShadow = true;
o.receiveShadow = true;
}
});
return root;
}
export default createBirchTree;
평점 및 댓글
댓글 0개
아직 댓글이 없어요. 이 모델을 어떻게 사용했는지, 어떤 점이 더 나아질 수 있을지 공유해 주세요.
관련 모델
같은 카테고리 또는 비슷한 태그









