Методи фізичного моделювання для великих дельтових часів?


9

Які методи фізичного моделювання найбільш підходять для дійсно великого часу дельти (годин до тижнів)?

Крім того, чи зіткнулись би я з якимись проблемами поєднання різних методів у великі та малі дельти?


1
Це багато в чому залежить від вашої цільової області. Важко нічого не сказати, не знаючи більше про тебе справжніх цілей. Занадто широкий.
Кромстер

Це питання пов'язане.
Анко

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

якщо ви імітуєте хмарні рухи або термодинамічні змінні в осередках завширшки сотень метрів з тривалістю 10 хвилин, це розумно. але жорстке тіло в звичайних масштабах, не дуже. що таке додаток?
v.oddou

Додаток - це механізм «догнати», де виконується моделювання з моменту останнього завантаження (частини світу), логіка гри - це все на основі зворотного виклику, де зворотні виклики є таймерами або зворотними зворотами зіткнення, я хочу мати можливість переходити фізику до наступного таймер зворотного виклику, і фізичне моделювання вирішує питання зворотного виклику зіткнення. Зіткнення відносно малоймовірні, але я хотів би, щоб зворотні виклики зіткнення мали доступний стан гри (фізики) на момент зіткнення.
fread2281

Відповіді:


5

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

Ця невелика інтеграція щодо часу надає потрібні рівняння.

a = a
v = at + v0
s = .5at^2 + v0*t + s0

Де: a = прискорення, v = швидкість, v0 = початкова швидкість, s = положення, s0 = початкове положення, t = час

Використовуючи цю стратегію, ви можете використовувати часові проміжки від мілісекунд до тижнів, якщо цього хочете. Поєднуючи їх, слід було б подбати про параметри рівняння v0та s0параметри.

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


як щодо зіткнень?
fread2281

Я оновив відповідь, щоб включити стратегії поводження зіткненнями.
MichaelHouse

це помилково. Як відомо, інтеграція Ейлера відхиляється від постійних інтеграцій, тоді як Верлет (або RK2, RK4) цього не робить.
v.oddou

@ v.oddou Враховуючи, що ці симуляції призначені для ігор, я не думаю, що потрібна точність, яку ви потребуєте. Додаткова складність та складність додавання зіткнень для Verlet робить інтеграцію Ейлера найкращим вибором.
MichaelHouse

2

Давайте візьмемо приклад із силою тяжіння.

У нижченаведеній функції припустимо, що у нас є змінні учасники класу для положення та швидкості. Потрібно оновлювати їх завдяки силі тяжіння кожні 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 на будь-яку вірність, яка вам потрібна (зробити це секундою, хвилиною, годиною чи будь-чим, що потрібно для отримання точного уявлення про фізику.


1

Більшість ігор, як правило, використовують простий метод Ейлера інтеграції вперед (тобто інтегрувати швидкість у положення з часом і інтегрувати прискорення у швидкість). На жаль, метод Ейлера підходить лише для дуже невеликих часових масштабів і коротких пробігів.

Існують більш складні методи, більш точні протягом дуже тривалих масштабів часу. Найпопулярніший і найпростіший в реалізації - можливо, Runge-Kutte-4 . RK4 визначає позицію в майбутньому шляхом вибірки чотирьох позицій і швидкостей у минулому та інтерполяції. Він, як правило, набагато точніший, ніж метод Ейлера в більш тривалих часових масштабах, але обчислювально дорожчий.

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

Однак реалізація зіткнень у RK4 може бути дуже складним ...

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