331 lines
8.0 KiB
Markdown
331 lines
8.0 KiB
Markdown
# 轨道倾角设置方案
|
||
|
||
**问题**: 当前轨道生成系统支持设置轨道周期和颜色,但缺少轨道倾角的独立设置功能。
|
||
|
||
---
|
||
|
||
## 当前实现分析
|
||
|
||
### 轨道数据来源
|
||
|
||
当前系统从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 || "计算中";
|
||
|
||
<Descriptions.Item label="轨道倾角">
|
||
{inclination}°
|
||
</Descriptions.Item>
|
||
```
|
||
|
||
#### 2. 改善观察视角
|
||
|
||
修改默认相机角度,让倾角更明显:
|
||
|
||
```typescript
|
||
// Scene.tsx
|
||
<PerspectiveCamera
|
||
makeDefault
|
||
position={[300, 150, 300]} // 从斜上方观察
|
||
fov={60}
|
||
/>
|
||
```
|
||
|
||
#### 3. 添加辅助参考面
|
||
|
||
显示黄道面作为参考:
|
||
|
||
```typescript
|
||
<mesh rotation={[-Math.PI / 2, 0, 0]} position={[0, 0, 0]}>
|
||
<planeGeometry args={[1000, 1000]} />
|
||
<meshBasicMaterial
|
||
color="#333333"
|
||
transparent
|
||
opacity={0.1}
|
||
side={THREE.DoubleSide}
|
||
/>
|
||
</mesh>
|
||
```
|
||
|
||
---
|
||
|
||
### 方案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
|
||
<Form.Item
|
||
name={['extra_data', 'orbital_inclination']}
|
||
label="轨道倾角(度)"
|
||
tooltip="轨道平面相对黄道面的倾斜角度"
|
||
>
|
||
<InputNumber min={0} max={180} step={0.1} />
|
||
</Form.Item>
|
||
|
||
<Form.Item
|
||
name={['extra_data', 'orbital_eccentricity']}
|
||
label="轨道离心率"
|
||
tooltip="0=圆形,0-1=椭圆,1=抛物线"
|
||
>
|
||
<InputNumber min={0} max={0.99} step={0.01} />
|
||
</Form.Item>
|
||
```
|
||
|
||
---
|
||
|
||
## 推荐实施方案
|
||
|
||
### 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
|
||
<mesh rotation={[-Math.PI / 2, 0, 0]}>
|
||
<circleGeometry args={[500, 64]} />
|
||
<meshBasicMaterial
|
||
color="#1a1a1a"
|
||
transparent
|
||
opacity={0.2}
|
||
side={THREE.DoubleSide}
|
||
/>
|
||
</mesh>
|
||
```
|
||
|
||
#### 2. 显示倾角信息
|
||
|
||
```typescript
|
||
// components/BodyDetailOverlay.tsx
|
||
{bodyData.extra_data?.orbital_inclination && (
|
||
<Descriptions.Item label="轨道倾角">
|
||
{bodyData.extra_data.orbital_inclination.toFixed(2)}°
|
||
</Descriptions.Item>
|
||
)}
|
||
```
|
||
|
||
#### 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。
|