Three.js中用于太阳系可视化的轨道力学(行星的x、y、z坐标)

3
我正在使用Three.js进行太阳系可视化。目前我的行星拥有基本的圆形轨道,我希望使我的模型尽可能逼真。我查阅了维基百科和一些文章,但这些都相当高级。
我并不在意数千万年的轨道,我只想要一个接近逼真的模型,来演示以下内容:
1. 正确的椭圆轨道 2. 倾角 3. 动态变化的速度(在近日点时更快)
我想知道是否有足够复杂的方式来计算我行星在给定的t(动态变化)下的x、y、z坐标,可能需要使用轨道元素。
希望我表达的清楚明白。谢谢。

你尝试过什么?你已经说出了你需要的东西。给定 t,计算 x、y、z。一个圆可以定义为满足方程 x = r cos(t) y = r sin(t) 的所有点的轨迹。 - jose
我的当前代码看起来是这样的: mercury.position.x = 20Math.cos(t) + 0; mercury.position.z = 20Math.sin(t) + 0;但是这些轨迹只是圆圈,我想为模型添加一些物理效果,我觉得也许有一个使用轨道要素的方程更适合这个任务。你知道有一个漂亮又简单的东西可以解决所有问题吗 :) - Alex Pyzhianov
1
你需要多准确的结果呢?NASA使用基于牛顿引力的迭代过程计算轨道轨迹,但这对水星不起作用。如果你想要水星的精确度,你需要使用广义相对论——10个链接的偏微分方程,有许多有效的解决方案。或者你可以找到一本年历,画出位置。 - user1864610
并非NASA级别的准确,我只是想展示一般轨道运动原理的可视化。没想到它如此复杂。 - Alex Pyzhianov
倾斜度和轨道形态是我认为我可以做到的,但例如在近日点加速使我感到困惑。 - Alex Pyzhianov
你对物理学和天体力学的理解如何? - duffymo
3个回答

1

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

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

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


1
如果您只需要显示一些关键元素的近似值,那么可以尝试为所有行星在几年的周期内计算查找表。例如,海王星的公转周期为164年,因此在该周期内每个月计算所有行星的位置应该会得到一个相对可管理的表格。要获得轨道速度变化的视觉表示,您需要更细致的分辨率。计算完成后,您只需构建一个动画来绘制这些位置。
这些计算非常复杂。我不会在这里重复计算 - 它太长了 - 但您可以在这里找到一个很好的描述,以及用QBasic编写的示例程序。
主要步骤是:
- 找到行星在其轨道上的位置 - 找到自元素日期以来的天数 - 从平均经度和日运动中找到平均偏差 - 使用中心方程找到真偏差 - 找到行星的半径矢量
将该位置参考于黄道 - 因此找到行星的日心黄道坐标。
一旦您获得了日心坐标,请将其转换为自己的参考系(链接页面显示了如何对地心坐标进行此操作,但这并没有什么用。您需要自己解决这个问题)。将坐标添加到您的表中。
您可以尝试实时运行计算,这将更加灵活,但可能会限制帧速率。这里可能需要进行一些实验。
感谢Keith Burnett(链接页面的作者)提供以上内容的详细信息。

1

以下是用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;
}

附言:虽然你的问题特别涉及到javascript,但我并不觉得给你c++代码有什么错 - 我认为你真正需要的是这个公式。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接