如何计算下降和加速速度?


9

我正在考虑制作一款着陆游戏,您可以在其中控制一艘太空船,并且需要在不坠毁的情况下着陆。有什么简单的公式来计算相对于工作时间引擎的下降或加速速度?

Answers:


28

最简单的方法是Euler积分。您必须存储位置向量和速度向量。在每一帧:

  • 测量自上一个积分步骤以来的时间:dt
  • 计算您的引擎应得的力vecor:F
  • 计算加速度矢量:A = F / m,其中m是宇宙飞船的质量。
  • 添加重力矢量:A = A + G确保G指向行星的中心
  • 更新速度矢量V = V + A · dt
  • 更新位置向量X = X + V · dt

x表示标量,x表示矢量)

确保dt很小...

| G | 地球约为9.8 m /s²,月亮约为1.6 m /s²

通常,重力相互作用引起的吸引力为:

牛顿万有引力定律

它影响每个身体,并且指向另一个身体。

所述ģ标量是非常著名的万有引力常数是大约6.67e-011 N(米/千克)²

由于您对加速感兴趣:

加速

您只需要知道行星的质量(m2)和半径(r)即可计算出加速度。

通常,将行星移向您的飞船的加速度可以忽略不计,因为与m2相比,通常m1可以忽略不计。

但是,如果您试图降落到小行星上,则可能必须使用通用公式,才能在第二步中将该力添加到总力向量中。

编辑:

根据需要提供一些实施提示。你会需要:

  • 矢量库
  • 引擎型号
  • 物理模型
  • 碰撞检测
  • 用户界面(输入和图形渲染)

首先,向量库:您的游戏可以是mono / bi / tree / four ...三维游戏,只要您认为案例是3D单词的投射,就可以使用物理规则。

如果n是您选择的尺寸(在您的情况下,可能是2或3),则该库必须具有:

  • 向量存储实体(每个向量的n个浮点数的列表)
  • 一个求和运算符(逐个部分求和)
  • 标量乘法运算符(每个分量乘以浮点数)
  • 向量之间的点乘法(逐个分量相乘并求和)
  • 向量长度(由点自身离散的向量的平方根)

您可以使用执行此操作的库,也可以自己实现。向量可以是结构或类,选择由您选择。

每个引擎的描述方式如下:

  • 指示其推力强度和方向的向量
  • 标明在满功率时每秒的燃料使用量的标量;

您的用户输入将用于为每个引擎提供一个介于0(未使用的引擎)和1(满功率)之间的数字:引擎(使用)系数。

将发动机因子乘以其推力矢量以获得发动机真实信任并汇总所有可用发动机的所有结果;这将为您提供第二步的F。

您的发动机系数可以用来了解每个发动机的实际燃油消耗量:将发动机系数乘以燃油消耗量并乘以dt可以知道瞬时燃油消耗量;您可以从总燃料容量变量中减去该值(如果燃料质量相当大,这使您有机会更新总质量m)。

现在,您可以继续使用积分来计算新位置,检查与您的行星表面的碰撞;如果有的话,使用速度矢量的长度来说明降落是成功还是灾难。

显然可以/应该进行其他碰撞检查,不允许某些表面实体作为着陆点,因此每次碰撞都是致命的。

我将介绍如何获得输入以及如何将飞船呈现给您。例如,您可以使用引擎系数逐帧渲染引擎状态。


很好,但是一些想法可以在代码中实现它。
德沃

1
我在那儿学习物理shiffman.net/teaching/nature
Ming-Tang

这个家伙知道他的物理学!
MGZero 2011年

7

由于另一个很好的答案似乎有点理论化,因此这里是简单的代码版本:

// Position of the lander:
var positionX =  100.0;
var positionY = 100.0;

// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;

// Acceleration due to gravity
var gravity = 1.0;

// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;

// Thrust acceleration
var thrust = -2.0;

// Vertical position of the ground
var groundY = 200.0;

// Maximum landing velocity
var maxLandingVelocity = 3.00;    

onUpdate()
{
    velocityY += gravity;

    positionX += velocityX;
    positionY += velocityY;

    if (isThrusting)
    {
        velocityY += thrust;
    }

    if (isThrustingLeft)
    {
        velocityX += thrust;
    }
    else if (isThrustingRight)
    {
        velocityX -= thrust;
    }

    if (positionY >= floorY)
    {
        if (velocityY > maxLandingVelocity)
        {
            // crashed!
        }
        else
        {
            // landed successfully!
        }
    }
}

2
保持简单。我希望这符合他的要求。
Beska

2

不幸的是,这里的数学比较繁琐。FxIII对于坠落物体的一般情况是很好的答案,但是您在谈论的是火箭-火箭会燃烧掉燃料。

我已经看到了执行此操作的代码,但是它完全没有文档记录,而且我从未设法弄清其背后的数学原理。除非您受CPU限制,否则我不会打扰它,也不会蛮力地使用它-FxIIIs方法在很短的时间范围内应用并调整推力(如果您认为火箭在燃料燃烧掉以维持燃料时又回退,则它会消耗燃料)在每次迭代之间指定的加速度,而不是指定的推力),因为火箭会消耗掉燃料。


缺油仅表示下降参数。它只是值减小的矢量力。我错了吗?在一个简单的例子中,您有G相对于F,其中F是火箭的引擎,G是地球的重力:在这种情况下,您只需要彼此相对进行测量,因此,如果没有剩余燃料,F会降为0,所以您只必须向物体施加G作为矢量力。作品为F.作为每一个值长为F> = G对象“应”在移动F的方向
daemonfire300

2
@ daemonfire300:您误会了-我不是说用尽燃料,而是燃烧燃料。发动机上恒定的油门设置会产生持续上升的加速度,恒定的加速度会导致燃料燃烧率持续下降。这意味着FxIII给出的简单计算将产生不正确的燃料使用数字。
洛伦·佩希特尔

除非燃料质量与车辆的比例过高或燃料燃烧率类似地高,否则当燃料燃烧时从A = F / M获得的加速增益量将可忽略不计。毕竟这是一个游戏。
Patrick Hughes

@帕特里克·休斯(Patrick Hughes):任何真正的火箭着陆器所携带的燃料量(我不算火星的航空制动/火箭混合动力箱)占其总重量的很大一部分。假设燃油:加速比固定,将产生非常错误的答案。
洛伦·佩希特尔

1
这不是问题的答案,只是对@FxIII答案的评论。
乔纳森·康奈尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.