Math 二维宇宙飞船运动数学

Math 二维宇宙飞船运动数学,math,physics,Math,Physics,我正在尝试制作一个自上而下的宇宙飞船游戏,我希望游戏的动作能有些真实。360度惯性、重力等 我的问题是,我可以使船舶以惯性360°移动,没有问题,但我需要做的是,在不限制推动/拉动船舶的其他力的情况下,限制发动机的速度 所以,如果引擎的最大速度是500,并且船从重力井出发的速度是1000,那么当引擎打开时,船不会前进1500,但是如果船偏离了角度,那么它可能会减速 不管它值多少钱,我都在用,我所需要的只是它的数学运算 谢谢你的帮助,我想弄明白这一点都快秃顶了。你的问题对我来说很难理解,但你似乎没

我正在尝试制作一个自上而下的宇宙飞船游戏,我希望游戏的动作能有些真实。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只])

  • 将常数c设置为对象可以达到的最大速度(游戏中的“光速”)
  • 如果施加力会提高物体的速度,则将加速度(速度变化)除以洛伦兹系数。就狭义相对论而言,if条件并不现实,但它使飞船在高速时更加“可控”
  • 更新:通常情况下,当以接近c的速度行驶时,船舶将很难操纵,因为改变方向需要一个将速度推过c的加速度(洛伦兹系数最终会将新方向上的加速度调整为几乎为零),以恢复可操纵性,使用速度向量在没有洛伦兹缩放的情况下的方向以及缩放速度向量的大小
  • 说明:

    洛伦兹因子的定义,其中v
    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;
        }