在Unity2D中努力将笛卡尔元素转换为轨道元素+开普勒解决二体问题

问题描述 投票:0回答:1

我正在构建一个游戏,在 Unity 2D C# 中模拟行星轨道。我以前使用过牛顿万有引力定律,但很快发现浮子中的舍入误差可能会在数百或数千次轨道后导致巨大的轨道漂移。这对我来说是一个大问题,因为我需要每次模拟都尽可能一致。我没有尝试重写物理系统以使用双精度数而不是浮点数来使事情变得非常复杂,而是对开普勒轨道和二体问题进行了一些研究。

开普勒轨道的实现比牛顿轨道复杂得多,我正在努力寻找有关如何执行以下操作的资源:

  • a) 使用开普勒元素在较长时间内准确模拟二维轨道。
  • b) 将刚体当前位置和速度(笛卡尔元素)转换为开普勒轨道元素,这样我就可以根据外部因素对轨道模拟进行更改,例如向刚体施加力、碰撞或另一个吸引刚体的引力体(例如月亮什么的)。

我不太擅长直观地理解又长又复杂的方程,所以如果您可以在答案中使用有意义的变量名称并尝试解释每个代码块的作用,我会很感激。我希望能够理解代码,而不仅仅是复制和粘贴解决方案,因为我将来可能必须回来进行调整。

c# unity-game-engine physics cartesian-coordinates orbital-mechanics
1个回答
0
投票

这里发生了很多事情,恐怕我没有足够的关于您的具体用例的信息来给您一个明确的答案。

我将专门解决您问题(a)中的“长时间”部分。

听起来您对开普勒轨道和二体问题的所有研究都是为了创建一个不会随着时间的推移而产生误差的轨道模拟。将所有坐标更改为开普勒元素不会为您解决这个问题,使用双精度数代替浮点数也不会解决这个问题。

除非模拟中的每个物体仅受到单个物体引力的影响(例如,对太阳系进行建模时仅考虑太阳对行星的引力,并忽略它们对太阳和彼此的作用力),这不会给你你正在寻找的东西。听起来这种限制对你来说是不行的。如果您认为可以接受此约束,那么您可以使用开普勒轨道的精确解析解

如果没有这个限制,你几乎会陷入使用数值解的困境。数值方法有误差。这是一个无法回避的事实。用计算物理术语来说,实时物理引擎(例如 Unity 中的 PhysX)大多被美化为“欧拉方法模拟”。 有多种方法可以减轻欧拉模拟固有的误差。最简单的方法是通过增加 Unity 的物理帧速率/固定时间步长来减小模拟步长。可以通过为每帧应用于刚体的重力添加校正项来实现更复杂的方法,例如 Runge-Kutta 方法

tl;dr:

首先,确定您是否同意必须遵守的约束才能使用精确的解决方案。如果你不知道,那么就开始研究数值模拟方法中的误差修正。

© www.soinside.com 2019 - 2024. All rights reserved.