A Split-Screen 3D Racing Game Built with OpenGL 3.3 Core
一个功能完整的双人同屏三维赛车游戏,展示现代计算机图形学核心技术:阴影映射、Blinn-Phong 光照、天空盒、物理模拟、碰撞检测。
- 双人分屏竞速:支持 1-3 圈自定义赛程,实时排名显示
- 完整游戏流程:启动画面、主菜单、倒计时、比赛进行、结束画面
- HUD 显示系统:圈数统计、速度表、排名指示、比赛计时
- 精确计圈系统:基于门判定算法,包含越线验证与方向校验
- 阴影映射:4096×4096 深度贴图,PCF 软阴影,自适应偏差算法
- Blinn-Phong 光照:方向光 + 点光源系统,支持 Fresnel 菲涅尔效应
- 天空盒系统:立方体贴图实现,支持白天/夜间场景切换
- 材质系统:MTL 格式支持,纹理映射与 Mipmapping 优化
- 车辆运动学模型:加速、制动、转向、摩擦力模拟
- 多层碰撞检测:纹理边界检测与四角点矩形检测双重策略
- 赛道系统:完整封闭赛道,支持边界检测与圆形裁切
- 装饰建筑:埃菲尔铁塔、斗兽场、自由女神像等地标模型
- 环境元素:街灯系统(含点光源)、树木植被
- 车辆模型:LEGO 风格赛车
| 模块 | 核心技术 |
|---|---|
| 阴影系统 | Shadow Mapping + PCF 软阴影 + 自适应偏差 |
| 光照模型 | Blinn-Phong + 多光源系统 + Fresnel 效应 |
| 天空盒 | Cubemap + 无限远效果实现 |
| 碰撞检测 | 纹理分析与四角点矩形双重检测策略 |
| 计圈系统 | 门判定算法 + 防误触发机制 + 线性插值越线计算 |
| 资源管理 | 自实现 OBJ/MTL 解析器,纹理缓存,模型共享机制 |
图形 API:OpenGL 3.3 Core 依赖库:GLFW、GLM、GLAD、ImGui 构建系统:CMake + FetchContent 开发语言:C++17
- CMake ≥ 3.15
- C++17 兼容编译器
- OpenGL ≥ 3.3 驱动支持
- 网络连接用于首次构建依赖下载
一键运行(Windows)
build_and_run.bat脚本将自动完成配置、编译和启动游戏。
Windows:
# 配置项目
cmake -S . -B build
# 编译
cmake --build build --config Release
# 运行
.\build\bin\Release\TwinTrack.execlean.bat清理所有构建产物(build/、out/、.vs/),恢复项目到初始状态。
| 控制 | 玩家 1 | 玩家 2 |
|---|---|---|
| 前进/倒车 | W / S | ↑ / ↓ |
| 左转/右转 | A / D | ← / → |
| 切换视角 | V | Enter |
通用操作
- ESC:暂停/继续游戏
- N:切换白天/夜间场景
- 任意键:跳过启动画面
TwinTrack/
├── assets/ # 游戏资源
├── src/
│ ├── core/ # 核心系统
│ ├── render/ # 渲染模块
│ └── ui/ # 用户界面
├── include/ # 头文件库
├── external/ # 第三方代码
├── CMakeLists.txt # 构建配置
└── README.md
阴影映射流程
- 阴影通道:从光源视角渲染深度图到 Framebuffer
- 主渲染通道:从相机视角渲染场景,采样深度图计算阴影遮蔽
计圈检测算法
- 防误触发机制:车辆需先离开起点区域后移动至少 10 单位方可计圈
- 越线检测:检测车辆位置从起点线负侧跨越至正侧
- 三重验证:运动方向正确性 + 越线点位置 + 门宽度约束
碰撞响应策略
- 滑动修正:保留切向运动分量,消除法向分量,实现沿边界自然滑动
License: Educational Use Only
Course: Computer Graphics