EcoSim 是一个空间显式(Spatially Explicit)的植被动力学模拟系统。它基于 Lotka-Volterra 竞争模型 与 高斯核种子扩散 理论,在二维网格上逼真模拟了从地衣(Lichen)、苔藓(Moss)、草本(Herb)、灌木(Shrub)到乔木(Tree)的生态演替全过程,并融合了人为种植的农作物(Crop)及多种极端环境扰动。
- 极致视觉美学:采用 16:9 Glassmorphism(玻璃拟态)响应式数据看板设计,融入 HSL 调和色卡与微动交互。网格采用生态物种盖度多色插值混合与优势种 Emoji 尺寸缩放技术,视觉张力拉满。
- 三级降级计算引擎:首创自适应异构计算,检测硬件支持并自动回退:GPU.js (GLSL 并行渲染) > Multi-threaded CPU (Blob Inlined Workers) > Serial CPU (串行兜底)。
- 零依赖开箱即用:逻辑与资源极致封装,全面兼容
file://协议,无需架设本地服务器,双击index.html即可在任一现代浏览器中流畅运行 60 FPS 模拟。 - 科研级参数可调性:所有的生物学特性、竞争矩阵、土壤因子及演替阈值均集中在
main.js的CONFIG中,专为生态模拟实验量身打造。
├── index.html # 16:9 玻璃拟态 UI 布局与 Vue 3 全局挂载模版
├── style.css # 统一的高端磨砂玻璃特效、动画过渡及自定义滚动条样式
├── main.js # 核心计算引擎 (EcoSimulator Class)、多引擎逻辑与 Vue 应用控制
├── preload.js # Electron 桌面客户端的预加载逻辑
├── electron-main.js # Electron 应用的主进程启动配置
├── package.json # 项目依赖与 Electron-Builder 构建配置
├── package-lock.json # 依赖锁定文件
├── playwright.config.js # Playwright 测试配置(自动启动本地 HTTP 服务器)
├── .gitignore # Git 忽略规则
├── LICENSE # AGPL-3.0 开源协议
├── README.md # 项目说明文档
├── CLAUDE.md # AI 辅助开发指令
├── design/ # 数学模型、设计规范以及参考参数配置文件
│ ├── mathmodel.md # 详细的数理公式推导与算法步骤
│ ├── uidesign.md # 玻璃拟态看板 UI 的列行网格规范
│ ├── 框架设计.md # 系统架构设计文档
│ ├── parameters-2.0.csv # 官方生物学仿真参数基准对照表
│ ├── plantstage-color.csv # 植物阶段颜色映射表
│ ├── eco-sim气候类型-顶极阶段.csv # 气候类型与顶极阶段参数
│ ├── 初始种子方案Ver1.pdf
│ ├── 生态模拟器开发说明Ver1.pdf
│ ├── 优势种-颜色映射表.pdf
│ └── logo-by-ChatGPT.png
├── assets/ # 静态资源(图标、Logo、Favicon)
│ ├── play.svg / pause.svg / rotate-ccw.svg / turtle.svg / rabbit.svg
│ ├── android-chrome-192x192.png / android-chrome-512x512.png
│ ├── apple-touch-icon.png
│ ├── favicon-16x16.png / favicon-32x32.png / favicon.ico
│ └── site.webmanifest
├── tests/ # Playwright 端到端自动化测试
│ └── ecosim.spec.js # 8 项核心功能测试(渲染、启停、重置、气候切换、干扰事件、速度控制)
├── lib/ # 兼容本地双击运行的离线 JS 依赖库
│ ├── vue.global.js / vue.global.prod.js # Vue 3
│ ├── gpu-browser.min.js # GPU.js
│ ├── chart.js # Chart.js
│ ├── lucide.min.js # Lucide Icons
│ └── tailwind.min.js # Tailwind CSS
├── tests/ # Playwright 端到端自动化测试
│ └── ecosim.spec.js # 8 项核心功能测试(渲染、启停、重置、气候切换、干扰事件、速度控制)
└── plan/ # 开发计划与待办事项
└── add-animals-rendering.md # 动物渲染功能规划模拟器在每个网格(Grid Cell)上独立维护一个由 6 类功能型植物构成的动态微群落,每年演替迭代经历以下四个核心物理过程:
每个网格上的物种根据其当前生物量盖度
其中,$\mathbf{d}$ 为扩散距离向量,$\lambda_k$ 为物种
为了忠实呈现“地衣/苔藓改良土壤
- 高等物种(如乔木)的萌发率
$g_{eff}$ 受当前网格累积总生物量$\sum_{l=1}^{N} B_l$ 的严格阈值约束。 - 只有当先锋物种(地衣、苔藓)枯死腐殖并累积起足够的土壤有机质(即总盖度突破物种特有的门槛
thresholds[k]),高等物种的种子才能开始萌发。 - 萌发量进一步受当前网格内残存可用物理空间限制,以确保物理实体体积不发生膨胀。
局部网格内的生长与空间排挤基于多物种 Lotka-Volterra 竞争微分方程的离散差分形式进行计算:
-
$\alpha_{kl}$ (非对称竞争抑制矩阵):描述物种$l$ 对物种$k$ 在空间争夺上的压制强度。层级高的乔木对低层植物的抑制系数极高(例如$\alpha_{lichen, tree} = 3.3$ ),而低层植物对高层的反馈抑制则趋近于$0$ 。 -
$K_{\text{base}, k}$ (基础承载力) 与$\mu_{\text{soil}}$ (土壤乘子):共同决定了物种的局部盖度上限。 -
$\eta_{\text{climate}}$ (气候波动因子):每年模拟时会产生$\pm 15%$ 的不确定波动,模拟现实气候的无常。
为模拟真实的宏观地貌,系统采用平滑势场分位数映射算法:
- 随机生成网格白噪声。
- 进行 3 轮空间均值模糊(Mean Blur)滤波,融汇形成连续流畅、带有地理连续性的地貌势场。
- 应用分位数进行区间切割,严格确保网格中精准包含 30% 浅土(支持地衣)、40% 中性土和 30% 深土(支持乔木),并呈现自然柔和的地理斑块分布。
在 main.js 的开头,开发或科研人员可以通过修改 CONFIG 对象中的关键物理量,自由定制并测试全新的生态场景:
const CONFIG = {
// 基础定义
gridWidth: 20, // 模拟网格宽度
gridHeight: 13, // 模拟网格高度
numSpecies: 6, // 物种总数:0-地衣, 1-苔藓, 2-草本, 3-灌木, 4-乔木, 5-农作物
// 生物学核心参数 (数组索引 0 - 5 对应上述 6 个物种)
rho: [30.0, 100.0, 50.0, 200.0, 80.0, 40.0], // 繁殖力 (ρ):单位盖度每年产生的种子数
lambda: [0.5, 0.8, 1.5, 4.0, 6.0, 1.5], // 扩散标准差 (λ):控制高斯核的空间扩散半径
r: [0.3, 0.4, 0.3, 0.6, 0.2, 0.3], // 增长率 (r):物种的最大年内禀增长速度
g: [0.15, 0.4, 0.6, 0.4, 0.4, 0.6], // 基础萌发率 (g)
s: [0.6, 0.6, 0.2, 0.7, 0.6, 0.2], // 种子库年存活率 (s)
nu: [0.045, 0.06, 0.1, 0.12, 0.06, 0.1], // 库萌发率 (ν):种子库中种子的再萌发比率
K_base: [0.3, 0.46, 0.7, 0.8, 0.95, 0.7], // 基础环境承载力 (K)
// 演替进化门槛:高等植物必须在该网格累积总生物量突破此阈值后才能萌发,模拟土壤有机质的改良
thresholds: [0.0, 0.1, 0.4, 0.73, 0.85, 0.4],
// 非对称竞争强度矩阵 alpha[受体][施加体]
alpha: [
[1.0, 1.2, 2.0, 2.5, 3.3, 2.0], // 地衣受其他物种的竞争系数
[0.4, 1.0, 1.2, 1.8, 2.3, 1.0], // 苔藓受其他物种的竞争系数
[0.2, 0.3, 1.0, 1.6, 3.4, 1.0], // 草本受其他物种的竞争系数
[0.1, 0.1, 0.3, 1.0, 1.3, 0.3], // 灌木受其他物种的竞争系数
[0.01, 0.01, 0.05, 0.1, 1.0, 0.05], // 乔木受其他物种的竞争系数
[0.2, 0.3, 1.3, 1.5, 3.4, 1.0] // 农作物受其他物种的竞争系数
],
// 气候类型对应的土壤厚度分布比 [浅土, 中土, 深土]
soilDepthProportions: {
'热带雨林气候': [0.1, 0.3, 0.6],
'温带草原气候': [0.3, 0.5, 0.2],
'寒带苔原气候': [0.7, 0.25, 0.05],
'荒漠气候': [0.9, 0.1, 0.0],
'农场': [0.05, 0.35, 0.6],
'default': [0.3, 0.4, 0.3]
}
};EcoSim 内部集成高度抽象的并发调度引擎,根据客户端软硬件特性在启动时完成检测与绑定:
- GPU 并行加速模式 (
GPU)- 依赖宿主环境的 WebGL。通过
GPU.js库,在运行时动态将演替竞争算法、空间二维高斯卷积内核编译为高速运行的 GLSL 着色器(Shader)。 - 实现每个网格并发由 GPU 流处理器计算,完美应对上万网格的大规模实时生态模拟。
- 依赖宿主环境的 WebGL。通过
- 多线程 CPU 模式 (
Worker)- 若 WebGL 不可用,自动降级为 Web Workers 架构。
- 内部利用 Blob 技术将 Worker 的逻辑代码以字符串形式内联,动态生成 Blob URL 并注入后台线程池,规避了浏览器的同源策略(Same-Origin Policy)限制,可在无服务器环境下流畅运行。
- 串行 CPU 模式 (
Serial)- 作为最强兼容性的基石,当浏览器拦截了 Worker 或不支持多核时自动接入,用单线程循环稳健计算,提供一致的数据产出。
在运行模拟器时,你可以按下键盘 F12 打开浏览器控制台,通过手动调用全局函数切换和对比计算引擎:
// 手动指定计算引擎并重置模拟系统
setMode('GPU'); // 强制切换至显卡并行计算
setMode('Worker'); // 强制切换至多线程 CPU 计算
setMode('Serial'); // 强制切换至串行单核 CPU 计算
setMode('Auto'); // 切换至自动检测自适应模式- 将本项目整个克隆或下载到本地。
- 直接双击目录下的
index.html即可在本地浏览器中畅玩。
如果你需要将其作为本地独立的桌面客户端运行或分发,项目已集成了基于 Electron 的打包工具链:
-
安装环境依赖(确保本地已配置 Node.js 环境):
npm install
-
本地开发调试运行:
npm start
-
构建 Windows
.exe单文件桌面客户端:npm run build:win
-
构建 macOS 桌面客户端 (
.dmg/.app/.zip):npm run build:mac
构建产物将在项目根目录下的
dist/文件夹中生成。
项目使用 Playwright 进行端到端(E2E)自动化测试,覆盖全部核心功能:
# 运行全部测试
npm test
# 带 UI 交互式运行(可调试)
npm run test:ui
# 只跑某个测试(按名称匹配)
npx playwright test -g "暂停"测试清单(8 项):
| 测试 | 验证内容 |
|---|---|
| 页面渲染 | 标题、下拉框、按钮、滑块、图例、Canvas 全部可见 |
| 无 JS 错误 | 控制台无 pageerror |
| 启动模拟 | 计时器递增,按钮变为「暂停」 |
| 暂停模拟 | 计时器停止增长,按钮变回「开始」 |
| 重置模拟 | 计时器归零,按钮恢复 |
| 切换气候 | 切换后模拟仍正常运行 |
| 干扰事件 | 火灾/火山/干旱按钮可点击,无报错 |
| 速度滑块 | 滑块可调,模拟速度随之变化 |
- 原作声明:本项目原作名称为 EcoSimulator (EcoSim),最初由 liusonwood 与 yanyi-lin 倾力设计并制作。
- 开源协议:本项目秉承学术共享与开源极客精神,完整源代码遵循 GNU AGPL-3.0 开源协议。
- 派生要求:如果您使用本项目进行二次开发、研究或构建衍生作品,请务必保证:
- 完整保留原作者署名信息与原项目 GitHub 链接。
- 衍生的应用、网页或服务同样必须在 AGPL-3.0 协议下公开全部源代码。