# 轨道倾角设置方案
**问题**: 当前轨道生成系统支持设置轨道周期和颜色,但缺少轨道倾角的独立设置功能。
---
## 当前实现分析
### 轨道数据来源
当前系统从NASA JPL Horizons API获取真实的3D位置数据:
```
API返回: [
{x: 1.0, y: 0.0, z: 0.0}, // 轨道点1
{x: 0.99, y: 0.01, z: 0.001}, // 轨道点2
...
]
```
**重要**: 这些3D坐标已经包含了真实的轨道倾角信息!
例如:
- **地球轨道**: 相对黄道面倾角 7.155°(已体现在z坐标中)
- **冥王星轨道**: 倾角 17.14°(z坐标变化更明显)
---
## 问题:为什么看不到倾角效果?
### 可能的原因
1. **观察角度问题**:
- 如果相机从正上方俯视,所有倾角都看不出来
- 需要从侧面观察才能看到z轴的变化
2. **倾角太小**:
- 大部分行星倾角<10°,视觉上不明显
- 需要夸张显示才能看清
3. **坐标系转换**:
- 前端代码中有坐标转换:`new THREE.Vector3(scaled.x, scaled.z, scaled.y)`
- 可能导致倾角方向与预期不符
---
## 解决方案
### 方案A:显示真实倾角(推荐)✅
**不需要编辑倾角**,因为NASA数据已经是真实的。只需要:
#### 1. 添加倾角信息显示
在天体管理界面显示轨道倾角参数(只读):
```typescript
// 从extra_data读取或计算
const inclination = body.extra_data?.orbital_inclination || "计算中";
{inclination}°
```
#### 2. 改善观察视角
修改默认相机角度,让倾角更明显:
```typescript
// Scene.tsx
```
#### 3. 添加辅助参考面
显示黄道面作为参考:
```typescript
```
---
### 方案B:支持手动设置倾角 ⚠️
如果确实需要手动调整倾角(例如创建虚拟天体),需要实现:
#### 1. 数据库字段扩展
```sql
ALTER TABLE orbits ADD COLUMN inclination_deg DOUBLE PRECISION;
ALTER TABLE orbits ADD COLUMN ascending_node_deg DOUBLE PRECISION;
```
#### 2. 后端:轨道参数化生成
不使用NASA数据,而是用开普勒轨道根元素计算:
```python
def generate_parametric_orbit(
semi_major_axis: float, # 半长轴(AU)
eccentricity: float, # 离心率
inclination_deg: float, # 轨道倾角(度)
ascending_node_deg: float, # 升交点经度
argument_periapsis_deg: float,# 近日点幅角
num_points: int = 360
) -> List[Dict[str, float]]:
"""参数化生成椭圆轨道"""
import numpy as np
points = []
inc = np.radians(inclination_deg)
asc_node = np.radians(ascending_node_deg)
arg_peri = np.radians(argument_periapsis_deg)
# 旋转矩阵
def rotate_orbit(x, y, z):
# 应用升交点旋转
x1 = x * np.cos(asc_node) - y * np.sin(asc_node)
y1 = x * np.sin(asc_node) + y * np.cos(asc_node)
z1 = z
# 应用倾角旋转
x2 = x1
y2 = y1 * np.cos(inc) - z1 * np.sin(inc)
z2 = y1 * np.sin(inc) + z1 * np.cos(inc)
# 应用近日点幅角旋转
x3 = x2 * np.cos(arg_peri) - y2 * np.sin(arg_peri)
y3 = x2 * np.sin(arg_peri) + y2 * np.cos(arg_peri)
z3 = z2
return x3, y3, z3
for i in range(num_points):
# 真近点角
true_anomaly = 2 * np.pi * i / num_points
# 椭圆轨道方程
r = semi_major_axis * (1 - eccentricity**2) / (1 + eccentricity * np.cos(true_anomaly))
x = r * np.cos(true_anomaly)
y = r * np.sin(true_anomaly)
z = 0 # 初始在轨道平面
# 应用倾角旋转
x_rot, y_rot, z_rot = rotate_orbit(x, y, z)
points.append({"x": x_rot, "y": y_rot, "z": z_rot})
return points
```
#### 3. 前端表单字段
```typescript
```
---
## 推荐实施方案
### Phase 1: 快速改进(方案A)✅
**目标**: 让现有的真实倾角更明显可见
1. **添加倾角信息显示**
- 在天体详情中显示轨道倾角(从NASA数据提取)
- 在轨道列表中显示倾角参数
2. **改善可视化**
- 调整默认相机角度为斜视
- 添加黄道面参考平面
- 增加轨道线的透明度对比
3. **优化OrbitRenderer**
- 确保坐标转换正确
- 添加倾角调试信息
**实施时间**: 1-2小时
**适用场景**: 查看和理解真实天体轨道
---
### Phase 2: 完全参数化(方案B)⚠️
**目标**: 支持完全自定义轨道参数
**注意事项**:
- ⚠️ 失去NASA真实数据的准确性
- ⚠️ 需要实现完整的开普勒轨道计算
- ⚠️ 前端需要选择"真实轨道"或"参数化轨道"
**建议**: 仅在需要创建虚拟天体时使用
---
## 当前系统中的轨道倾角
### 太阳系行星真实倾角(相对黄道面)
| 天体 | 轨道倾角 | 是否明显 |
|------|---------|---------|
| 水星 | 7.00° | 中等 |
| 金星 | 3.39° | 较小 |
| 地球 | 0.00° | 无(定义为黄道面) |
| 火星 | 1.85° | 较小 |
| 木星 | 1.31° | 较小 |
| 土星 | 2.49° | 较小 |
| 天王星 | 0.77° | 很小 |
| 海王星 | 1.77° | 较小 |
| 冥王星 | **17.14°** | ⭐ 非常明显 |
| 谷神星 | 10.59° | 明显 |
| 阋神星 | **44.04°** | ⭐ 极其明显 |
**结论**: 只有矮行星的倾角足够大,肉眼可见。八大行星倾角都很小。
---
## 实施建议
### 立即可做(无需代码修改)
1. **切换到冥王星或阋神星**观察
- 这两个天体倾角大,效果明显
- 从侧面观察可以看到z轴变化
2. **调整相机角度**
- 不要从正上方俯视
- 使用斜角45°观察
### 需要代码修改(推荐)
#### 1. 添加黄道面参考
```typescript
// components/Scene.tsx 或 OrbitRenderer.tsx
```
#### 2. 显示倾角信息
```typescript
// components/BodyDetailOverlay.tsx
{bodyData.extra_data?.orbital_inclination && (
{bodyData.extra_data.orbital_inclination.toFixed(2)}°
)}
```
#### 3. 从NASA数据提取倾角
```python
# backend/app/services/horizons.py
async def get_orbital_elements(body_id: str):
"""获取轨道根元素(包括倾角)"""
# NASA Horizons API支持获取轨道根元素
params = {
"format": "json",
"COMMAND": body_id,
"OBJ_DATA": "YES",
"MAKE_EPHEM": "YES",
"EPHEM_TYPE": "ELEMENTS", # 获取轨道根元素
"CENTER": "@sun"
}
# 解析返回的inclination参数
```
---
## 总结
### 关键要点
1. ✅ **轨道倾角已经存在** - 在NASA返回的3D坐标中
2. ⚠️ **不建议手动编辑真实天体的倾角** - 会失去准确性
3. ✅ **改善可视化** - 通过参考面和相机角度让倾角更明显
4. 📊 **显示倾角参数** - 从NASA提取并显示在UI中
### 下一步行动
**选项A**: 保持真实性,优化可视化(推荐)
- 添加黄道面参考
- 调整默认视角
- 显示倾角数值
**选项B**: 完全参数化,支持虚拟天体
- 实现开普勒轨道计算
- 添加所有6个轨道根元素的编辑
- 适合游戏或教育演示
---
**建议**: 先实施选项A,如果后续需要虚拟天体再考虑选项B。