让我们乘坐火星着陆器前往火星

作者: Dave Taylor

这是一系列文章的开篇,在这些文章中,我将开发一个以火星为主题的经典月球着陆器游戏的变体。以三维方式做到这一点可能相当复杂,因此本着最初的街机游戏(我应该承认,我对此非常着迷)的精神,我将解决简化的二维问题。我还将忽略地形问题,尽管显然降落在神秘的火星运河的边缘比在夏帕雷利陨石坑的平原上要棘手得多。

哦,还有,我根本不会有任何图形。这将是一个游戏,您需要每秒输入推力指令,要么射入轨道并平稳地降落在火星表面,要么坠入星球。您想添加图形吗?太棒了。但我将把它作为留给您,读者的练习,因为这对于这个 shell 脚本专栏来说太离题了。

引力数学

在不谈论物理学的情况下,我无法开始火星着陆器,因为正是牛顿定律(它们不仅仅是一个好主意!)描述了一个物体进入另一个物体的引力场并被拉向其中心的过程。

牛顿引力公式是 F = G m1 m2 / r2,其核心思想是宇宙中的每个物体都以与它们质量的乘积成正比,并且与两个物体之间距离的平方成反比的力吸引着其他每个物体。

但是,我不会担心其他行星,因为遥远物体对试图在火星上着陆的飞船的引力可以忽略不计(至少可以说)。行星和宇宙飞船之间的质量差异也非常巨大,这使我可以简化公式:速度 = 重力 * 时间

如果我从静止的直升机(或从建筑物侧面)掉落物体,在第 0 秒,它将以 0 英尺/秒的速度下落。一秒后,它的速度将达到 32 英尺/秒,十秒后,它的速度将达到 320 英尺/秒。我忽略了空气阻力等等,但这个例子是关于宇宙飞船在火星上着陆,所以这里真的没有太多大气需要担心。

下一个问题是物体在指定秒数内下落了多远?这是一个更复杂的方程:距离 = ( 重力 * 时间**2 ) / 2

因此,在相同的十秒后,物体将下落 (32 * (10**2))/2 = 1600 英尺。如果我从地表上方一英里处开始在地球上降落,这意味着在没有任何火箭减速的情况下,只需 18 秒多一点就会坠毁。

然而,火星的引力与地球不同。地球为 32.1 英尺/秒,而火星仅占我们地球质量的 15%,引力为 12.1 英尺/秒。

这意味着从一英里的轨道轨迹来看,坠入行星表面需要更长的时间——几乎 30 秒。这有更多的时间来思考为什么您忘记在火星着陆器上添加推进器,这是肯定的!

这个游戏还需要第三个方程:水平速度。其思想是着陆器将从轨道开始,因此它将具有初始水平速度,但没有垂直速度。火箭助推器可以转动到特定角度并发射,因此只要付出适当的努力,您就可以完全停止水平运动,从而使飞行器直接下降到行星上——这是一件好事,因为以很大的水平运动撞击表面将会坠毁!

在这种情况下,公式非常简单,因为没有任何力“拉动”飞行器绕行星加速,也没有任何力(例如风阻)使其减速。因此,如果飞行器以 100 英尺/秒的水平速度开始,如果推进器不使其减速,它将以完全相同的速度着陆。

为了简单起见,我将使用的公式是 speedH = 初始速度 – 推力。因此,要停止所有水平速度,只需要与当前速度完全匹配的爆发即可。我假设这一切基本上是瞬间发生的。

但是,推进器可以在 90° 旋转范围内运行,范围从垂直向下(全部垂直推力,对水平速度没有影响)到垂直向前(全部水平推力,对垂直下降没有影响)。你如何建模?这是我对公式的尝试,零度向下,90 度向前

  • thrustH = 推力 * (角度 / 90)

  • thrustV = 推力 * (1 – (角度 / 90))

因此,在 45° 时 100fps 的推力应达到平衡,100*(45/90) = 50fps100 * (1 – (45/90)) = 50。好的。10° 推力呢?ThrustH = 11.11 fps,ThrustV = 88.88 fps。

从数学构建程序

现在我有了所需的基本数学知识,请记住,每秒时间都会增加(重力)朝向火星表面的垂直加速度。为了让这更有趣,我假设一英里标记是火星引力的边缘,因此如果在任何时候飞行器距离表面超过一英里,它就会迷失在深空中。

您可以简单地以与重力完全相同的力燃烧反向火箭,直到在表面着陆为止,但当然,您没有那么多燃料(可预测的!)。火箭助推器也存在限制:不允许超过 100fps 的爆发,否则会撕裂着陆器,这绝对不是期望的结果!

这意味着您不能等到最后一秒才在坠毁前猛烈地爆发 巨大 的火箭动力——更不用说 g 力会有点问题!

让我们开始将所有内容整合在一起。在任何给定的秒数,您都可以选择发射推进器、发射多少以及应以什么角度发射。与此相反,在任何给定的秒数,您都将拥有水平和垂直速度以及垂直引力。像这样

  • thrustH = 推力 * (角度 / 90)

  • thrustV = 推力 * (1 – (角度 / 90))

  • velocityH = velocityH – thrustH

  • velocityV = (velocityV + gravity) – thrustV

初始值为 thrust = 0,angle = 0,velocityH = 100(为简单起见,所有单位均为英尺/秒),velocityV = 0。火星上的重力 = 12.1。

还需要另一个公式,那就是高度。然后在任何给定的秒数,高度 = 高度 – (velocityV)

如果飞行器从火星表面上方 5280 英尺处开始,那么在第零秒

  • thrustH = 0

  • thrustV = 0

  • velocityH = 100

  • velocityV = 0

  • height = 5280

并且,在第一秒,假设您以 45 度角以 20fps 的速度发射推进器一秒钟

  • thrustH = 20 * ( 45/90 ) = 10

  • thrustV = 20 * ( (1 – (45/90) ) = 10

  • velocityH = (100 – 10) = 90

  • velocityV = (0 + 12.1 – 10) = 2.1

  • height = (5280 – 2.1) = 5278.9

明白这是如何工作的吗?一旦您完成所有基本计算,这还不错。

在经历了所有这些物理学和数学之后,在我的下一篇文章中,我将开始编码,因为这将非常简单。敬请关注!

注意:感谢我的朋友 Brad Waller 指出我的物理建模中的所有主要过度简化。我的辩护是这只是一个游戏,我坚持这一点,所以深吸一口气,物理学书呆子们。

Dave Taylor 长期以来一直在 UNIX 和 Linux 系统上编写 shell 脚本。他是 Learning Unix for Mac OS XWicked Cool Shell Scripts 的作者。您可以在 Twitter 上找到他 @DaveTaylor,您可以通过他的技术问答网站联系他:Ask Dave Taylor

加载 Disqus 评论