Как рассчитать падение и ускоряющую скорость?

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

9 голосов | спросил Dvole 14 J000000Thursday11 2011, 10:58:29

3 ответа


27

Самый простой способ - интеграл Эйлера. Вы должны хранить вектор положения и вектор скорости. В каждом кадре:

  • измерять время, прошедшее с момента последнего шага интеграции: dt
  • вычислить силу vecor из-за ваших двигателей: F
  • вычислить вектор ускорения: A = F / m , где m - масса космического корабля.
  • добавьте вектор силы тяжести: A = A + G убедитесь, что G указывает на центр планеты
  • обновить вектор скорости V = V + A dt
  • обновить вектор положения X = X + V dt

( x для скаляров, X для векторов)

убедитесь, что dt невелик ...

| G | составляет около 9,8 м /с² для земли и около 1,6 м /с² для луны

в целом сила акцепции, обусловленная гравитационным взаимодействием:

Закон всемирного тяготения Ньютона

Он воздействует на каждое тело и указывает на другое.

Скаляр G - очень известная гравитационная константа составляет около 6.67e-011 N (m /Kg) ²

Поскольку вы заинтересованы в ускорении:

Ускорение

Вам нужно знать массу планеты (m2) и радиус (r), чтобы вычислить ваше ускорение.

Обычно ускорение, которое перемещает планету к вашему космическому кораблю, незначительно, потому что обычно m1 пренебрежимо мало по сравнению с m2.

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

EDIT:

По мере необходимости есть некоторые намеки на реализацию. Вам понадобится:

  • Текстовая библиотека
  • Модель двигателя
  • Модель Phisics
  • Обнаружение столкновений
  • Пользовательский интерфейс (входной и графический рендеринг)

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

Если n - это размер, который вы выберете (вероятно, 2 или 3 в вашем случае), библиотека должна иметь:

  • объект хранения вектора (список из n чисел с плавающей запятой для каждого вектора)
  • оператор суммы (сумма компонента по компоненту)
  • скалярный оператор умножения (каждый компонент, умноженный на float)
  • умножение точки между векторами (умножить компонент на компонент и суммировать все)
  • длина вектора (квадратный корень из вектора, укоренившегося сам по себе)

Вы можете использовать библиотеку, которая делает это или реализует ее самостоятельно; вектор может быть структурой или классом, выбор за вами.

Каждый двигатель должен описываться:

  • вектор, указывающий его силу и направление тяги
  • скаляр, который указывает расход топлива в секунду при полной мощности;

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

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

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

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

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

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

ответил FxIII 14 J000000Thursday11 2011, 12:53:42
7

Как другой отличный ответ кажется немного теоретическим, вот простая версия кода:

// 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!
        }
    }
}
ответил Iain 18 J000000Monday11 2011, 14:57:47
2

К сожалению, математика здесь становится волосатой. Ответ FxIII подходит для общего случая падающего объекта, но вы говорите о ракете, а ракеты сжигают топливо.

Я видел код, который делает это, но он был полностью недокументирован, и мне никогда не удалось найти математику за ней. Если вы не ограничены ЦП, я бы не стал беспокоиться и просто грубо заставлял это - подход FxIIIs применялся в довольно коротких временных масштабах и регулировал тягу (или использование топлива, если вы считаете, что ракета дросселирует назад, когда топливо сгорает, чтобы поддерживать указанное ускорение, а не заданное усилие) между каждой итерацией, когда ракета сжигает топливо.

ответил Loren Pechtel 14 J000000Thursday11 2011, 20:29:22

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132