cosmo/PROJECT.md

226 lines
6.2 KiB
Markdown
Raw Normal View History

# Cosmo - 深空探测器可视化系统
## 项目概述
基于 NASA JPL Horizons 数据的深空探测器 3D 可视化系统,展示旅行者号、火星探测器等深空探测器在太阳系中的实时位置和历史轨迹。
## 技术栈
### 后端
- **框架**: Python 3.11+ with FastAPI
- **核心库**:
- `fastapi` - Web 框架
- `astroquery` - NASA JPL Horizons 数据查询
- `astropy` - 天文计算和时间处理
- `uvicorn` - ASGI 服务器
- `pydantic` - 数据验证
- `python-dotenv` - 环境变量管理
### 前端
- **框架**: React 18 with TypeScript
- **构建工具**: Vite
- **3D 渲染**:
- `three` - 核心 3D 引擎
- `@react-three/fiber` - React Three.js 集成
- `@react-three/drei` - Three.js 辅助组件
- **UI 库**:
- `tailwindcss` - 样式框架
- `lucide-react` - 图标库
- **状态管理**: React Hooks (useState, useContext)
- **HTTP 客户端**: `axios`
## 核心功能
### 1. 数据获取
- 从 NASA JPL Horizons 获取探测器和行星的日心坐标 (x, y, z)
- 支持时间序列查询(用户指定起止时间)
- 数据缓存策略每3天更新一次
- 单位AU (天文单位)
### 2. 支持的天体
#### 探测器
| 名称 | ID | 备注 |
|------|----|----|
| Voyager 1 | -31 | 最远的人造物体 |
| Voyager 2 | -32 | 访问过天王星海王星 |
| New Horizons | -98 | 冥王星探测器 |
| Parker Solar Probe | -96 | 最接近太阳 |
| Juno | -61 | 木星探测器 |
| Cassini | -82 | 土星探测器(历史数据) |
| Perseverance | -168 | 火星车 |
#### 行星
| 名称 | ID |
|------|----|
| Sun | 10 |
| Mercury | 199 |
| Venus | 299 |
| Earth | 399 |
| Mars | 499 |
| Jupiter | 599 |
| Saturn | 699 |
| Uranus | 799 |
| Neptune | 899 |
### 3. 3D 可视化功能
#### 基础功能
- 太阳系 3D 场景渲染(日心坐标系)
- 行星纹理贴图diffuse, normal, specular maps
- 探测器 3D 模型加载GLB 格式)
- 轨道线绘制(时间序列连线)
- 星空背景Skybox
#### 交互功能(进阶)
- **OrbitControls**: 旋转、缩放、平移视角
- **点击聚焦**: 点击探测器/行星,相机平滑飞向目标
- **信息面板**: 显示选中物体的详细信息
- 名称、距离太阳距离、速度
- 最近的行星及距离
- **时间选择器**: 用户选择起止时间查看历史位置
- **动态缩放**: 解决尺度问题(远看时放大物体)
### 4. 尺度处理策略
**问题**: 太阳系空间巨大,真实比例下行星会小到看不见
**解决方案**:
- 坐标系统使用真实 AU 单位(计算准确)
- 渲染时应用动态缩放:
- 远景:行星和探测器放大 1000-10000 倍
- 近景:逐渐恢复真实比例
- 探测器在远景时显示为发光图标,近景时显示 3D 模型
## 外部资源需求
### 3D 模型(需下载)
- **来源**: https://nasa3d.arc.nasa.gov/models
- **格式**: GLB/GLTF
- **存放位置**: `frontend/public/models/`
- **需要的模型**:
- Voyager 1 & 2
- New Horizons
- Parker Solar Probe
- Juno
- Cassini
- Perseverance
### 行星纹理(需下载)
- **来源**: https://www.solarsystemscope.com/textures/
- **格式**: JPG/PNG (2K 或 4K)
- **存放位置**: `frontend/public/textures/`
- **每个行星需要**:
- `{planet}_diffuse.jpg` - 颜色贴图
- `{planet}_normal.jpg` - 法线贴图(可选)
- `earth_specular.jpg` - 地球高光贴图(仅地球)
## 项目结构
```
cosmo/
├── backend/
│ ├── app/
│ │ ├── __init__.py
│ │ ├── main.py # FastAPI 入口
│ │ ├── config.py # 配置
│ │ ├── models/
│ │ │ ├── __init__.py
│ │ │ └── celestial.py # 数据模型
│ │ ├── services/
│ │ │ ├── __init__.py
│ │ │ ├── horizons.py # JPL Horizons 查询
│ │ │ └── cache.py # 数据缓存
│ │ └── api/
│ │ ├── __init__.py
│ │ └── routes.py # API 路由
│ ├── requirements.txt
│ └── .env.example
├── frontend/
│ ├── src/
│ │ ├── App.tsx
│ │ ├── main.tsx
│ │ ├── components/
│ │ │ ├── Scene.tsx # 主场景
│ │ │ ├── CelestialBody.tsx
│ │ │ ├── Probe.tsx
│ │ │ ├── OrbitLine.tsx
│ │ │ ├── InfoPanel.tsx
│ │ │ └── TimeSelector.tsx
│ │ ├── hooks/
│ │ │ └── useSpaceData.ts
│ │ ├── types/
│ │ │ └── index.ts
│ │ └── utils/
│ │ └── api.ts
│ ├── public/
│ │ ├── models/ # 探测器 3D 模型
│ │ └── textures/ # 行星纹理
│ ├── package.json
│ ├── tsconfig.json
│ ├── vite.config.ts
│ └── tailwind.config.js
├── PROJECT.md # 本文件
├── IMPLEMENTATION_PLAN.md # 实施计划
└── README.md
```
## API 设计
### 端点
#### `GET /api/celestial/positions`
获取指定时间的天体位置
**Query Parameters**:
- `start_time`: ISO 8601 格式(可选,默认为当前时间)
- `end_time`: ISO 8601 格式(可选)
- `step`: 时间步长,如 "1d"(可选,默认 "1d"
**Response**:
```json
{
"timestamp": "2025-11-26T00:00:00Z",
"bodies": [
{
"id": "-31",
"name": "Voyager 1",
"type": "probe",
"positions": [
{
"time": "2025-11-26T00:00:00Z",
"x": 160.5,
"y": 20.3,
"z": -15.2
}
]
}
]
}
```
#### `GET /api/celestial/info/{body_id}`
获取天体详细信息
**Response**:
```json
{
"id": "-31",
"name": "Voyager 1",
"type": "probe",
"description": "离地球最远的人造物体",
"launch_date": "1977-09-05",
"status": "active"
}
```
## 开发阶段
详见 `IMPLEMENTATION_PLAN.md`
## 数据更新策略
- 深空探测器移动缓慢数据每3天更新一次
- 后端实现缓存机制,避免频繁请求 NASA API
- 缓存存储在内存中(简单实现)或 Redis生产环境