Як створити 2D-фізичний двигун? [зачинено]


20

Найсучасніші ігри, які я зробив, - це 8-кулькова гра в басейни, зроблена з фізичним двигуном Box2dFlashAS3, і платформна гра з рівнями.

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

Будь ласка, запропонуйте методи та статті для будь-якої необхідної бази знань.


Відповіді:


16

У той час як я рекомендую проти кочення свого фізичного движка для чого - небудь іншого , ніж досвід це робити (просто зрозуміти , що ви , ймовірно , дотримуєшся викинути , коли ви зробили - це дійсно важко отримати всі edgecases і числовий межа / питання стійкості з'ясовували , і ваш час може бути набагато краще використаний, коли ви працюєте з існуючим двигуном), ось кілька ресурсів:

Уроки залу в басейні: Швидке, точне виявлення зіткнень між колами чи сферами обговорює зіткнення кола / кола та сфери / сфери.

В N Підручники чудові для базового розуміння розділові осі теореми на основі виявлення і реагування.


9

Ерін Катто має всі лекції GDC про впровадження Box2D в Інтернеті. На моєму досвіді Box2D також має простий код для читання.


PDF - це справді важкі матеріали. Але, коли я читав файли cpp та h, як ви сказали, вони "зрозумілі". Дякую.
Вишну

+1. Box2D також дуже обережно ставиться до стабільності, однієї з речей, яка дуже складна, коли ви кочуєте свою власну.
орендар

5

Ось як це можна зробити:

Наближаючий рух

Кожен об'єкт фізики потребує таких векторів:

  • Позиція : де знаходиться об’єкт.
  • Швидкість : Як змінюється його положення.
  • Прискорення : як змінюється його швидкість.

Отже, інтуїтивно вам потрібно робити такі речі кожен кадр кожному об'єкту фізики a:

a.speed    += a.acceleration
a.position += a.speed

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

Зіткнення

Зіткнення можна наблизити за такою послідовністю:

  1. Виявлення : виявлено, що два тіла перетинаються.
  2. Роздільна здатність : положення кожного тіла змінюється, щоб вони більше не перетиналися.
  3. Фізика : Швидкість кожного тіла змінюється для врахування імпульсу, тертя та реституції (бадьорість).

Це відоме як «Дискретне виявлення зіткнення», оскільки це відбувається в окремі моменти часу. Кожен крок заслуговує на увагу:

Крок 1: Виявлення зіткнення (стикаються чи речі?)

Для двох кіл : Просто перевірте, чи їх центри більше, ніж сума їхніх радіусів.

Для двох прямокутників : Перевірте, чи якась їх кутова координата знаходиться в межах іншого прямокутника.

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

Підводні камені : Є дійсно розглянути інші типи зіткнень . Деякі дійсно складні: опуклі багатокутники можуть перетинатися кілька разів !

Крок 2: Дозвіл зіткнення (переміщення їх.)

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

Як приклад, розглянемо зіткнення кола-кола, де одне з кіл закріплено на місці. Вектор мінімального переміщення має той самий напрямок, що і різниця між їхніми середніми векторами. Його довжина - це різниця між сумою їх радіусів і відстані між центрами.

Ця ідея легко узагальнює інші форми.

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

Крок 3: Фізика зіткнення (Інші зміни.)

Найбільш очевидно, що має тенденцію статися, це те, що один або два об'єкти змінюють напрямок, тобто обертають його вектор швидкості. Це досить легко здійснити.

Підводні камені : Об'єкти можуть бути пружними , але їх може бути і не буде. У цьому випадку загальна енергія в системі зменшується. Можливо, вам буде потрібно тягнути через опір повітря. Тертя (особливо статичне тертя ), як відомо, складно реалізувати .

Деякі висновки

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

Якщо ваші потреби прості або ви хочете вчитися, спробуйте.

Якщо ваші потреби складні або вам не подобається математика, знайдіть двигун фізики, щоб розглянути деталі для вас. Box2D і Bullet досить популярні в іграх.



4

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