Відповіді:
Найпростіший спосіб - інтеграція Ейлера. Ви повинні зберігати вектор позиції та вектор швидкості. На кожному кадрі:
( x для скалярів, X для векторів)
будьте впевнені, що dt невеликий ...
| Г | становить приблизно 9,8 м / с² для землі та близько 1,6 м / с² для Місяця
загалом сила дії, що зумовлена гравітаційною взаємодією, є:
Це впливає на кожне тіло і вказує на інше.
G скалярний є дуже відомим гравітаційна стала мова йде про 6.67e-011 N (м / кг) ²
Оскільки вас цікавить прискорення:
Вам потрібно лише знати масу планети (м2) та радіус (r), щоб обчислити ваше прискорення.
Зазвичай прискорення, яке рухає планету до вашого космічного корабля, незначне, тому що зазвичай m1 незначний порівняно з м2.
Однак якщо ви намагаєтеся приземлитися до маленького астероїда, вам, ймовірно, доведеться використовувати загальну формулу, додаючи цю силу до загального вектора сили на другому кроці.
Редагувати:
Як вимагається деякий натяк на реалізацію. Ви будете потребувати:
Перш за все, векторна бібліотека: ваша гра може бути моно / бі / деревом / чотирма ... мірними, наскільки ви вважаєте, що ваш випадок є проекцією 3D-слова, фізичні рулі мають місце.
Якщо n - розмір, який ви обираєте (можливо, 2 або 3 у вашому випадку), бібліотека повинна мати:
Ви можете використовувати бібліотеку, яка робить це, або впроваджувати її самостійно; вектор може бути структурою або класом, вибір за вами.
Кожен двигун повинен бути описаний:
ваш вхід користувача буде використовуватися для надання кожному двигуну числа, яке буде між 0 (невикористаний двигун) та 1 (повна потужність): коефіцієнт використання двигуна (використання).
Помножте коефіцієнт двигуна на його вектор тяги, щоб отримати реальну довіру двигуна та підбити підсумки всіх доступних двигунів; це дасть вам F другого кроку.
Ваш коефіцієнт двигуна може бути використаний для того, щоб знати реальне використання палива для кожного двигуна: помножити коефіцієнт двигуна на витрату палива та на dt, щоб знати миттєве споживання палива; Ви можете субстратувати це значення із змінної загальної ємності палива (це дає можливість оновити загальну масу м, якщо маса палива значна).
Тепер ви можете продовжити використання інтеграції для обчислення нового положення, перевірити на зіткнення з вашою поверхнею планети; якщо така є, скористайтеся довжиною вектора швидкості, щоб сказати, чи приземлився успіх чи катастрофа.
Очевидно, що можуть бути / повинні бути зроблені інші перевірки зіткнення, деякі поверхневі об'єкти не можуть бути дозволені як точка посадки, тому кожне зіткнення є фатальним.
Я залишаю, як отримати вхід і як надати вам свій космічний корабель; Ви можете використовувати, наприклад, коефіцієнт двигуна, щоб відобразити кадр стану двигуна за кадром, наприклад.
Оскільки інша відмінна відповідь здається трохи теоретичною, ось проста версія коду:
// 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!
}
}
}
На жаль, математика тут стає волохатою. Відповідь FxIII чудова для загального випадку падаючого об'єкта, але ви говорите про ракету - і ракети спалюють паливо.
Я бачив код, який це робить, але він був повністю недокументований, і мені так і не вдалося з'ясувати математику за ним. Якщо ви не обмежені процесором, я б не заважав і просто жорстоко змусив це - FxIIIs підхід застосовується на досить короткому часовому шкалі та регулює тягу (або використання палива, якщо ви вважаєте, що ракета відкидається назад, коли паливо згорає для підтримки задане прискорення, а не задана тяга) між кожною ітерацією, коли ракета спалює паливо.