Які методи фізичного моделювання найбільш підходять для дійсно великого часу дельти (годин до тижнів)?
Крім того, чи зіткнулись би я з якимись проблемами поєднання різних методів у великі та малі дельти?
Які методи фізичного моделювання найбільш підходять для дійсно великого часу дельти (годин до тижнів)?
Крім того, чи зіткнулись би я з якимись проблемами поєднання різних методів у великі та малі дельти?
Відповіді:
Ви, ймовірно, будете використовувати постійне прискорення для цих великих часових проміжків (що може бути нульовим прискоренням). Похідна постійного прискорення відносно часу дорівнює 0. Це означає, що вона не змінюється щодо часу, тому не має значення, наскільки великий ваш дельта-час.
Ця невелика інтеграція щодо часу надає потрібні рівняння.
a = a
v = at + v0
s = .5at^2 + v0*t + s0
Де: a = прискорення, v = швидкість, v0 = початкова швидкість, s = положення, s0 = початкове положення, t = час
Використовуючи цю стратегію, ви можете використовувати часові проміжки від мілісекунд до тижнів, якщо цього хочете. Поєднуючи їх, слід було б подбати про параметри рівняння v0
та s0
параметри.
Щоб вирішити зіткнення, вам доведеться реалізовувати стратегії, подібні до тих, що застосовуються для швидких дрібних об'єктів . Спочатку обчислюємо нову позицію за допомогою рівняння, поданого вище, потім переміщуючи між старим і новим положенням для всіх об'єктів. Оскільки будь-який з цих об'єктів міг перетинатися один з одним (хвилин або дні раніше), це може стати дуже складним. Цілком імовірно, що, оскільки у вас такі великі дельти, сподіваємось, у вас буде достатньо часу, щоб обробити ці можливі зіткнення.
Давайте візьмемо приклад із силою тяжіння.
У нижченаведеній функції припустимо, що у нас є змінні учасники класу для положення та швидкості. Потрібно оновлювати їх завдяки силі тяжіння кожні dt секунди.
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
Оскільки dt
стає все менше і менше, наше моделювання стає все більш точним (хоча якщо воно dt
стає занадто малим, то ми можемо зіткнутися з помилками точності при додаванні крихітних чисел до великих чисел).
В основному, ви повинні вирішити максимум, dt
з яким зможете справлятися з імітацією, щоб отримати досить хороші результати. І якщо те, dt
що входить, занадто велике, то просто розбийте моделювання вниз на більш дрібні кроки, де кожен крок - це максимум, dt
який ви дозволяєте.
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
// this is the function we call. The above function is a helper to this function.
void updateLargeDt( float dt )
{
const float timeStep = 0.1;
while( dt > timeStep )
{
update( timeStep );
dt -= timeStep ;
}
update( dt ); // update with whatever dt is left over from above
}
Таким чином, за допомогою цієї стратегії ви можете просто налаштуватись timeStep
на будь-яку вірність, яка вам потрібна (зробити це секундою, хвилиною, годиною чи будь-чим, що потрібно для отримання точного уявлення про фізику.
Більшість ігор, як правило, використовують простий метод Ейлера інтеграції вперед (тобто інтегрувати швидкість у положення з часом і інтегрувати прискорення у швидкість). На жаль, метод Ейлера підходить лише для дуже невеликих часових масштабів і коротких пробігів.
Існують більш складні методи, більш точні протягом дуже тривалих масштабів часу. Найпопулярніший і найпростіший в реалізації - можливо, Runge-Kutte-4 . RK4 визначає позицію в майбутньому шляхом вибірки чотирьох позицій і швидкостей у минулому та інтерполяції. Він, як правило, набагато точніший, ніж метод Ейлера в більш тривалих часових масштабах, але обчислювально дорожчий.
Наприклад, якщо ви хочете обчислити фізику реальної планети на орбіті, оновлюючись кожні кілька днів у режимі реального часу, метод Ейлера призведе до того, що планета вилетить у космос лише через кілька орбіт через чисельні помилки. RK4, як правило, утримує орбіту планети приблизно в однаковій формі тисячі разів, перш ніж накопичити занадто багато помилок.
Однак реалізація зіткнень у RK4 може бути дуже складним ...