2D математика перемещения Космического корабля

Я пытаюсь сделать нисходящую игру космического корабля, и я хочу перемещение к несколько реалистическому. 360 градусов с инерцией, силой тяжести, и т.д.

Моя проблема, я могу заставить поставку переместить 360 ° с инерцией без проблемы, но что я должен сделать, накладывают ограничение для того, как быстро механизмы могут пойти, не ограничивая другие силы, продвигающие/вытягивающие поставку.

Так, если скорость механизмов является максимумом 500, и поставка идет 1000 от силы тяжести хорошо, поставка не собирается идти 1500, когда это - механизмы, идут, но если указывает далеко от угла, идет затем, это могло бы замедлиться.

Если это имеет значение я использую Конструкцию и все, в чем я нуждаюсь, математика его.

Спасибо за любую справку я лысею от попытки понять это.

25
задан Josh Lee 23 May 2010 в 13:33
поделиться

4 ответа

Возьмите страница из относительной физики , где объекты не могут превышать скорость света :

(См. ниже мой рабочий фрагмент кода C ++ и работающую демонстрацию [только для Windows ].)

  1. Установите константу c на максимальную скорость, которую может достичь объект («скорость света» в вашей игре).
  2. Если приложение силы увеличивает скорость объекта, разделите ускорение (изменение скорости) на коэффициент Лоренца. Условие if нереально с точки зрения специальной теории относительности, но оно позволяет кораблю более "управляемым" на высоких скоростях.
  3. Обновление: Обычно кораблю будет трудно маневрировать при движении со скоростью, близкой к c, потому что изменение направления требует ускорения, которое увеличивает скорость выше c (фактор Лоренца в конечном итоге приведет к уменьшению ускорения в новом направлении почти до нуля). для восстановления маневренности используйте направление, в котором вектор скорости был бы без масштабирования Лоренца с величиной масштабированного вектора скорости.

Пояснение:

Определение фактора Лоренца, где v - скорость, а c - скорость света: gamma = 1 / sqrt(1 - v^2 / c^2)

Это работает, потому что фактор Лоренца приближается к бесконечности с увеличением скорости. Объектам потребуется приложить бесконечное количество силы, чтобы пересечь скорость света. При более низких скоростях фактор Лоренца очень близок к 1, приближаясь к классической ньютоновской физике.

График коэффициента Лоренца при увеличении скорости:

alt text

Примечание: я ранее пытался решить аналогичную проблему в моей игре с астероидами, играя с настройками трения. Я только что придумал это решение, когда прочитал ваш вопрос ^^

Обновление: Я попытался реализовать это и обнаружил один потенциальный недостаток: ускорение во всех направлениях ограничивается по мере приближения к скорости света c, включая замедление! (Противоинтуитивно, но происходит ли это со специальной теорией относительности в реальном мире?) Я предполагаю, что этот алгоритм можно было бы изменить, чтобы учесть направления векторов скорости и силы ... Алгоритм был изменен с учетом направления векторов, чтобы корабль не «терял управляемость» на больших скоростях.

Обновление: Вот фрагмент кода из моей игры «Астероиды», в которой используется фактор Лоренца для ограничения скорости игровых объектов. Работает очень хорошо!

обновление: * добавлена ​​ загружаемая демоверсия (только для 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();
    }
}
25
ответ дан 28 November 2019 в 21:40
поделиться

У вашего корабля должны быть три переменные, которые вы обновляете на каждом временном шаге физики в зависимости от сил, действующих на него. Это будут масса, положение и скорость. (обратите внимание, что положение и скорость являются отдельными числами, но векторами). На каждом физическом временном шаге вы обновляете положение на основе скорости, а скорость - на основе ускорения. вы вычисляете ускорение на основе сил, действующих на корабль (гравитация, трение, двигатели)

Уравнение силы Ньютона F = M * A Мы можем изменить это на A = F / M , чтобы получить ускорение. По сути, вам нужно выяснить, насколько корабль должен ускоряться и в каком направлении (вектор), затем добавить это ускорение к скорости корабля и добавить скорость корабля к его положению.

Вот код, который вы должны выполнять на каждом временном шаге физики (надеюсь, вы сможете заполнить пробелы), пожалуйста, спросите, недостаточно ли этого подробностей

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()
1
ответ дан 28 November 2019 в 21:40
поделиться

Мне сложно понять ваш вопрос, но похоже, что вы не используете настоящую физику для этой игры. Рассматривали ли вы использование реальных физических уравнений, таких как скорость, ускорение, сила и т. Д.?

Редактировать: После ваших правок, я думаю, я лучше понимаю. Вы просто отслеживаете текущую скорость (или что-то подобное), но не отслеживаете силу, от которой исходит эта скорость. Корабль не должен хранить какую-либо эту информацию (кроме тяги двигателя) - она ​​должна поступать из среды, в которой находится корабль.

Например, среда имеет вектор гравитации (направленную силу), поэтому вам необходимо примите это во внимание при расчете направленной силы, создаваемой двигателем.

Ваш корабль должен сохранять собственную мощность двигателя, ускорение и скорость.

0
ответ дан 28 November 2019 в 21:40
поделиться

Что ж, давайте сначала рассмотрим реальную проблему и посмотрим, почему это не работает и чем мы должны от нее отличаться. В космосе, пока работают ваши двигатели, вы будете ускоряться. Ваша скорость ограничена только вашим топливом (и на самом деле вы можете ускориться быстрее, когда израсходуете немного топлива, потому что ваша движущаяся масса меньше).

Чтобы дать этой модели эффективную максимальную скорость, вы можете рассматривать частицы в космосе, которые замедляют вас и вызывают трение. Чем быстрее вы идете, тем больше частиц вы ударяете и тем быстрее вы ударяете по ним, поэтому в конечном итоге на некоторой достаточно быстрой скорости вы будете поражать достаточно частиц, количество их замедления в точности компенсирует количество ускорения вашего двигателя. делается.

Эта реалистичная модель НЕ звучит так, как вы хотите. Причина в том, что вы должны ввести трение.Это означает, что если вы выключите двигатели, вы автоматически начнете замедляться. Вы, вероятно, можете посчитать это одной из непреднамеренных сил, которые вам не нужны.

Это оставляет нам возможность снизить эффективную силу вашего двигателя до 0 при достижении определенной скорости. Теперь имейте в виду, что если ваша максимальная скорость идет в северном направлении, вам все равно нужна сила, чтобы толкать вас в восточном направлении, поэтому ваши двигатели не должны отключаться только по исходной скорости, а вместо этого на основе скорости вашего движется в направлении, указанном вашими двигателями.

Итак, для математики:

Вы хотите произвести скрещивание точечного произведения между вектором направления вашего двигателя и вектором скорости, чтобы получить эффективную скорость в том направлении, в котором указывают ваши двигатели. Как только у вас будет эта скорость, скажем, 125 миль в час (с максимальной скоростью 150), вы можете уменьшить силу ваших двигателей до (150-125) / 150 * (Force of Engines).

Это резко изменит график скорости, показывающий, сколько времени вам потребуется, чтобы разогнаться до полной скорости. По мере приближения к полной скорости ваши двигатели становятся все менее и менее мощными. Проверьте это и убедитесь, что это то, чего вы хотите. Другой подход - просто сказать Force of Engines = 0, если скалярное произведение> = 150, иначе это полная сила. Это позволит вам линейно ускоряться до максимальной скорости, но не дальше.

Теперь, когда я думаю об этом, эта модель не идеальна, потому что вы можете разогнаться до 150 миль в час в северном направлении, а затем повернуть на восток и разогнаться до 150 миль в час, двигаясь в этом направлении, что в сумме составит 212 миль в час в северном направлении. северо-восточное направление, поэтому не идеальное решение.

2
ответ дан 28 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: