Як обчислити падіння і прискорення швидкості?


9

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

Відповіді:


28

Найпростіший спосіб - інтеграція Ейлера. Ви повинні зберігати вектор позиції та вектор швидкості. На кожному кадрі:

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

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

будьте впевнені, що dt невеликий ...

| Г | становить приблизно 9,8 м / с² для землі та близько 1,6 м / с² для Місяця

загалом сила дії, що зумовлена ​​гравітаційною взаємодією, є:

Закон Ньютона про універсальне тяжіння

Це впливає на кожне тіло і вказує на інше.

G скалярний є дуже відомим гравітаційна стала мова йде про 6.67e-011 N (м / кг) ²

Оскільки вас цікавить прискорення:

Прискорення

Вам потрібно лише знати масу планети (м2) та радіус (r), щоб обчислити ваше прискорення.

Зазвичай прискорення, яке рухає планету до вашого космічного корабля, незначне, тому що зазвичай m1 незначний порівняно з м2.

Однак якщо ви намагаєтеся приземлитися до маленького астероїда, вам, ймовірно, доведеться використовувати загальну формулу, додаючи цю силу до загального вектора сили на другому кроці.

Редагувати:

Як вимагається деякий натяк на реалізацію. Ви будете потребувати:

  • Векторна бібліотека
  • Модель двигуна
  • Модель фізики
  • Виявлення зіткнення
  • Інтерфейс користувача (введення та графічне відображення)

Перш за все, векторна бібліотека: ваша гра може бути моно / бі / деревом / чотирма ... мірними, наскільки ви вважаєте, що ваш випадок є проекцією 3D-слова, фізичні рулі мають місце.

Якщо n - розмір, який ви обираєте (можливо, 2 або 3 у вашому випадку), бібліотека повинна мати:

  • векторного об'єкта зберігання (список n номерів з плаваючою комою для кожного вектора)
  • оператор суми (складова суми за складовою)
  • скалярний оператор множення (кожен компонент, помножений на поплавок)
  • кратне множення між векторами (мультиплікаційний компонент на компонент і підсумовувати всі)
  • довжина вектора (квадратний корінь векторної крапки, приглушеної самим собою)

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

Кожен двигун повинен бути описаний:

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

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

Помножте коефіцієнт двигуна на його вектор тяги, щоб отримати реальну довіру двигуна та підбити підсумки всіх доступних двигунів; це дасть вам F другого кроку.

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

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

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

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


Це чудово, але деякі ідеї, як ввести його в код, були б чудовими.
Дволе

1
де я навчився фізиці shiffman.net/teaching/nature
Ming-Tang

Цей хлопець знає свою фізику!
MGZero

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!
        }
    }
}

2
Зберігати це просто. Я очікую, що це уздовж того, що він шукав.
Беска

2

На жаль, математика тут стає волохатою. Відповідь FxIII чудова для загального випадку падаючого об'єкта, але ви говорите про ракету - і ракети спалюють паливо.

Я бачив код, який це робить, але він був повністю недокументований, і мені так і не вдалося з'ясувати математику за ним. Якщо ви не обмежені процесором, я б не заважав і просто жорстоко змусив це - FxIIIs підхід застосовується на досить короткому часовому шкалі та регулює тягу (або використання палива, якщо ви вважаєте, що ракета відкидається назад, коли паливо згорає для підтримки задане прискорення, а не задана тяга) між кожною ітерацією, коли ракета спалює паливо.


Вихід з палива просто представляє падіння параметра. Це просто векторна сила зі зменшенням значення. Я помиляюся? У простому випадку у вас є G проти F, де F - двигун ракети, а G - земна гравітація: у цьому випадку вам просто потрібно виміряти обидва один проти одного, тому якщо палива не залишилося F падає до 0, тож ви тільки повинні застосувати G як векторальну силу до вашого об'єкта. Працює на кожне значення F. Поки F> = G об'єкт "повинен" рухатися у напрямку F.
daemonfire300

2
@ daemonfire300: Ви неправильно розумієте - я кажу не про ефект закінчення палива, а про ефект спалювання палива. Постійне налаштування дросельної заслінки на вашому двигуні створює цифру прискорення, що постійно піднімається, постійне прискорення створює постійно зменшується швидкість спалювання палива. Це означає, що прості розрахунки, які дає FxIII, дадуть неправильні цифри використання палива.
Лорен Печтел

Кількість посилення прискорення від A = F / M під час спалювання палива буде незначною величиною, якщо будь-яка частка паливної маси в транспортному засобі не є абсурдно високою або швидкість спалювання палива не є аналогічно високою. Це гра, зрештою.
Патрік Хьюз

@Patrick Hughes: Кількість пального, яку перевозить будь-який справжній ракетний приземлювач (я не рахую гібридних випадків Марса аерогальма / ракетний гібрид) - це значна частина його загальної ваги. Якщо припустити, що паливо: фіксується коефіцієнт прискорення, це дасть дуже неправильну відповідь.
Лорен Печтел

1
Це не відповідь на питання, а лише коментар до відповіді @ FxIII.
Джонатан Коннелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.