本次实验旨在建立一个现代化、高效率的图形学开发环境,并基于此环境完成一个万有引力粒子系统的仿真。实验采用了当前主流的工程实践:uv包管理器实现项目级依赖隔离、src布局实现代码逻辑解耦、Taichi编程语言实现GPU并行计算,最终构建了一个完整的“环境搭建-逻辑解耦-GPU计算-可视化”开发链路。
项目地址: https://github.com/wrh-human/2026_CG_work0_wrh
姓名:王若涵
学号:202411081042
本项目采用标准的 src 布局 (Source Layout),通过物理隔离核心代码与配置文件,彻底解决相对路径混淆和“根目录污染”问题:
2026_CG_work0_wrh/
├── src/ # 核心源代码目录
│ ├── __init__.py # 包初始化文件
│ ├── main.py # 程序入口:初始化并启动仿真
│ ├── physics.py # 物理引擎:万有引力计算
│ ├── config.py # 配置文件:仿真参数设置
│ └── test.py # 单元测试:验证物理逻辑
├── .gitignore # Git忽略配置
├── README.md # 项目文档
├── pyproject.toml # uv项目配置文件
└── uv.lock # 依赖版本锁定文件
| 组件 | 技术选型 | 作用 |
|---|---|---|
| 包管理器 | uv | 极速依赖解析,项目级环境隔离 |
| 编程语言 | Python 3.x | 快速开发,生态丰富 |
| 并行计算 | Taichi | GPU加速,类CUDA语法,实时可视化 |
| 项目结构 | src布局 | 代码与配置分离,避免路径污染 |
集中管理所有仿真参数,实现配置与逻辑的解耦:
# --- 物理系统参数 ---
NUM_PARTICLES = 100000 # 粒子总数 (卡顿请调小此数值,如 2000)
GRAVITY_STRENGTH = 0.001 # 鼠标引力强度
DRAG_COEF = 0.98 # 空气阻力系数
BOUNCE_COEF = -0.8 # 边界反弹能量损耗# --- 渲染系统参数 ---
WINDOW_RES = (800, 600) # 窗口分辨率
PARTICLE_RADIUS = 1.5 # 粒子绘制半径
PARTICLE_COLOR = 0xFFC9ED # 粒子颜色 (粉色) 封装万有引力计算核心算法,利用 Taichi 的 GPU 并行能力:
- 万有引力计算:
F = G * (m1 * m2) / (r² + ε²) - 软化因子 (ε):避免粒子距离过近时引力趋于无穷大。
- 并行加速:通过
@ti.kernel装饰器在 GPU 上并行计算所有粒子的受力。
负责任务调度与可视化循环:
- 初始化 Taichi 系统和 GUI 窗口
- 从 config 加载配置参数
- 初始化粒子系统(随机位置、随机质量)
- 主循环:计算引力 → 更新速度/位置 → 渲染粒子 → 处理交互
- 实时显示帧率 (FPS)
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ config.py │────▶│ main.py │────▶│ physics.py │
│ (参数配置) │ │ (初始化调度) │ │ (GPU计算) │
└─────────────┘ └──────┬──────┘ └──────┬──────┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────┐
│ 可视化循环 │◀────│ 粒子状态更新 │
│ (GUI渲染) │ │ (位置/速度) │
└──────────────┘ └─────────────┘
| 功能 | 实现方式 | 技术亮点 |
|---|---|---|
| ✅ 万有引力模拟 | 牛顿万有引力公式 + 软化因子 | Taichi GPU 并行计算所有粒子对 |
| ✅ 粒子系统 | 位置、速度、质量属性 | 支持大规模粒子(1024+) |
| ✅ 碰撞避免 | 引力软化因子 (ε) | 防止粒子过度靠近导致数值爆炸 |
| ✅ 实时可视化 | Taichi 的 GUI 模块 | 实时显示粒子运动轨迹 |
| ✅ 性能监控 | 内置 FPS 计数器 | 展示 GPU 并行计算性能 |
| 交互方式 | 功能 | 操作说明 |
|---|---|---|
| 🖱️ 鼠标拖动 | 添加扰动 | 鼠标拖动区域内的粒子受到额外推力 |
| ⌨️ 空格键 | 重置仿真 | 重新初始化粒子系统 |
| ⌨️ ESC 键 | 退出程序 | 安全退出仿真 |
- ✅ 环境隔离:uv 创建独立虚拟环境,避免依赖冲突
- ✅ 代码解耦:src 布局分离核心代码与配置文件
- ✅ GPU 加速:Taichi 自动将 Python 代码编译为 GPU 指令
- ✅ 版本控制:.gitignore 忽略 .venv、pycache 等本地文件
