当前位置: 首页 > news >正文

程序化树木生成器(ThreeJS EZ-Tree 开源项目)

项目备份:

「19 EZ-Tree 程序化树木生成器」
/~67e63LxBCl~:/
链接:https://pan.quark.cn/s/a23230adf3ba

🌳 关于项目

EZ-Tree是一个功能强大的程序化树木生成器,拥有数十个可调参数。该项目由两部分组成:

  1. 核心库- 独立的树木生成代码库,可以导入到您自己的应用程序中,动态生成树木

  2. Web应用- 独立的Web应用程序,允许您在浏览器中创建树木并导出为 .PNG 或 .GLB 文件

✨ 主要特性

  • 🎨完全可定制- 通过参数控制树木的各个方面

  • 🌍多语言支持- 支持英语和中文界面

  • 📦易于集成- 可作为npm包安装使用

  • 🖼️多种导出格式- 支持PNG图片和GLB 3D模型导出

  • 实时预览- 在浏览器中实时查看树木生成效果

  • 🎲随机种子- 使用种子确保可重复的树木生成

🌐 在线应用

访问官方网站体验:https://eztree.dev

📦 安装

npm install @dgreenheck/ez-tree

🚀 快速开始

基本使用

import { Tree } from '@dgreenheck/ez-tree'; ​ // 创建新实例 const tree = new Tree(); ​ // 设置参数 tree.options.seed = 12345; // 设置随机种子 tree.options.branch.levels = 3; // 分支层级 tree.options.branch.length[0] = 20; // 树干长度 ​ // 生成树木并添加到Three.js场景 tree.generate(); scene.add(tree);

使用预设

import { Tree, TreePreset } from '@dgreenheck/ez-tree'; ​ const tree = new Tree(); ​ // 加载预设 tree.loadPreset(TreePreset.AshMedium); ​ tree.generate(); scene.add(tree);

注意:每次修改树木参数后,必须调用generate()方法来重新生成几何体。

💻 本地运行

方法一:使用npm运行

# 安装依赖 npm install ​ # 运行应用 npm run app

应用将在 http://localhost:5173 启动

方法二:使用Docker

# 构建镜像 docker compose build ​ # 启动容器 docker compose up -d

🎯 可用脚本

命令说明
npm run build:lib构建核心库
npm run build:watch监听模式构建库
npm run app运行Web应用
npm run build:app构建应用
npm run preview预览构建结果

📚 树木参数详解

TreeOptions类定义了控制程序化树木生成的各种参数。每个属性都允许自定义树木的外观,包括树皮、分支和树叶。

🔧 通用属性

参数类型说明
seednumber随机数生成的初始值,使用相同种子可生成一致的树木
typeTreeType树木类型,可选值见TreeType枚举

🌲 树皮参数 (Bark)

bark对象控制树干的外观和属性。

参数类型说明
typeBarkType树皮纹理类型,从BarkType枚举中选择
tintnumber应用于树皮的颜色色调,十六进制颜色值(如0xffffff
flatShadingboolean是否使用平面着色(true)或平滑着色(false
texturedboolean是否将纹理应用于树皮
textureScale.xnumberX轴方向的树皮纹理缩放比例
textureScale.ynumberY轴方向的树皮纹理缩放比例

🌿 分支参数 (Branch)

branch对象定义树干和分支层级的参数。

参数类型说明
levelsnumber递归分支层级数。0表示只有树干,更高的值添加更多分支
angleobject子分支相对于父分支的生长角度(度),每个层级单独指定
childrenobject每个层级的子分支数量,索引表示层级
force.directionobject促使树木生长的外部方向力,向量对象{ x, y, z }
force.strengthnumber外部力的强度
gnarlinessobject每个分支层级的扭曲或卷曲程度
lengthobject每个层级分支的长度
radiusobject每个层级分支的半径(粗细)
sectionsobject每个分支层级的长度段数,控制分支网格的分辨率
segmentsobject组成每个分支的径向段数,值越高圆柱越平滑
startobject子分支沿父分支开始形成的位置(01之间的分数)
taperobject每个层级分支的锥度,01之间的值定义从基部到尖端的半径减小
twistobject应用于每个分支层级的扭曲量

🍃 树叶参数 (Leaves)

leaves对象定义控制树叶外观和放置的属性。

参数类型说明
typeLeafType树叶纹理类型,从LeafType枚举中选择
billboardBillboard树叶的渲染方式,SingleDouble(单面或垂直双面)
anglenumber树叶相对于父分支的角度(度)
countnumber要生成的树叶数量
startnumber树叶开始沿分支生长的位置(01之间)
sizenumber树叶的大小
sizeVariancenumber每个树叶实例的大小差异,使树叶看起来更自然
tintnumber应用于树叶的色调颜色,十六进制颜色值
alphaTestnumber树叶透明度的alpha阈值,控制树叶纹理的透明度

🏗️ 藤架参数 (Trellis)

trellis对象定义用于训练树木生长的藤架结构。

参数类型说明
enabledboolean是否启用藤架
visibleboolean藤架是否可见
positionobject藤架的3D位置{ x, y, z }
widthnumber藤架的宽度
heightnumber藤架的高度
spacingnumber藤架线条之间的间距
force.strengthnumber藤架对树枝的吸引力强度
force.maxDistancenumber藤架影响的最大距离
force.falloffnumber力的衰减系数
cylinderRadiusnumber藤架圆柱的半径
colornumber藤架的颜色

🎥 相机参数 (Camera)

控制相机行为。

参数类型说明
autoRotateboolean相机是否自动旋转
rotateSpeednumber自动旋转的速度

🌤️ 环境参数 (Environment)

控制场景环境。

参数类型说明
sunAnglenumber太阳的角度(0-360度)
grassCountnumber草的数量(0-25000)

🌐 多语言支持

项目现已支持中文界面!在应用右上角选择语言即可切换:

  • English- 英语(默认)

  • 中文- 简体中文

语言偏好会自动保存到本地存储,下次访问时自动应用。

🎨 导出功能

导出为PNG图片

在应用中点击"Export PNG"按钮,可以将当前树木渲染为高分辨率PNG图片。

导出为GLB 3D模型

点击"Export GLB"按钮,可以将树木导出为GLB格式的3D模型,可在其他3D软件中使用。

保存/加载预设

  • Save Preset- 将当前树木配置保存为JSON文件

  • Load Preset- 从JSON文件加载树木配置

🛠️ 技术栈

  • Three.js- 3D图形库

  • Vite- 构建工具

  • TypeScript- 类型系统

  • JavaScript- 核心逻辑

📄 许可证

本项目采用开源许可证。详见 LICENSE 文件。

👨‍💻 作者

Daniel Greenheck

  • GitHub: @dgreenheck

  • YouTube: Daniel Greenheck

  • Twitter: @dangreenheck

🤝 贡献

欢迎贡献!如果您想为项目做出贡献:

  1. Fork 本仓库

  2. 创建特性分支 (git checkout -b feature/AmazingFeature)

  3. 提交更改 (git commit -m 'Add some AmazingFeature')

  4. 推送到分支 (git push origin feature/AmazingFeature)

  5. 开启 Pull Request

📮 反馈与支持

如果您有任何问题或建议,请:

  • 提交 Issue

  • 发起 Discussion

  • 关注作者的 YouTube 频道获取最新教程

http://www.jsqmd.com/news/449455/

相关文章:

  • 同样画CAD,别人2小时搞定,你却卡半天?问题出在这3处
  • 全国可实时在线监控的压力变送器品牌有哪些推荐 - 工业品网
  • +混合高斯模型聚类 #机器学习+#人工智能+#特征提取+#特征融合+#特征降维+#聚类+#分类器+#无监督学习
  • 【数据集】地级市城市创业活跃度数据(2000-2024年)
  • 攻读博士学位期间研究计划书(格式模板与实例示范)——基于超快卷积光学神经网络的无记忆散射成像方法研究
  • 2026聊聊绵阳圆管立柱加工厂技术强的品牌推荐 - 工业设备
  • 腾讯QQ开放OpenClaw机器人创建通道,单个账号最多可创建5个
  • 2026年内江口碑好的动漫培训品牌机构,专业动漫培训怎么收费 - 工业品牌热点
  • PAT 乙级 1081
  • 塞那耳夹式耳机:通勤女孩的秘密武器,这副耳机真的太省心了
  • 流量怎么用——生成论视角下的注意力分配
  • 三维ToF技术:重构机器视觉维度的里程碑与工业应用前瞻
  • anaconda pycharm
  • 2026年水泥隔离墩厂家哪家好,章丘区昇顺交通设施厂实力上榜 - mypinpai
  • 京东年报解读:当AI遇上超级供应链,京东下了场大棋
  • 记录一次排查本机连接linux虚拟机mysql报错经过
  • 将盾CDN:HTTPS加密传输与证书管理
  • 使用burp实现对mumu模拟器上手机应用的抓包
  • rtthread学习路线
  • 东莞“厂区爱情故事”数据分析:两个打工人的十年,如何完成从“单例模式”到“分布式系统”的架构升级
  • 探讨电磁流量计品牌厂家选购要点,全国哪家更值得选? - 工业品网
  • 使用 VMware 虚拟机重置密码的方法
  • 用 AI 给运维告警降噪:从理想到现实
  • 【已解决】ubuntu22.04 TightVNCServer GNOME 灰屏黑叉
  • Claude Code 常用命令和小技巧
  • 【雷达原理 学习笔记】P75 天线波束扫描方法详细讲解至P76
  • 怎么让 AI 听懂你的话?——同一个 AI,为什么他用得比你好 10 倍
  • 2026.3.6~7 - 工作中的问题总结
  • 11.7k Star!这个命令行工具让我告别了Google搜索
  • VSCode 自动换行设置完全指南