吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 981|回复: 20
收起左侧

[C&C++ 原创] [C&Py]三体运动模拟(改良版)

  [复制链接]
LuLuWuWei1120 发表于 2026-5-4 19:20
本帖最后由 LuLuWuWei1120 于 2026-5-4 21:08 编辑

之前做了一个简单的纯模拟三体运动(虽然还遗留了一些bug)。花了点时间,修复了bug,并加入了一些新功能。添加了csv日志系统,python绘图(基于csv日志文件),简单的神经网络训练(自动生成dt),自动dt(基于神经网络生成)。为分化职能,添加了DataFormatter格式化字符串,SimulationIO专门负责各种IO输入输出,以及一系列新增功能的配套文件,并且优化了ui表现。话不多说先看图。

纯ui

纯ui

ui&blender界面

ui&blender界面


python绘图1

python绘图1

python绘图2

python绘图2


纯blender

纯blender


csv数据2

csv数据2

csv数据1

csv数据1

以下是README.md文件
[C] 纯文本查看 复制代码
# 三体模拟器 (Three-Body Simulator)

C++17 三体问题物理模拟器,支持 TCP 数据导出、CSV 日志记录、日志可视化分析及 AI 自动调步。

## 功能特性

- **物理引擎**:支持 Euler、Verlet、RK4 等多种积分器
- **TCP 通信**:双端口架构
  - 12345 端口:发送位置数据到 Blender 可视化
  - 12346 端口:AI 自动调步通信(C++ 作为客户端连接到 Python AI 服务器)
- **CSV 日志**:记录每帧的位置、速度、加速度、能量、dt 等完整信息
- **日志可视化**:使用 matplotlib 绘制轨迹、能量、速度、dt 曲线
- **AI 自动调步**:使用 PyTorch 训练神经网络,自动调整时间步长 dt

## 项目架构

```
ThreeBody/
├── main.cpp                # 入口
├── CMakeLists.txt          # 构建脚本
├── README.md               # 本文件
├── run.sh                  # 一键启动脚本
├── blenderClient.py        # Blender 可视化客户端
│
├── utils/                  # 工具模块
│   ├── Vec3.h              # 三维向量
│   └── Config.h            # 配置参数
│
├── physics/                # 物理引擎
│   ├── Body.h/.cpp         # 天体数据
│   ├── PhysicsEngine.h/.cpp # 力计算与能量
│   └── Integrator.h/.cpp   # 数值积分器
│
├── sim/                    # 模拟核心
│   ├── Simulation.h/.cpp   # 模拟主循环
│   ├── SimulationIO.h/.cpp # TCP/CSV 导出管理
│   └── DataFormatter.h/.cpp # 数据格式化
│
├── tcp/                    # 网络通信
│   ├── TcpExporter.h/.cpp  # TCP 服务器导出(Blender 用)
│   └── TcpClient.h/.cpp    # TCP 客户端(AI 用)
│
├── log/                    # 日志模块
│   ├── CsvLogger.h/.cpp    # CSV 写入
│   └── StatusLog.h/.cpp    # 状态日志
│
├── ui/                     # 用户界面
│   └── UserInterface.h/.cpp # 交互菜单与启动配置
│
├── script/                 # Python 辅助脚本
│   ├── plot_csv.py         # CSV 日志绘图
│   ├── ai_server.py        # AI dt 推理服务
│   ├── train_model.py      # 模型训练
│   └── create_placeholder_model.py # 创建占位模型
│
└── models/                 # AI 模型文件
    └── auto_dt_model.pt    # AI 调步模型
```

## 依赖

### C++
- C++17 编译器 (gcc/clang)
- CMake >= 3.14
- Boost.Asio (header-only, 1.70+)

### Python 3 (日志分析与 AI 模式)
- pandas
- matplotlib
- PyTorch (仅 AI 模式需要)
- Blender 3.x (仅可视化需要)

#### 安装 Python 依赖
```bash
# 基础依赖
pip install pandas matplotlib

# PyTorch (CPU 版本,推荐)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

# 或者如果你有 NVIDIA GPU
# pip install torch torchvision torchaudio
```

## 快速开始

### 1. 编译项目

```bash
mkdir -p build && cd build
cmake ..
make -j$(nproc)
cd ..
```

或者使用一键脚本(会自动编译):
```bash
chmod +x run.sh
```

### 2. 生成占位 AI 模型(可选)

```bash
cd script
python create_placeholder_model.py
cd ..
```

这个模型会始终返回 dt=0.01,作为占位用。

### 3. 运行模拟

#### 方法 1:使用一键脚本(推荐)

```bash
# 完整模式(AI + Blender)
./run.sh

# 查看帮助
./run.sh --help
```

#### 方法 2:分步运行

**第一步**:启动 AI 服务器(新终端)
```bash
python script/ai_server.py
```

**第二步**:启动模拟器
```bash
cd build
./ThreeBody
```

**第三步**:在 Blender 中运行可视化(新终端打开 Blender)
```bash
blender
# 打开脚本标签,加载 blenderClient.py 并运行
```

## 使用说明

### 运行模拟器后,菜单选择

```
1. 随机模式 – 随机生成初始条件
2. 稳定模式 – 拉格朗日解、8字形解等已知稳定轨道
3. 自定义模式 – 手动输入每个天体的参数
4. 日志分析 – 选择已有 CSV 文件绘图
5. 退出
```

### 日志分析(CSV 绘图)

先运行模拟,生成 CSV 日志(自动保存在 `logs/`),然后:

```bash
# 在模拟器菜单选择 4
# 或者直接运行
python script/plot_csv.py logs/sim_202501011200.csv
```

生成的图像会保存到 `logs/plots/` 目录。

## AI 自动调步 (autoDt)

### 架构说明
- **C++ 端**:作为 TCP 客户端,连接到 127.0.0.1:12346
- **Python 端**:作为 TCP 服务器,监听 127.0.0.1:12346

### 通信协议
- **C++ → Python (每帧)**:一行 JSON 格式
  ```json
  {
    "dt": 0.01,
    "energy": -100.0,
    "bodies": [
      {"pos": [x, y, z], "vel": [x, y, z], "acc": [x, y, z]},
      ...
    ]
  }
  ```
- **Python → C++ (每帧响应)**:一行浮点数,例如 `0.015`

### 训练自定义模型

1. **收集数据**:运行模拟器,生成一些 CSV 日志
2. **训练模型**:
   ```bash
   cd script
   python train_model.py --csv ../logs/sim_*.csv --output ../models/auto_dt_model.pt --epochs 100
   ```
3. **重启 AI 服务器**:加载新模型
4. **运行模拟器**:使用新模型自动调整 dt

### 特征维度说明
- 输入维度:29 维
  - 2 维:当前 dt、系统能量
  - 27 维:3个天体 × (位置3维 + 速度3维 + 加速度3维)
- 输出维度:1 维,预测的 dt

## Blender 可视化

### 使用步骤
1. 打开 Blender
2. 切换到 Scripting 工作区
3. New 新建一个文本文件
4. 复制 `blenderClient.py` 内容,或直接用 Blender 打开该文件
5. 确保 C++ 模拟器正在运行(或已准备好)
6. 点击 Run Script 运行
7. 启动 C++ 模拟,球体会自动更新位置

### 注意事项
- Blender 是 TCP 客户端,连接到 C++ 的 12345 端口
- 三个球体分别用红、绿、蓝色表示
- 球体半径根据物理参数自动缩放

## 常见问题

### Q: 编译出错,找不到 Boost
A: 安装 Boost 库或使用系统包管理器
- Ubuntu/Debian: `sudo apt install libboost-all-dev`
- Fedora/CentOS: `sudo dnf install boost-devel`

### Q: 运行报错 "bind: Address already in use"
A: 关闭占用相关端口的进程
```bash
pkill -9 -f ThreeBody
pkill -9 -f ai_server
```

### Q: Blender 球体不移动
A: 检查连接顺序
1. 先启动 C++ 模拟器
2. 选择模式,初始化 TCP
3. 再在 Blender 中运行客户端脚本

### Q: AI 服务器提示找不到 torch
A: 安装 PyTorch,或使用虚拟环境

## 开发指南

### 项目结构说明
- **utils/**:基础工具类(Vec3、Config)
- **physics/**:物理引擎核心
- **sim/**:模拟控制和 IO
- **tcp/**:网络通信
- **ui/**:菜单和用户交互
- **log/**:日志处理

### 添加新功能

1. 添加新的积分器:在 `physics/Integrator.h/.cpp` 中继承并实现
2. 修改数据格式:在 `sim/DataFormatter.cpp` 中修改
3. 添加新的导出:继承或修改 `sim/SimulationIO`

## 许可证
本项目仅供学习和研究使用。


此次代码特意使用boost/asio网络库以确保跨平台性,但也因此需要额外配置asio库。此外,所需环境仅python,c/c++,pytorch以及可视化工具blender(只要以脚本模式打开blenderClient并运行即可),ai和可视化部分并非一定需要,可在config中调整,(哪怕不调整)直接运行应该也可以。
理论上来说,linux环境下可以直接编译运行,为方便运行额外配置了run.sh文件。至于windows等其它平台,应该需要修改CMakeLists.txt文件才能输出可执行文件(丢给ai应该不难),至于run.sh有效性未知。

完整项目及代码在此处。(Ps:本人测试动量的时候忘记把源代码中碰撞系数调回来了,如果碰撞系数太低了以目前的模拟精度好像不太行,建议调成1.0)
完成后让ai生成了注释,README.md等文件,可读性应该不差。
不废话了,希望你能玩得开心。

ThreeBody.zip (1.8 MB, 下载次数: 18)

免费评分

参与人数 3威望 +1 吾爱币 +22 热心值 +1 收起 理由
ice52 + 1 热心回复!
苏紫方璇 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ygqygl88 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

qianjin88 发表于 2026-5-4 19:37
三体人还有多久到达地球
 楼主| LuLuWuWei1120 发表于 2026-5-4 21:48
Tsuki0402 发表于 2026-5-4 20:06
 楼主| LuLuWuWei1120 发表于 2026-5-4 20:31
qianjin88 发表于 2026-5-4 19:37
三体人还有多久到达地球

三体人和我说‘你们是虫子’,虫子不配知道 ETA。
yk85221478 发表于 2026-5-4 21:19
虽然没看懂,但是我占楼!~~~
tiantangniaone3 发表于 2026-5-4 21:43
拯救三体,拯救地球
 楼主| LuLuWuWei1120 发表于 2026-5-4 21:47
yk85221478 发表于 2026-5-4 21:19
虽然没看懂,但是我占楼!~~~

拿个电脑,直接把上面的源代码丢给ai(比如trae),ai应该就能教你运行来玩玩了。拿手机的termux应该也可以,不过可视化部分和ai部分可能要关掉,只能看终端信息,csv文件和python生成的图片。
Bluesky10 发表于 2026-5-4 22:06
感谢您的分享,让我受益良多
zhangyiyang 发表于 2026-5-4 22:25
牛啊牛啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-5-12 05:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表