Skip to content

fireroundgithub/train-never-crash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

永远不撞车的小火车 🚂

A peaceful train simulation that loops forever without crashing - available in both 2D and 3D versions.

项目概述

这是一个双版本实现的火车模拟项目,包含2D Pygame版本和3D Three.js版本。火车在椭圆形轨道上永远循环行驶,不会发生碰撞,提供一种放松的视觉体验。

技术架构

2D版本 (train.py)

  • 技术栈: 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 程序化生成的树木

3D版本 (train_3d.html)

  • 技术栈: 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种模式)

PBR材质系统

材质 颜色 用途
body 深炭灰 #1a1a1e 主体结构
steel 银色 #b2b2be 辐条、连杆、联轴器
brass 金色 #b88a12 装饰环、汽笛、车灯
red 深红 #cc2200 装饰条纹
glass 蓝色调,38%透明度 车窗

轨道系统

2D版本

  • 轨道形状: 椭圆,中心(450, 350),半径315×195
  • 数据结构: 600个离散点数组
  • 移动方式: 基于索引的位置推进

3D版本

  • 轨道形状: 参数化椭圆 trackPt(t) = (TRX·cos(2πt), 0, TRZ·sin(2πt))
  • 轨道参数: TRX=14, TRZ=9.5
  • 轨道构建:
    • 双轨: TubeGeometry沿CatmullRomCurve3路径,垂直偏移±0.58单位
    • 枕木: BoxGeometry,每7个点放置一个,自动朝向轨道方向

火车移动实现

2D版本

# 基于索引的移动
pos += speed  # 沿600点数组推进
for i, car in enumerate(cars):
    car_pos = track_points[(pos - i*18) % 600]  # 每节车厢间隔18个点

3D版本

// 基于参数化时间的移动
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 退出 关闭窗口

3D版本相机模式

  1. 轨道控制 - 自由拖拽和缩放
  2. 跟随相机 - 跟在机车后方
  3. 鸟瞰视角 - 俯视整个场景

UI界面

  • 2D版本: 半透明HUD面板,显示标题、圈数、速度、控制说明
  • 3D版本:
    • 毛玻璃效果HUD面板(左上角)
    • 速度滑块控制
    • 相机模式标签(底部中央)
    • 加载屏幕和暂停覆盖层

粒子系统

烟雾效果

  • 2D版本: Puff类,每9个速度单位发射一次,上升并随机漂移
  • 3D版本: 500个粒子池,径向渐变精灵纹理,从烟囱世界坐标发射

部署方式

本地运行

2D版本

# 安装依赖
pip install pygame

# 运行
python train.py

3D版本

# 方式1: 直接打开HTML文件
open train_3d.html

# 方式2: 使用macOS启动器
./play.command

# 方式3: 本地服务器(可选)
python -m http.server 8000
# 然后访问 http://localhost:8000/train_3d.html

在线部署

GitHub Pages

  1. 推送到GitHub仓库
  2. 在仓库设置中启用GitHub Pages
  3. 选择主分支作为源
  4. 访问 https://username.github.io/repository-name/train_3d.html

其他静态托管平台

  • Netlify: 拖拽整个文件夹到Netlify
  • Vercel: 连接GitHub仓库自动部署
  • Firebase Hosting: 使用Firebase CLI部署

系统要求

2D版本

  • Python 3.6+
  • Pygame 2.0+
  • 支持中文字体的操作系统

3D版本

  • 现代浏览器,支持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 - 自由使用和修改


享受这趟永远不会撞车的宁静旅程! 🚂✨

About

一辆永远不会撞车的小火车

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors