Як я можу створити вибух бомби в Farseer, який відштовхує об'єкти поблизу?


14

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


Варто зазначити, що Farseer поставляється із зразком, який реалізує вибухи. Це "AdvancedDemo5" (у поточному джерелі). Це схоже на метод близькості у чудовій відповіді Classic Thunder, лише менш складний (імпульс фіксованої величини в AABB).
Ендрю Рассел

Відповіді:


28

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

Також ви хочете застосувати тут імпульси, а не сили. Щоб зрозуміти, чому це читати .

Метод Близькості

Метод Близькості

Це той самий метод, який переймає Байт56 у своїй відповіді. Концепція проста. Майте точку вибуху і застосуйте імпульс у зворотному напрямку від точки, яка впливатиме на всі об'єкти силою залежно від їх відстані.

Плюси:

  • Дуже швидко
  • Легко кодувати.

Мінуси:

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

Метод Raycast

Метод Raycast

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

Плюси:

  • Менш продуктивність, ніж метод снарядів.
  • Вибух заблокований об'єктами.
  • Врахована поверхня.

Мінуси:

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

Метод Частинок

Метод Частинок

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

Плюси:

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

Мінуси:

  • Додає складність за клік.

5
Дуже приємна відповідь. Мені особливо подобається метод частинок. Схоже, це може ускладнити отримання потужного вибуху. Чи тривіально зробити частинки більшою масою?
MichaelHouse

1
Тривіально впливати на всі фізичні аспекти частинок, найбільш релевантні - щільність, швидкість та демпфірування. Збільшити густину вгору і встановити високу швидкість дозволить вам здійснити комічно бурхливий вибух.
ClassicThunder

Чи зробили вибухові частинки спеціально сповільненими, або це просто вся анімація зупиняється. Було б сенс додати частинки постійного тертя.
це

@self Box2D дозволяє додати затухання вкладиша до об'єкта, що уповільнює його лінійно з певною швидкістю, це техніка, яка використовується в gif.
ClassicThunder

1
Відмінна відповідь: :) Я би додав ще один професіонал до останнього методу, щоб ви могли використовувати положення гранул, щоб намалювати дим чи пил.
iforce2d

2
  • Виберіть усі об'єкти в радіусі дії бомби.
  • Для кожного об’єкта
    • Використовуйте положення об'єкта та центр вибуху для обчислення вектора імпульсу. Щось подібне normalize(object - center).
    • Використовуйте відстань від центру бомби до об'єкта, щоб обчислити величину імпульсу. Щось на зразок(object - center).length
    • Нанесіть імпульс на об’єкт, використовуючи вектор та величину, знайдені в попередніх кроках.

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


Сили - це коли ти хочеш впливати на об'єкт з часом, що тут не така ситуація. Правильніше було б застосувати імпульс.
ClassicThunder

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