Ось як це можна зробити:
Наближаючий рух
Кожен об'єкт фізики потребує таких векторів:
- Позиція : де знаходиться об’єкт.
- Швидкість : Як змінюється його положення.
- Прискорення : як змінюється його швидкість.
Отже, інтуїтивно вам потрібно робити такі речі кожен кадр кожному об'єкту фізики a
:
a.speed += a.acceleration
a.position += a.speed
Підводні камені : Це відомий як метод інтеграції Ейлера . Це наближення краще для малих швидкостей та прискорень та з невеликими часовими кроками. У грі це зазвичай так. Але якщо об’єкт рухається дуже швидко до тонкої стіни або безпосередньо до іншого рухомого об’єкта, він може пропустити зіткнення з цим об’єктом, коли його положення посилиться достатньо великою кількістю, щоб повністю його перетнути. Якщо у вас є об'єкти, що швидко рухаються, вам може знадобитися безперервне виявлення зіткнень, щоб уникнути цього.
Зіткнення
Зіткнення можна наблизити за такою послідовністю:
- Виявлення : виявлено, що два тіла перетинаються.
- Роздільна здатність : положення кожного тіла змінюється, щоб вони більше не перетиналися.
- Фізика : Швидкість кожного тіла змінюється для врахування імпульсу, тертя та реституції (бадьорість).
Це відоме як «Дискретне виявлення зіткнення», оскільки це відбувається в окремі моменти часу. Кожен крок заслуговує на увагу:
Крок 1: Виявлення зіткнення (стикаються чи речі?)
Для двох кіл : Просто перевірте, чи їх центри більше, ніж сума їхніх радіусів.
Для двох прямокутників : Перевірте, чи якась їх кутова координата знаходиться в межах іншого прямокутника.
Для всього, що включає складніші багатокутники , вам знадобиться Теорема роздільної осі , що є темою для іншого питання.
Підводні камені : Є дійсно розглянути інші типи зіткнень . Деякі дійсно складні: опуклі багатокутники можуть перетинатися кілька разів !
Крок 2: Дозвіл зіткнення (переміщення їх.)
Простий спосіб вирішити зіткнення - це переклад мінімальним проникненням , використовуючи значення, отримані в результаті виявлення зіткнення. Це, по суті, передбачає переміщення предметів, крім мінімально можливої відстані руху.
Як приклад, розглянемо зіткнення кола-кола, де одне з кіл закріплено на місці. Вектор мінімального переміщення має той самий напрямок, що і різниця між їхніми середніми векторами. Його довжина - це різниця між сумою їх радіусів і відстані між центрами.
Ця ідея легко узагальнює інші форми.
Підводні камені : Якщо обидва об'єкти, що стикаються, є рухомими, можливо, вам доведеться перемістити їх обох на деяку частину загальної відстані, щоб отримати вірогідне наближення їх руху. Їм, очевидно, доведеться рухатися в різних напрямках.
Крок 3: Фізика зіткнення (Інші зміни.)
Найбільш очевидно, що має тенденцію статися, це те, що один або два об'єкти змінюють напрямок, тобто обертають його вектор швидкості. Це досить легко здійснити.
Підводні камені : Об'єкти можуть бути пружними , але їх може бути і не буде. У цьому випадку загальна енергія в системі зменшується. Можливо, вам буде потрібно тягнути через опір повітря. Тертя (особливо статичне тертя ), як відомо, складно реалізувати .
Деякі висновки
Моделювання реальності експоненціально складніше, тим більше, якщо ви хочете імітувати. Ви заходите в мінне поле незліченних крайових справ, бездумно складних формул і постійно зростаючих груп наукових робіт.
Якщо ваші потреби прості або ви хочете вчитися, спробуйте.
Якщо ваші потреби складні або вам не подобається математика, знайдіть двигун фізики, щоб розглянути деталі для вас. Box2D і Bullet досить популярні в іграх.