# 轨道倾角设置方案 **问题**: 当前轨道生成系统支持设置轨道周期和颜色,但缺少轨道倾角的独立设置功能。 --- ## 当前实现分析 ### 轨道数据来源 当前系统从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。