8.0 KiB
8.0 KiB
轨道倾角设置方案
问题: 当前轨道生成系统支持设置轨道周期和颜色,但缺少轨道倾角的独立设置功能。
当前实现分析
轨道数据来源
当前系统从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坐标变化更明显)
问题:为什么看不到倾角效果?
可能的原因
-
观察角度问题:
- 如果相机从正上方俯视,所有倾角都看不出来
- 需要从侧面观察才能看到z轴的变化
-
倾角太小:
- 大部分行星倾角<10°,视觉上不明显
- 需要夸张显示才能看清
-
坐标系转换:
- 前端代码中有坐标转换:
new THREE.Vector3(scaled.x, scaled.z, scaled.y) - 可能导致倾角方向与预期不符
- 前端代码中有坐标转换:
解决方案
方案A:显示真实倾角(推荐)✅
不需要编辑倾角,因为NASA数据已经是真实的。只需要:
1. 添加倾角信息显示
在天体管理界面显示轨道倾角参数(只读):
// 从extra_data读取或计算
const inclination = body.extra_data?.orbital_inclination || "计算中";
<Descriptions.Item label="轨道倾角">
{inclination}°
</Descriptions.Item>
2. 改善观察视角
修改默认相机角度,让倾角更明显:
// Scene.tsx
<PerspectiveCamera
makeDefault
position={[300, 150, 300]} // 从斜上方观察
fov={60}
/>
3. 添加辅助参考面
显示黄道面作为参考:
<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. 数据库字段扩展
ALTER TABLE orbits ADD COLUMN inclination_deg DOUBLE PRECISION;
ALTER TABLE orbits ADD COLUMN ascending_node_deg DOUBLE PRECISION;
2. 后端:轨道参数化生成
不使用NASA数据,而是用开普勒轨道根元素计算:
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. 前端表单字段
<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)✅
目标: 让现有的真实倾角更明显可见
-
添加倾角信息显示
- 在天体详情中显示轨道倾角(从NASA数据提取)
- 在轨道列表中显示倾角参数
-
改善可视化
- 调整默认相机角度为斜视
- 添加黄道面参考平面
- 增加轨道线的透明度对比
-
优化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° | ⭐ 极其明显 |
结论: 只有矮行星的倾角足够大,肉眼可见。八大行星倾角都很小。
实施建议
立即可做(无需代码修改)
-
切换到冥王星或阋神星观察
- 这两个天体倾角大,效果明显
- 从侧面观察可以看到z轴变化
-
调整相机角度
- 不要从正上方俯视
- 使用斜角45°观察
需要代码修改(推荐)
1. 添加黄道面参考
// 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. 显示倾角信息
// components/BodyDetailOverlay.tsx
{bodyData.extra_data?.orbital_inclination && (
<Descriptions.Item label="轨道倾角">
{bodyData.extra_data.orbital_inclination.toFixed(2)}°
</Descriptions.Item>
)}
3. 从NASA数据提取倾角
# 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参数
总结
关键要点
- ✅ 轨道倾角已经存在 - 在NASA返回的3D坐标中
- ⚠️ 不建议手动编辑真实天体的倾角 - 会失去准确性
- ✅ 改善可视化 - 通过参考面和相机角度让倾角更明显
- 📊 显示倾角参数 - 从NASA提取并显示在UI中
下一步行动
选项A: 保持真实性,优化可视化(推荐)
- 添加黄道面参考
- 调整默认视角
- 显示倾角数值
选项B: 完全参数化,支持虚拟天体
- 实现开普勒轨道计算
- 添加所有6个轨道根元素的编辑
- 适合游戏或教育演示
建议: 先实施选项A,如果后续需要虚拟天体再考虑选项B。