cosmo/ORBIT_INCLINATION_SOLUTION.md

8.0 KiB
Raw Permalink Blame History

轨道倾角设置方案

问题: 当前轨道生成系统支持设置轨道周期和颜色,但缺少轨道倾角的独立设置功能。


当前实现分析

轨道数据来源

当前系统从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. 添加倾角信息显示

在天体管理界面显示轨道倾角参数(只读):

// 从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

目标: 让现有的真实倾角更明显可见

  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. 添加黄道面参考

// 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参数

总结

关键要点

  1. 轨道倾角已经存在 - 在NASA返回的3D坐标中
  2. ⚠️ 不建议手动编辑真实天体的倾角 - 会失去准确性
  3. 改善可视化 - 通过参考面和相机角度让倾角更明显
  4. 📊 显示倾角参数 - 从NASA提取并显示在UI中

下一步行动

选项A: 保持真实性,优化可视化(推荐)

  • 添加黄道面参考
  • 调整默认视角
  • 显示倾角数值

选项B: 完全参数化,支持虚拟天体

  • 实现开普勒轨道计算
  • 添加所有6个轨道根元素的编辑
  • 适合游戏或教育演示

建议: 先实施选项A如果后续需要虚拟天体再考虑选项B。