Answers:
最简单的方法是Euler积分。您必须存储位置向量和速度向量。在每一帧:
(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),则该库必须具有:
您可以使用执行此操作的库,也可以自己实现。向量可以是结构或类,选择由您选择。
每个引擎的描述方式如下:
您的用户输入将用于为每个引擎提供一个介于0(未使用的引擎)和1(满功率)之间的数字:引擎(使用)系数。
将发动机因子乘以其推力矢量以获得发动机真实信任并汇总所有可用发动机的所有结果;这将为您提供第二步的F。
您的发动机系数可以用来了解每个发动机的实际燃油消耗量:将发动机系数乘以燃油消耗量并乘以dt可以知道瞬时燃油消耗量;您可以从总燃料容量变量中减去该值(如果燃料质量相当大,这使您有机会更新总质量m)。
现在,您可以继续使用积分来计算新位置,检查与您的行星表面的碰撞;如果有的话,使用速度矢量的长度来说明降落是成功还是灾难。
显然可以/应该进行其他碰撞检查,不允许某些表面实体作为着陆点,因此每次碰撞都是致命的。
我将介绍如何获得输入以及如何将飞船呈现给您。例如,您可以使用引擎系数逐帧渲染引擎状态。
由于另一个很好的答案似乎有点理论化,因此这里是简单的代码版本:
// 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!
}
}
}
不幸的是,这里的数学比较繁琐。FxIII对于坠落物体的一般情况是很好的答案,但是您在谈论的是火箭-火箭会燃烧掉燃料。
我已经看到了执行此操作的代码,但是它完全没有文档记录,而且我从未设法弄清其背后的数学原理。除非您受CPU限制,否则我不会打扰它,也不会蛮力地使用它-FxIIIs方法在很短的时间范围内应用并调整推力(如果您认为火箭在燃料燃烧掉以维持燃料时又回退,则它会消耗燃料)在每次迭代之间指定的加速度,而不是指定的推力),因为火箭会消耗掉燃料。