gpt4 book ai didi

math - 2D 飞船运动数学

转载 作者:行者123 更新时间:2023-12-03 10:41:22 24 4
gpt4 key购买 nike

我正在尝试制作一个自上而下的宇宙飞船游戏,我希望运动有点逼真。 360 度与惯性、重力等。

我的问题是我可以让船在惯性下 360° 毫无问题地移动,但我需要做的是限制发动机的速度,同时不限制推/拉船的其他力。

因此,如果发动机速度最大为 500 并且船从重力井行驶 1000,那么当发动机打开时,船不会行驶 1500,但是如果指向远离角度的方向,那么它可能会变慢下。

对于它的值(value),我正在使用 Construct ,而我所需要的只是它的数学。

感谢您的帮助,我想弄清楚这一点,我就要秃顶了。

最佳答案

relative physics 取一页,其中对象 cannot exceed the speed of light :

(有关我的工作 C++ 代码片段和 running demo [仅限 Windows],请参见下文。)

  • 将常数 c 设置为物体可以达到的最大速度(游戏中的“光速”)。
  • 如果施加力会增加物体的速度,请将加速度(速度变化)除以洛伦兹因子。 if 条件在狭义相对论方面是不现实的,但它使船在高速下更“可控”。
  • 更新:通常情况下,船在以接近 c 的速度行驶时将很难操纵,因为改变方向需要一个将速度推过 c 的加速度(洛伦兹因子最终会将新方向上的加速度缩放到几乎为零。)为了重新获得机动性,使用速度矢量在没有洛伦兹缩放的情况下的方向与缩放速度矢量的大小。

  • 说明:

    洛伦兹因子的定义,其中 v 是速度,c 是光速: gamma = 1 / sqrt(1 - v^2 / c^2)

    这是有效的,因为随着速度的增加洛伦兹因子接近无穷大。物体需要施加无限大的力才能跨越光速。在较低速度下,洛伦兹因子非常接近 1,接近经典牛顿物理学。

    洛伦兹因子随速度增加的图形:

    alt text

    注意:我之前尝试通过摩擦设置来解决我的小行星游戏中的类似问题。我刚刚在阅读您的问题时想出了这个解决方案^^

    更新:我尝试实现这一点并发现了一个潜在的缺陷:当接近光速 c 时,所有方向的加速度都受到限制,包括减速! (违反直觉,但在现实世界中狭义相对论会发生这种情况吗?)我想可以修改该算法以考虑速度和力矢量的方向... 该算法已被修改以考虑矢量的方向,因此船舶在高速时不会“失去可控性”。

    更新:这是我的小行星游戏的代码片段,它使用洛伦兹因子来限制游戏对象的速度。它工作得很好!

    更新:* 添加 downloadable demo (仅限 Windows;从其他平台的源代码构建)此算法的实际应用。 我不确定 zip 中是否包含所有依赖项;如果有什么遗漏,请告诉我。玩得开心^^
    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();
    }
    }

    关于math - 2D 飞船运动数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890520/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com