【问题标题】:Orbital mechanics for a Solar System visualisation in Three.js (x,y,z for planets)Three.js 中太阳系可视化的轨道力学(x,y,z 代表行星)
【发布时间】:2014-07-03 14:35:10
【问题描述】:

我正在使用 Three.js 进行太阳系可视化。现在我的行​​星有基本的圆形轨道,我想让我的模型尽可能逼真。我浏览了 wiki 和一些文章,但这些东西非常先进。

我并不真正关心成千上万年的轨道,我只想要一个接近蜜蜂的现实模型,它将证明:

  1. 正确的椭圆轨道
  2. 倾斜度
  3. 动态改变速度(近日点更快)

我想知道是否有足够复杂的方法来计算我的行星在给定 t(动态变化)可能使用轨道元素的 x,y,z

希望,我已经把我的想法说清楚了。谢谢

【问题讨论】:

  • 你试过什么?你已经说了你需要什么。给定 t 计算 x,y,z。圆可以定义为满足方程 x = r cos(t) y = r sin(t) 的所有点的轨迹
  • 我当前的代码看起来像那个mercury.position.x = 20*Math.cos(t) + 0;水银位置.z = 20*Math.sin(t) + 0;但是这个轨迹只是圆圈,我想在模型中添加一些物理,我想也许有一个使用轨道元素的方程更适合这个任务。您知道一件可以解决所有问题的好而简单的事情:)
  • 你想要这个有多准确? NASA 使用基于牛顿引力的迭代过程计算轨道轨迹,但这不适用于水星。如果您想要 Mercury 的准确性,您需要广义相对论 - 10 个链接的偏微分方程和许多有效的解决方案。或者你可以只找到一个年历并绘制一次位置。
  • 当然不是 NASA 准确的 :) 我想的只是一般轨道运动原理的可视化。没想到这么复杂
  • 倾角和轨道形式是我认为我可以做到的,但例如在近日点的加速让我感到困惑

标签: javascript math three.js visualization orbital-mechanics


【解决方案1】:

也许您应该尝试对轨道进行二维投影。在这种情况下,您只需将椭圆参数化为向量函数,例如 ɣ(x(t), y(t))。

然后为了应用物理方面,想象两个质心,太阳 M 和给定的行星 μ。行星 F 上的力由 F=GμM/|ɣ|² 给出,加速度遵循牛顿第二定律 a=GM/|ɣ|²,始终指向较大的质量 M。

为了设置曲线ɣ,你可以使用http://en.wikipedia.org/wiki/Ellipse#Equations

【讨论】:

    【解决方案2】:

    如果您对显示一些关键元素的近似值感到满意,那么您可以尝试为所有行星计算几年内的查找表。例如,海王星的轨道周期为 164 年,因此计算该期间每个月所有行星的位置应该给出一个相对易于管理的比例表。要获得轨道速度变化的视觉表示,您需要更精细的分辨率。计算完成后,您只需要构建一个动画来绘制位置。

    计算非常复杂。我不打算在这里重复计算——它太长了——但是你可以找到一个很好的描述here,以及一个用 QBasic 编写的示例程序

    主要步骤是:

    找到行星在其轨道上的位置 - 查找自元素日期以来的天数 - 从平均经度和日常运动中找到平均异常 - 使用中心方程找到真正的异常 - 找到行星的半径向量

    将该位置参考黄道 - 从而找到行星的日心黄道坐标

    获得日心坐标后,将它们转换为您自己的参考系(链接页面显示了如何为地心坐标执行此操作,但这没有用。您需要自己解决这个问题。)添加坐标到你的桌子。

    您可以尝试实时运行计算,这样会更灵活,但可能会限制帧速率。这里可能需要进行一些实验。

    感谢 Keith Burnett(链接页面的作者)提供我在上面浓缩的详细信息。

    【讨论】:

      【解决方案3】:

      这里是一些用 C++ 完成任务的代码。尽管它没有将日期作为参数。这有点复杂。但是 - 用正确的值替换 i 应该可以解决问题。 (我用这段代码绘制了围绕太阳的轨道。

      double x = distanceFromSun * orbitScaleFactor;
      double y = sin(inclination) * distanceFromSun * orbitScaleFactor;
      double z = semiMinorAxis * orbitScaleFactor;
      
      for (double i = 0; i < 2.0 * PI; i += PI / 32.0) {
          x = cos(i) * x;
          y = cos(i + lonOfAscendingNode) * y;
          z = sin(i) * z;
      }
      

      P.S 即使您的问题专门针对 javascript,给您提供 c++ 代码我也不会感到内疚——我认为等式是您真正想要的。

      你可以在这里看到我的完整代码:https://github.com/SyntaxRules/SolarSystemSimulation/blob/master/src/Planet.cpp

      您也可以在那里找到有关变量的信息。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-14
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        相关资源
        最近更新 更多