2026_太空漫游 - 基于 Three.js 和 Electron 的 3D 太空战斗模拟游戏
一款还原《三体》中"水滴"场景的 3D 交互式模拟器,玩家将操控三体文明的超级武器"水滴",体验末日之战的震撼与绝望。
本项目是一个基于 WebGL 技术的 3D 太空战斗模拟器,采用现代化的 Web 技术栈构建,可作为网页应用运行,也可打包为独立的桌面应用程序。项目高度还原了《三体》小说中水滴摧毁人类舰队的经典场景,并提供了丰富的交互体验。
- 🚀 高速物理模拟 - 最高约 1% 光速(3000 km/s,受当前逻辑上限约束)
- 💥 震撼的粒子特效 - 自定义着色器实现的体积粒子爆炸效果
- 🎮 多种控制方式 - 支持键盘、鼠标和游戏手柄操控
- 🎵 沉浸式音效系统 - 动态背景音乐和环境音效
- 🌌 高质量 HDR 渲染 - 8K 星空背景和 PBR 材质
- 🎯 智能 AI 舰队 - 自动战术规避和编队机动
- 📡 科幻 UI 设计 - 赛博朋克风格的 HUD 界面
你是三体文明派遣的"水滴"探测器的操控者,任务是在宇宙空间中摧毁人类的太空舰队。水滴拥有超乎想象的强度和速度,但人类舰队也会尝试规避和反击。
| 按键 | 功能 |
|---|---|
| W / S | 俯仰控制 (Pitch) |
| A / D | 偏航控制 (Yaw) |
| Space | 加速 (Boost) |
| P | 减速/刹车 (Brake) |
| H | 切换攻击模式 (Attack Mode) |
| J | 切换自动攻击 (Auto Attack) |
| U | 切换闪烁模式 (Universe Flicker) |
| O | 切换观察者模式 (Observer Mode) |
| T | 切换雷达轨迹 (Radar Trail) |
| Alt | 按住进行急转弯 (Tactical Turn) |
- 右键按住 + 拖拽:自由旋转视角(非攻击模式下)
- 点击飞船:选中目标查看详情
- 点击 UI 按钮:执行相应功能
- 左摇杆:控制飞行方向 (Pitch/Yaw)
- 右摇杆:控制视角
- A 键 (Cross):加速 (Boost)
- B 键 (Circle):减速 (Brake)
- X 键 (Square):切换攻击模式
- Y 键 (Triangle):切换闪烁模式
- LB (L1):按住急转弯
- D-Pad 上:雷达轨迹
- D-Pad 下:帮助菜单
- D-Pad 左:自动攻击
- D-Pad 右:观察者模式
- 手动控制飞行方向和速度
- 自由探索宇宙空间
- 观察城市模型和星空背景
- 自动锁定最近的飞船目标
- 准星显示目标方位
- 碰撞即摧毁目标飞船
- 显示实时攻击统计
- 固定外部视角观察全局
- 右下角显示追踪视角画中画
- 适合录制和观赏
- 水滴变为幽灵形态(线框模式)
- 可穿越障碍物
- 适合高速追击场景
- 紧急规避:首次被水滴撞击后触发警报与机动流程
- 战术机动:撞击后进入 30-60 秒随机倒计时,结束时全舰同步机动
- 编队飞行:100 艘战舰保持松散编队
- 碰撞检测:精确的球体碰撞计算
- 惯性模拟:加速度和速度独立控制
- 闪烁视觉效果:闪烁模式下的曝光变化
- 轨迹追踪:实时显示水滴飞行轨迹
- 动态相机:速度越快,相机拉得越远
- 三视图切换:XZ(默认)、XY、YZ 投影可切换
- 平移缩放:拖拽平移视口,滚轮缩放(0.001-0.5)
- 悬停信息:悬停舰船显示名称和速度,放大时显示文本
- 轨迹开关:按 T 或右侧按钮记录/隐藏水滴轨迹
- 点击选取:在雷达上点击舰船可选中并同步 UI
- 选择性泛光:仅对发光物体应用 Bloom 效果
- 8x MSAA:消除几何边缘锯齿
- 体积粒子:使用自定义 Shader 实现的爆炸效果
- 各向异性过滤:消除远景纹理闪烁
- HDR 色调映射:ACES Filmic 电影级色彩
前端框架: Three.js (r181)
构建工具: Vite 7.2
桌面框架: Electron 39.2
打包工具: Electron Builder 26.0
eto/
├── electron/ # Electron 主进程
│ └── main.cjs # 应用入口和窗口管理
├── src/ # 源代码目录
│ ├── main.js # 场景初始化和主循环
│ ├── DropletController.js # 水滴控制器
│ ├── FleetController.js # 舰队管理器
│ ├── ExplosionController.js # 爆炸特效控制器
│ ├── GUIManager.js # UI 管理器
│ ├── SoundManager.js # 音频管理器
│ └── style.css # 样式表
├── public/ # 静态资源
│ ├── hdr/ # HDR 环境贴图(2K-12K)
│ ├── model/ # 3D 模型文件
│ ├── music/ # 背景音乐
│ ├── sound/ # 音效文件
│ └── logo/ # 启动画面资源
├── index.html # 主 HTML 文件
├── vite.config.js # Vite 配置
└── package.json # 项目配置和依赖
负责水滴的所有行为逻辑:
- 输入管理:统一处理键盘、鼠标、手柄输入
- 物理更新:速度、位置、旋转的计算
- 相机跟随:实现电影级的追踪镜头
- 目标锁定:自动瞄准最近的敌舰
- 状态切换:攻击/闪烁/观察者模式管理
- 轨迹渲染:实时绘制飞行路径
核心方法:
- update(delta) // 每帧更新
- updatePhysics(delta) // 物理计算
- updateCamera(delta) // 相机跟随
- toggleAttackMode() // 切换攻击模式
- lockNearestTarget() // 锁定最近目标管理 100 艘战舰的生命周期:
- 舰船生成:克隆优化基础模型
- 名称系统:使用真实的三体舰名
- 警报机制:首次撞击触发,随后倒计时
- 机动算法:集体规避和随机扰动
- 标签系统:3D 空间中的 2D 标签渲染
- 交互选择:点击选中查看详情
- 雷达显示:小地图上的舰队分布
核心方法:
- update(delta) // 更新舰队状态
- updateShipMotion(ship, delta) // 单舰运动
- alertFleet(threat) // 发起警报
- startManeuver() // 开始机动
- checkCollision(point, radius) // 碰撞检测处理所有爆炸和粒子效果:
- 阶段性爆炸:10 秒内多次爆发
- 体积粒子:软球体着色器
- 碎片系统:几何碎块飞散
- 加法混合:实现发光效果
- 生命周期管理:自动清理粒子
核心方法:
- triggerExplosion(craft, point) // 触发爆炸
- createBurst(position, scale, color, velocity) // 创建粒子爆发
- createDebris(position, count, baseVel) // 生成碎片
- update(delta) // 更新所有粒子管理所有用户界面元素:
- 左侧面板:速度、状态、音乐控制
- 右侧面板:舰队统计、雷达、目标信息
- 帮助模态框:操作说明
- HUD 元素:准星、速度表、攻击统计
- 样式注入:科幻风格 CSS
核心方法:
- updateSpeed(speed, maxSpeed) // 更新速度显示
- updateModeUI(attackMode, flickerMode) // 更新模式指示
- updateRadar(ships, dropletPos) // 更新雷达
- updateShipInfo(ship) // 更新目标信息管理所有音频资源:
- 音效预加载:UI 点击、语音提示
- 音量控制:统一音量管理
- 播放方法:简化的调用接口
音效列表:
- click: UI_click.wav // 按钮点击
- speaking: SpeakingBegin.wav // 语音开始
- welcome: WelcomeTo.mp3 // 欢迎提示
- attack: AttackObj.mp3 // 攻击目标项目采用多通道渲染架构:
场景内容
↓
[1] 原始渲染通道 (RenderPass)
↓
[2] 选择性泛光 (Selective Bloom)
├─ 暗化非发光物体
├─ Bloom Composer 渲染
└─ 恢复原始材质
↓
[3] 混合通道 (ShaderPass)
└─ 叠加 Bloom 纹理
↓
[4] 输出通道 (OutputPass)
└─ 色调映射
↓
[5] 抗锯齿通道 (SMAAPass)
↓
[6] 观察者模式 PIP(可选)
└─ 在右下角渲染追踪视角
↓
最终画面
- 实例化渲染:克隆共享几何体
- 纹理复用:避免重复加载
- 层级剔除:只对可见物体应用 Bloom
- 自适应分辨率:根据设备能力调整
- 各向异性过滤:提升远景质量而非提高分辨率
- 8x MSAA:消除几何边缘锯齿
- SMAA 后处理:进一步平滑画面
- HDR + 色调映射:更真实的光照
- 自定义粒子着色器:软边缘体积效果
- 资源预加载:使用 LoadingManager
- 进度追踪:显示加载速度和总量
- 启动画面:Logo 淡入淡出动画
- 主色调:青蓝色 (#00f3ff) - 代表三体文明的冷酷科技
- 辅助色:橙黄色 (#ffaa00) - 太阳和爆炸的温暖
- 背景:深空黑 (#000000) - 强调太空的孤寂
- 斜切变形:
skewX()创造未来感 - 毛玻璃效果:
backdrop-filter: blur(10px) - 发光边框:
box-shadow和text-shadow - Orbitron 字体:科幻感十足的等宽字体
- 水滴设计:完美的银色镜面反射,象征绝对强度
- 光环特效:青色发光光环,标识三体科技
- 城市模型:人类文明的最后堡垒
- 星空背景:8K HDR 星空,营造宇宙深邃感
-
视觉反馈:
- 按钮 hover 效果
- 模式切换时的闪烁
- 碰撞时的爆炸特效
- 速度变化的相机动画
-
听觉反馈:
- UI 点击音效
- 语音提示(攻击、欢迎)
- 动态背景音乐
-
触觉反馈(手柄):
- 碰撞振动(待实现)
- 加速振动(待实现)
- 关键信息:速度、模式状态(左上,大字体)
- 战术信息:雷达、舰队统计(右上,中字体)
- 辅助信息:FPS、光速百分比(角落,小字体)
- 临时信息:倒计时、攻击提示(屏幕中央)
项目内置三首科幻/史诗风格的背景音乐:
- S.T.A.Y. - 《星际穿越》主题曲,渲染孤寂氛围
- The Imperial March - 《星球大战》帝国进行曲,战斗氛围
- The Philadelphia Orchestra - 《命运交响曲》古典交响乐,史诗感
播放机制:
- 随机播放(避免连续重复)
- 音乐面板显示当前曲目
- 支持暂停/播放和切换下一首
- 自动循环播放
| 音效名称 | 文件 | 触发时机 |
|---|---|---|
| UI 点击 | UI_click.wav | 点击任何按钮 |
| 语音开始 | SpeakingBegin.wav | 特定事件 |
| 欢迎提示 | WelcomeTo.mp3 | 游戏启动 |
| 攻击目标 | AttackObj.mp3 | 人类察觉水滴攻击倒计时声音 |
使用 Three.js 的 Audio 和 AudioListener:
- 支持 3D 位置音效(待扩展)
- 音量独立控制
- 自动暂停/恢复机制
- Node.js:>= 16.0.0
- npm:>= 8.0.0
- 操作系统:Windows / macOS / Linux
cd eto
npm installnpm run dev访问:http://localhost:5173
npm run dev -- --host或者已修改配置文件,直接运行 npm run dev 即可在局域网暴露。
npm run electron:dev同时启动 Vite 开发服务器和 Electron 窗口。
npm run build输出目录:dist/
可直接部署到任何静态服务器。
npm run electron:build输出目录:release/
- Windows:
release/ETO Droplet Setup 1.0.0.exe - macOS:
release/ETO Droplet-1.0.0.dmg(需要在 Mac 上构建) - Linux:
release/eto-droplet-1.0.0.AppImage(需要在 Linux 上构建)
export default defineConfig(({ command }) => ({
base: command === 'build' ? './' : '/', // 打包使用相对路径
server: {
host: true // 局域网访问
},
build: {
outDir: 'dist',
assetsDir: 'assets',
emptyOutDir: true
}
}));{
"build": {
"appId": "com.eto.droplet",
"productName": "ETO Droplet",
"directories": {
"output": "release"
},
"files": [
"dist/**/*",
"electron/**/*",
"package.json"
],
"win": {
"target": "nsis"
}
}
}项目包含 130 个真实的三体舰名:
汉号、马萨达号、侏儒号、杨臻号、炎帝号、努曼西亚号、
苏世黎号、鹤然号、海狼号、无限边疆号、安阳号...
完整列表见 src/FleetController.js
| 参数 | 数值 | 说明 |
|---|---|---|
| 最大速度 | 3000 km/s | 约 1% 光速(UI 上限) |
| 加速度 | 约 50-100 km/s² | 按住 Space 加速 |
| 转向速度 | 2.0 rad/s | W/A/S/D 控制 |
| 急转模式 | 瞬间转向 | 按住 Alt 预瞄,松开瞬间转向 |
| 舰船初始状态 | 静止 | 未被撞击前不机动 |
| 舰船机动加速度 | 0.05-0.30 km/s² | 撞击后进入机动,可持续加速 |
- 水滴半径:1.0 units
- 舰船半径:~20 units(根据模型自动计算)
- 检测算法:球体-球体距离判定
- 碰撞效果:舰船立即触发爆炸序列
| 参数 | 数值 |
|---|---|
| 舰队规模 | 100 艘 |
| 警报触发条件 | 首次被撞击触发 |
| 倒计时时长 | 30-60 秒(随机) |
| 机动持续时间 | 倒计时结束后持续机动 |
| 编队间距 | 300 units |
| 随机扰动强度 | ±50 units |
A: 确保所有资源路径使用相对路径(不以 / 开头)。项目已修复此问题。
A: 尝试以下方案:
- 降低窗口分辨率
- 关闭 Bloom 效果(需修改代码)
- 减少舰船数量
- 使用 2K 或 4K HDR 而非 8K
A:
- 确保手柄已连接并被浏览器识别
- 按任意手柄按钮激活 Gamepad API
- 检查浏览器控制台是否有连接日志
A:
- 首次需要用户交互(点击屏幕)才能播放
- 检查浏览器是否允许自动播放音频
- 确认音频文件路径正确
A:
- 确保 GPU 支持 WebGL 2.0
- 更新显卡驱动
- 检查浏览器硬件加速是否开启
- 基础飞行控制系统
- 舰队生成和管理
- 碰撞检测和爆炸效果
- 攻击模式和目标锁定
- 科幻风格 UI
- 音效和背景音乐
- 游戏手柄支持
- 观察者视角
- Electron 桌面应用打包
- 高质量渲染管线(Bloom + MSAA)
- 更多舰船模型和材质变体
- 粒子性能优化(GPU Instancing)
- 任务系统和关卡设计
- 成就系统
- 存档和读档
- 设置菜单(画质、音量)
- 多语言支持
- VR 支持
- 多人联机模式
- 自定义关卡编辑器
- 更多三体宇宙场景(黑暗森林、智子等)
- 物理武器系统(舰队反击)
- 叙事模式(配音和过场动画)
欢迎提交 Issue 和 Pull Request!
- 遵循 ES6+ 语法
- 使用有意义的变量名和注释
- 保持代码模块化
- 测试后再提交
<type>(<scope>): <subject>
feat: 新功能
fix: 修复 Bug
docs: 文档更新
style: 代码格式
refactor: 重构
perf: 性能优化
test: 测试
chore: 构建/工具
本项目代码部分采用 MIT 许可证。
- 三体 IP:刘慈欣及相关版权方所有
- 背景音乐:版权归原作者所有,仅供学习使用
- 3D 模型:自制或使用 CC0 许可的资源
本项目仅供学习和技术交流,不得用于商业用途。
- 刘慈欣 - 《三体》原著作者
- Three.js 团队 - 优秀的 3D 图形库
- Vite 团队 - 快速的构建工具
- Electron 团队 - 跨平台桌面应用框架
如有问题或建议,欢迎联系:
- GitHub Issues: 项目 Issues 页面
给三体世界一个答案
Made with ❤️ and Three.js