气态巨行星天文漫谈 · 第 2 轨道
脉冲星 PSR B1919+21 · 轨道半径 10.4 万 km · 4 颗卫星
N体行星运动物理模拟可视化系统
一个可交互的 N 体行星系统模拟器
- 发布
- 字数
- 1,510
- 阅读
- 4 分钟

想直观理解行星为什么会绕恒星运行、双星为什么会互相牵引、三体系统为什么会显得“难以预测”,一个可视化的 N 体引力模拟器会比一堆静态公式更有说服力。这个项目用浏览器把经典天体力学、数值积分和 3D 渲染结合起来:一边计算多天体之间的引力相互作用,一边实时展示轨道、速度和系统演化过程。它既可以拿来做教学演示,也适合做一些直观的参数实验,比如改一个天体质量、调一下初速度,看看整个系统会发生什么。
背景介绍
当系统里只有两个天体时,问题通常还能得到漂亮的解析解;但一旦进入三个及以上天体的相互作用,就进入了经典的 N 体问题。此时系统的长期行为通常不能靠封闭形式的解析表达式直接写出来,只能依赖数值模拟。与此同时,传统命令行模拟虽然计算有效,但不够直观,而 WebGL、Three.js 这一类前端图形技术已经足够成熟,能够把天体运动过程直接放进浏览器里实时呈现。
三体问题(3D)预设:三颗恒星相互牵引留下的轨迹
公式推导
1. 万有引力与加速度
任意两个天体之间都存在引力作用。把第 个天体受到的所有引力叠加起来,就能得到它的加速度:
其中:
- 表示第 个天体的加速度向量
- 表示万有引力常数
- 表示系统中的天体总数
- 表示第 个天体的质量
- 表示第 个天体的位置向量
- 表示第 个天体的位置向量
- 表示两个天体之间的距离
这条式子基本就是整个模拟器的物理核心:先根据所有天体当前位置算加速度,再据此更新速度和位置。
2. 圆轨道速度
如果一个天体绕中心天体做近似圆周运动,那么轨道速度可以写成:
其中:
- 表示圆轨道速度
- 表示万有引力常数
- 表示中心天体质量
- 表示轨道半径
这条公式很适合用来生成初始条件。只要给定中心天体质量和轨道半径,就能快速构造一个“差不多能转起来”的系统。
3. 为什么要做单位归一化
如果直接使用 SI 单位,距离可能是 米量级、质量可能是 千克量级,而 又非常小,这会给数值计算带来不必要的精度压力。所以实现里采用了天文学单位系统:距离用 AU,质量用太阳质量 ,时间用 day。这样常数尺度更适合计算机处理。
4. 数值积分怎么选
为了把连续运动离散成一帧一帧的更新,实现里提供了三种积分方法:
- 半隐式欧拉法:实现简单,守恒性质较好,适合长期定性观察
- RK4(四阶龙格-库塔):精度高,适合教学演示和短期高精度模拟
- Velocity Verlet:在精度、效率和能量守恒之间比较平衡
默认选择 RK4,是因为它在展示轨道时更稳定、也更容易得到平滑结果。除此之外,还加入了自适应子步进和软化参数,用来避免天体近距离接近时数值发散。
实现工具
整个项目采用的是比较现代的一套 Web 技术栈:
- TypeScript:负责类型安全和可维护性
- React 18:负责界面组织
- Three.js / React Three Fiber:负责 3D 场景渲染
- Zustand:负责模拟状态管理
- Vite:负责开发和构建流程
工程结构上,大致分成物理引擎、预设场景、状态管理、3D 视口和 UI 组件几部分。其中 physics/ 负责向量运算、积分器和主引擎逻辑,presets/ 负责太阳系、双星、黑洞等预设,viewer/ 负责 3D 天体显示,components/ 负责工具栏和侧边栏界面。
功能演示
这个模拟器不是只把几个球画出来,而是尽量把“可交互实验平台”做完整。核心体验包括:
1. 多种预设场景
内置了多个典型场景,包括太阳系、双星系统、黑洞场景和三体问题。这样一打开就能直接观察不同引力系统的行为差异,不需要先手动搭系统。
2. 可编辑天体参数
可以对天体进行编辑,包括质量、半径、位置、速度等关键参数。这样就能把“看演示”变成“做实验”:改一个参数,立即观察轨道如何重构。
3. 轨道与 3D 视角可视化
项目基于 React Three Fiber 实现了天体渲染、轨道轨迹绘制和交互式相机控制,因此既能看到天体当前的位置,也能从三维视角理解轨道倾角、交会关系和整体结构。
4. 时间与显示控制
支持时间控制、显示选项和比例尺控制,可以调整模拟节奏、观察不同尺度下的空间结构,也可以根据需要选择展示哪些辅助信息。
5. 保存与加载预设
除了内置场景,也支持保存和加载预设,便于把调好的系统参数复用下来,或者做多个案例对比。
代码链接
项目源码已经整理为独立仓库,可以直接查看和运行:
- 代码仓库:planetary-science
本地运行方式:
cd planetary-system
npm install
npm run dev