Огляд математичних методів для симуляції світів, які використовуються у геймдеві

Вітаю, мене звати Микита Лужанський, я працюю Unreal Engine Developer у Pingle Game Studio. Сучасний ігробуд неможливо уявити без математики та фізики. Щоб передати реальність на екрані монітору, реальний об’єкт замінюється математичною моделлю, і надалі — моделюванням поведінки об’єкта за допомогою обчислювальних потужностей комп’ютера. Ця стаття — невеликий огляд добре відомих математичних методів для симуляції світів, які використовуються у геймдеві.

Інтегрування рівнянь руху

Відкриємо підручник Бар’яхтара за 10 клас на 46 сторінці та подивимося завдання.

З гелікоптеру на висоті 45 метрів, що рухався зі швидкістю 10 м/с, падає предмет. За який проміжок часу предмет впаде на землю?

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

Розміром об’єкта можна пожертвувати, і ми замінимо його на частинку. Місце у просторі, де знаходиться частинка, завжди можна задати за допомогою координат (x, y, z). Тут потрібно додати, що такий опис не пов’язаний з часом, тому до координат додають ще й час як параметр. Якщо у кожну точку у просторі провести стрілку, ми отримаємо вектор — математичний об’єкт, що має напрям і довжину (мал. 1а).

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

Мал.1а — Положення частинки в 3-х мірному декартовому просторі, б — зміна положення частинки між двома тіками

Швидкість частинки, якщо говорити простими словами, це те, як змінилося її положення між двома тіками (мал. 1б). Тобто, якщо положення частинки — це вектор, то і швидкість — це векторна величина. Насправді швидкість — похідна першого порядку від положення частинки , але нам не потрібно цю похідну вважати, тому що гра працює за принципом годинника, виходить де в чисельнику, зверху, два вектори, які описують положення частинки у двох сусідніх тіках, в метрах, а в знаменнику, знизу — тривалість тіку, в секундах. Чи вистачить нам швидкості для вирішення задачі? Ні. Падаючи з гелікоптеру частинка має постійне прискорення, що спрямоване вниз (до центру Землі, яка не плоска, нагадую), отже, вона постійно прискорюється. Прискорення — векторна величина, яка показує як змінилася швидкість за проміжок часу, перша похідна від швидкості та друга від положення частинки. так само, як і зі швидкістю.

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

На відео 1 представлено симуляцію такого процесу. Зверніть увагу на обведення, яке малюється кожні 0.14 с (для наочності не збігається з часом виведення інформації в лівій частині екрана — dt). Відстань між двома сусідніми замальовками на початок моменту падіння приблизно однакова, тоді як під час падіння відстань збільшується. Це свідчить про наявність прискорення у об’єкта. Спочатку це розгін об’єкта, а після — дії гравітації на нього. А розгін та гравітація є прискорення.

Відео 1. Симуляція падіння об’єкта з початковою швидкістю. У лівій частині екрана виводяться дані про зміну положення об’єкта dr за час dt = 0.3 c

Інтегрування обертання

У фізиці для опису обертань прийнято оперувати терміном «тверде тіло». Тобто тіло, яке не можна стиснути або деформувати. Кожне тверде тіло може обертатись навколо свого центру мас. Оскільки тривимірний опис обертання — це досить заплутана штука, ми обмежимося описом обертання на площині, але кілька слів про три виміри додамо наприкінці. Тверде тіло на площині можна уявити як лист паперу, де обертання описується одним кутом .

Швидкість повороту або швидкість обертання — перша похідна від кута обертання, так само, як і у випадку зі положенням і швидкістю частинки. Прискорення обертання — те саме, що і прискорення для частинки. Отримуємо , що дуже знайоме. На жаль, цього недостатньо. У реальному житті форма та розмір об’єкта дуже сильно впливають на те, наскільки важко змусити тіло обертатися. Згадайте відео, де людина, що сидить на стільці з гантелями, прискорює або сповільнює своє обертання в залежності від того, як далеко від осі обертання стільця знаходяться гантелі.

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

Мал. 2. а(ліворуч) — сила прикладається до центру мас (двовимірне тіло рухається по прямій), б (праворуч)- сила прикладається далеко від центру мас, що призводить до обертання тіла разом з прямолінійним рухом

Відео 2.1. Симуляція обертання об’єкта. Точка докладання сили зміщена щодо центру сторони куба, що призводить до прямолінійного рівномірного руху та обертання навколо центру мас об’єкта одночасно

Давайте подивимося на алгоритм Верле для обертань. , де β(t) можна знайти як - ті самі момент інерції та момент сили. Тут ми говорили про момент інерції, коли слід говорити про тензор. Що таке тензор і як його розуміти, виходить за межі цієї статті, але інтуїтивне розуміння спробуємо дати. Тензор інерції — це такий математичний об’єкт, який у певному сенсі дозволяє описати форму тіла і з якого можна отримати інформацію, навколо якої осі тіла обертання відбуватиметься найлегше або найважче.

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

Інший приклад: якщо взяти коробку, у якої одна сторона довша за дві інші, і підкинути її навколо цієї осі, то вісь обертання коробки змінюватиме своє положення в просторі.

Відео 2.2. Симуляція обертання об’єкта з неоднорідною розподіленою масою. Точка докладання сили знаходиться там де і в відео 2.1. Несиметричність тензора інерції призводить до зміни положення осі обертання просторі

Ці явища є результатом виконання одного з фундаментальних законів збереження — законом збереження моменту імпульсу. А згадуючи закон збереження, ми не можемо не торкнутися цієї важливої теми.

Збереження енергії

Візьмемо м’ячик і кинемо його вниз. Він зіткнеться з підлогою та відлетить назад. Чому це сталось? Кожне тіло має певну величину, яку не можна втратити або знищити, а можна тільки передати або трансформувати. Цю величину називають енергією. Ми постійно з нею взаємодіємо. Коли кип’ятимо воду, чайник перетворює електричну енергію на теплову, тим самим нагріваючи воду. Атомна електростанція розщеплює атоми урану і перетворює внутрішню енергію атома на енергію фононів і фотонів, які гріють воду в реакторі і перетворюють на пару, яка обертає турбіну і перетворює механічну енергію обертання на електромагнітну. Для точної симуляції у комп’ютерної гри обов’язково потрібно зберігати енергію системи.

Хтось, можливо, писав симуляцію сонячної системи та рух планет орбітами. З власного досвіду можу сказати, що з часом орбіти планет можуть починати змінювати свою форму. Це відбувалося тому, що я не стежив за повною енергією системи і накопичував помилки в розрахунках з числами з плаваючою точкою.

Енергію об’єкта можна описати як суму його потенційної та кінетичної складових (опускаємо за дужки інші варіації) . Ця сума при моделюванні зіткнення м’ячика зі стіною не може змінюватися, бо це заборонено фундаментальним законом фізики — однорідністю часу (теорема Нетер). Потенційна енергія м’ячика — це залежність від розташування в гравітаційному полі Землі. Її можна представити так: , де величини — по порядку зліва направо — маса, прискорення вільного падіння і висота над землею. У цьому записі енергія є від’ємною, але це приймається для зручності, можна записати і без мінуса. Кінетична енергія — параметр, який описує, як змінюється енергія м’ячика при зміні його швидкості . Сума цих двох величин до зіткнення та після зіткнення не може відрізнятися. Але якщо моделювати систему для гри і багато разів кидати м’ячик на підлогу, за одних і тих самих умов, з часом м’яч почне поводитися нелогічно. Це є результатом накопичення обчислювальних помилок.

Є різні підходи, як цього уникнути, але розглянемо досить простий та інтуїтивно зрозумілий метод. Це в якомусь роді чіт, до якого можна вдатися задля правильних результатів. Припустимо, що ми кидаємо м’ячик тисячу разів і щоразу заміряємо енергію до і після зіткнення, таблиця виглядатиме приблизно так:

Номер кидку

Енергія до зіткнення, Дж

Енергія після зіткнення, Дж

1

5

5,00001

2

5,00001

5,00007

...

100

6,2

6,7

...

1000

10,8

11,9

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

Можливо, вам прийшла ідея при кожному новому кидку звірятися зі стартовим значенням і якщо воно відрізняється, то щоразу переписувати на заздалегідь відоме значення. Це досить незграбний підхід, але тепер щоразу стартове значення енергії буде 5 Дж і кожен кидок буде такий як попередній.

Давайте подивимося на симуляцію і спробуємо розібратися, що не врахував розробник. На відео 3 з однакової висоти падають два однакових м’ячі з нульовою початковою швидкістю.

Відео 3. Симуляція пружного та непружного зіткнень

Через якийсь час правий м’яч після відскоку перестає повертатись на вихідну висоту. У лівого м’яча виконується закон збереження енергії: така система замкнута і енергія нікуди не пропадає, таке зіткнення без втрати енергії називається пружним. Зіткнення правого м’яча непружне, відбувається втрата енергії на деформацію, нагрівання чи інші варіації, як у реальному житті.

Висновки

Опис усіх можливих математичних моделей може перетворитися на профільну книгу із сотнею сторінок. Розробка ігор — захоплююче заняття, де моделі, що були описані, застосовуються постійно. На щастя, більшість ігор пишеться не з нуля, а з використанням ігрових рушіїв, які полегшують роботу. Але використання інструменту без розуміння, як він працює під капотом, може призвести до дивної поведінки об’єктів у грі та досить болісних пошуків помилок. Важливо освіжувати і поглиблювати свої знання, щоб з повним розумінням застосовувати їх у розробці.

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини

👍ПодобаєтьсяСподобалось11
До обраногоВ обраному5
LinkedIn


Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Нажаль мало шо зрозумів бо всюди формули(

Класна стаття!
> «Оскільки тривимірний опис обертання — це досить заплутана штука ...»
З обертаннями в просторі прийнято працювати за допомогою кватерніонів, тож якщо комусь хочеться більше дізнатися з їх приводу — можете подивитися моє відео :)
www.youtube.com/...​A0L3RltC-0L3QuCB1bml0eQ==
В ньому є друга частина, де ми розглядаємо приклад з використанням Unity, але там нема нічого, що сильно «юніті специфік», тож зрозуміють усі)

Підписатись на коментарі