A peaceful train simulation that loops forever without crashing - available in both 2D and 3D versions.
这是一个双版本实现的火车模拟项目,包含2D Pygame版本和3D Three.js版本。火车在椭圆形轨道上永远循环行驶,不会发生碰撞,提供一种放松的视觉体验。
- 技术栈: Python 3 + Pygame + Pygame.freetype
- 窗口: 900×650 像素,60 FPS
- 渲染: 软件渲染,程序化生成所有图形
- 字体: 中文字体回退链 (PingFang → STHeiti → Hiragino Sans GB → Arial Unicode MS)
| 组件 | 功能 |
|---|---|
make_oval() |
生成600个点的椭圆轨道路径 |
draw_track() |
绘制铁路枕木和双轨 |
Train |
火车位置、速度、圈数管理和渲染 |
Puff |
烟雾粒子系统 |
Cloud |
漂浮云朵 |
Tree |
程序化生成的树木 |
- 技术栈: HTML5 + CSS3 + JavaScript ES6 + Three.js r169
- 渲染器: WebGL with PBR材质,ACES色调映射
- 后处理: EffectComposer + UnrealBloomPass + OutputPass
- 阴影: PCF软阴影,4096×4096阴影贴图
Scene
├── Lighting (HemisphereLight + DirectionalLight + AmbientLight)
├── Sky Dome (程序化渐变着色器)
├── Terrain (程序化高度位移)
├── Track System (参数化椭圆轨道)
├── Train (机车 + 5节车厢)
├── Particle System (500个烟雾粒子池)
├── Environment
│ ├── Trees (60+ 程序化生成)
│ └── Mountains (12个背景山峰)
└── Camera System (3种模式)
| 材质 | 颜色 | 用途 |
|---|---|---|
body |
深炭灰 #1a1a1e |
主体结构 |
steel |
银色 #b2b2be |
辐条、连杆、联轴器 |
brass |
金色 #b88a12 |
装饰环、汽笛、车灯 |
red |
深红 #cc2200 |
装饰条纹 |
glass |
蓝色调,38%透明度 | 车窗 |
- 轨道形状: 椭圆,中心(450, 350),半径315×195
- 数据结构: 600个离散点数组
- 移动方式: 基于索引的位置推进
- 轨道形状: 参数化椭圆
trackPt(t) = (TRX·cos(2πt), 0, TRZ·sin(2πt)) - 轨道参数: TRX=14, TRZ=9.5
- 轨道构建:
- 双轨: TubeGeometry沿CatmullRomCurve3路径,垂直偏移±0.58单位
- 枕木: BoxGeometry,每7个点放置一个,自动朝向轨道方向
# 基于索引的移动
pos += speed # 沿600点数组推进
for i, car in enumerate(cars):
car_pos = track_points[(pos - i*18) % 600] # 每节车厢间隔18个点// 基于参数化时间的移动
trainT += speed; // 0.0-1.0循环
if (trainT >= 1.0) { trainT -= 1.0; laps++; }
// 自动定向系统
function orient(obj, t) {
obj.position.copy(trackPt(t));
obj.lookAt(trackPt(t).add(trackTan(t))); // 面向切线方向
}| 按键 | 2D版本 | 3D版本 |
|---|---|---|
↑/↓ |
速度调节 (0.3-7.0) | 速度调节 (0.2-5.0×) |
Space |
暂停/继续 | 暂停/继续 |
C |
- | 切换相机模式 |
Q/Esc |
退出 | 关闭窗口 |
- 轨道控制 - 自由拖拽和缩放
- 跟随相机 - 跟在机车后方
- 鸟瞰视角 - 俯视整个场景
- 2D版本: 半透明HUD面板,显示标题、圈数、速度、控制说明
- 3D版本:
- 毛玻璃效果HUD面板(左上角)
- 速度滑块控制
- 相机模式标签(底部中央)
- 加载屏幕和暂停覆盖层
- 2D版本:
Puff类,每9个速度单位发射一次,上升并随机漂移 - 3D版本: 500个粒子池,径向渐变精灵纹理,从烟囱世界坐标发射
# 安装依赖
pip install pygame
# 运行
python train.py# 方式1: 直接打开HTML文件
open train_3d.html
# 方式2: 使用macOS启动器
./play.command
# 方式3: 本地服务器(可选)
python -m http.server 8000
# 然后访问 http://localhost:8000/train_3d.html- 推送到GitHub仓库
- 在仓库设置中启用GitHub Pages
- 选择主分支作为源
- 访问
https://username.github.io/repository-name/train_3d.html
- Netlify: 拖拽整个文件夹到Netlify
- Vercel: 连接GitHub仓库自动部署
- Firebase Hosting: 使用Firebase CLI部署
- Python 3.6+
- Pygame 2.0+
- 支持中文字体的操作系统
- 现代浏览器,支持WebGL 2.0
- 推荐Chrome 80+, Firefox 75+, Safari 13.1+
- 建议显卡支持硬件加速
- ✅ 零外部资源: 所有图形、纹理、模型都是程序化生成
- ✅ 自包含: 3D版本是单个HTML文件,无需构建步骤
- ✅ 跨平台: 2D版本支持所有Python平台,3D版本支持所有现代浏览器
- ✅ 中文支持: 完整的中文字体回退和UI
- ✅ 性能优化: 粒子池、对象复用、LOD系统
- ✅ 视觉效果: PBR材质、动态阴影、后处理效果
这是一个展示程序化生成和实时渲染技术的示例项目,适合学习:
- Pygame 2D游戏开发
- Three.js 3D Web图形
- 程序化内容生成
- 粒子系统设计
- 跨平台部署策略
MIT License - 自由使用和修改
享受这趟永远不会撞车的宁静旅程! 🚂✨