Math 二维宇宙飞船运动数学
我正在尝试制作一个自上而下的宇宙飞船游戏,我希望游戏的动作能有些真实。360度惯性、重力等 我的问题是,我可以使船舶以惯性360°移动,没有问题,但我需要做的是,在不限制推动/拉动船舶的其他力的情况下,限制发动机的速度 所以,如果引擎的最大速度是500,并且船从重力井出发的速度是1000,那么当引擎打开时,船不会前进1500,但是如果船偏离了角度,那么它可能会减速 不管它值多少钱,我都在用,我所需要的只是它的数学运算Math 二维宇宙飞船运动数学,math,physics,Math,Physics,我正在尝试制作一个自上而下的宇宙飞船游戏,我希望游戏的动作能有些真实。360度惯性、重力等 我的问题是,我可以使船舶以惯性360°移动,没有问题,但我需要做的是,在不限制推动/拉动船舶的其他力的情况下,限制发动机的速度 所以,如果引擎的最大速度是500,并且船从重力井出发的速度是1000,那么当引擎打开时,船不会前进1500,但是如果船偏离了角度,那么它可能会减速 不管它值多少钱,我都在用,我所需要的只是它的数学运算 谢谢你的帮助,我想弄明白这一点都快秃顶了。你的问题对我来说很难理解,但你似乎没
谢谢你的帮助,我想弄明白这一点都快秃顶了。你的问题对我来说很难理解,但你似乎没有在这个游戏中使用真正的物理。你是否考虑过使用真实的物理方程,如速度、加速度、力等 编辑: 经过你的编辑,我想我有了更好的理解。你们只是简单地跟踪电流的速度(或类似的东西),但你们并没有跟踪速度来源的力。船舶不应存储任何此类信息(发动机推力除外)——这些信息应来自船舶所在的环境 例如,环境具有重力矢量(方向力),因此在计算引擎提供的方向力时,需要将其考虑在内
<>你的船应该储存它自己的引擎力、加速度和速度。 < P>,让我们先考虑现实问题,看看为什么不起作用,以及我们必须如何与它不同。在太空中,只要你的引擎在点火,你就会加速。你的速度只受燃料的限制(事实上,一旦你消耗了一些燃料,你可以加速得更快,因为你移动的质量更小) 为了给这个模型一个有效的最大速度,你可以考虑空间中的粒子使你减速并引起摩擦力。你跑得越快,撞击的粒子越多,撞击的速度也越快,因此最终以足够快的速度撞击足够多的粒子,它们的减速量正好抵消了发动机的加速量 这个真实的模型听起来不像你想要的。原因是:你必须引入摩擦。这意味着如果你关掉引擎,你会自动开始减速。您可能会将其视为您不想要的意外力量之一 这使得我们可以在达到某个速度时将发动机的有效力降至0。现在请记住,如果你以最大速度向北行驶,你仍然希望力能够推动你向东行驶,因此你的发动机不应该仅仅以原始速度切断,而是以你在发动机指向的方向上行驶的速度为基础 因此,对于数学: 您需要在引擎指向向量和速度向量之间做一个交叉点积,以获得引擎指向方向上的有效速度。一旦你有了这个速度,比如125英里/小时(最大速度为150英里/小时),你就可以将你的发动机施加的力缩小到(150-125)/150*(发动机的力) 这将极大地改变你加速到全速所需时间的速度图。当你接近全速时,你的引擎会变得越来越弱。测试一下,看看它是否是你想要的。另一种方法是,如果点积大于等于150,则仅表示发动机的力=0,否则为全力。这将允许您线性加速至最大速度,但不能再加速
现在我想,这个模型并不完美,因为你可以在北面加速到150英里/小时,然后转向东面,在东北方向加速到150英里/小时,总共212英里/小时,所以这不是一个完美的解决方案。你的船需要三个变量,在每个物理时间步,根据作用于它的力来更新它。这些将是质量、位置和速度。(请注意,位置和速度是单个数字,但不是矢量)。在每个物理时间步,根据速度更新位置,根据加速度更新速度。根据作用在船舶上的力(重力、摩擦力、发动机)计算加速度 牛顿的力方程是,我们可以把它重新排列成,得到加速度。基本上,你需要计算出船应该加速多少,以及在哪个方向(矢量),然后把加速度加到船的速度上,把船的速度加到它的位置上 这是你应该执行每个物理时间步的代码(我希望你能填空),请询问这是否不够详细
gravity = //calculate force of gravity acting on ship from Newton's law of universal gravitation
friction = //ten percent of the ship's velocity vector, in the opposite direction
engines = 0
if (engines_are_firing)
engines = 500
forces = gravity + friction + engines
acceleration = forces / ship.mass
ship.velocity += acceleration
ship.position += velocity
redraw()
从中获取页面,其中对象:
(参见我的工作C++代码片段和[Windows只])
void CObject::applyForces()
{
// acceleration: change in velocity due to force f on object with mass m
vector2f dv = f/m;
// new velocity if acceleration dv applied
vector2f new_v = v + dv;
// only apply Lorentz factor if acceleration increases speed
if (new_v.length() > v.length())
{
// maximum speed objects may reach (the "speed of light")
const float c = 4;
float b = 1 - v.length_squared()/(c*c);
if (b <= 0) b = DBL_MIN;
double lorentz_factor = 1/sqrt(b);
dv /= lorentz_factor;
}
// apply acceleration to object's velocity
v += dv;
// Update:
// Allow acceleration in the forward direction to change the direction
// of v by using the direction of new_v (without the Lorentz factor)
// with the magnitude of v (that applies the Lorentz factor).
if (v.length() > 0)
{
v = new_v.normalized() * v.length();
}
}
double lorentz_factor = 1/sqrt(b);
dv /= lorentz_factor;
double reciprocal_lorentz_factor = sqrt(b);
dv *= reciprocal_lorentz_factor;
if (new_v.length_squared() > v.length_squared())
{
const float c = 4;
float b = 1 - v.length_squared()/(c*c);
if (b < 0) b = 0;
double reciprocal_lorentz_factor = sqrt(b);
dv *= reciprocal_lorentz_factor;
}