Как я могу создать взрыв бомбы в Farseer, который отталкивает близлежащие объекты?

14

Я пытаюсь создать взрыв бомбы в Farseer. Я создал круг для бомбы. Однако, если бомба взорвется, предметы (тела), которые находятся вокруг нее, должны улететь, потому что они оттеснены огромной силой взрыва. Я не уверен, как создать эту силу, хотя - как я могу это сделать?

Гомер Симпсон
источник
Стоит отметить, что Farseer поставляется с образцом, который реализует взрывы. Это «AdvancedDemo5» (в текущем источнике). Это похоже на метод приближения в превосходном ответе Classic Thunder, только менее изощренный (импульс фиксированной величины в AABB).
Эндрю Рассел

Ответы:

28

Я бы порекомендовал проверить страницу взрыва iforce2d . Он отлично справляется с различными способами обработки взрывов с компромиссом между производительностью и точностью. Это идет по 3 методам, которые я суммирую здесь. Так что это просто я суммирую информацию, которую я нашел во время исследования, и ни одна из них не является моей собственной работой.

Также вы хотите применить импульсы здесь не силы. Чтобы понять, зачем читать это .

Метод близости

Метод близости

Это тот же метод, который Byte56 использует в своем ответе. Концепция проста. Имейте точку взрыва и применяйте импульс в противоположном направлении от точки, который воздействует на все объекты с силой, основанной на их расстоянии.

Плюсы:

  • Очень быстро
  • Легко кодировать.

Минусы:

  • Взрывы проходят через неподвижные объекты и статические тела.
  • Объекты, которые находятся в зоне влияния взрыва, могут быть пропущены, если вы только проверите расстояние до центра масс.
  • Площадь поверхности не учитывается.
  • Все затронуто сразу.

Метод Raycast

Метод Raycast

Это достаточно просто, отбрасывайте лучи от источника вашего взрыва и применяйте импульсы, когда они сталкиваются в объект с импульсом, продиктованным расстоянием.

Плюсы:

  • Менее производительный, чем метод метательных снарядов.
  • Взрыв заблокирован объектами.
  • Площадь поверхности учитывается.

Минусы:

  • Все затронуто сразу.
  • Чем больше взрыв, тем больше лучей нужно, чтобы взрыв повлиял на все.
  • Более высокая производительность, чем метод близости.

Метод частиц

Метод частиц

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

Плюсы:

  • Чрезвычайно простой код. Создайте шары и примените импульс к каждому. У вас нет кода, чтобы написать за тик. Просто имейте таймер, который отключает / сбрасывает тела после завершения взрыва.
  • Взрыв заблокирован объектами.
  • Площадь поверхности учитывается.
  • Взрыв отражается от поверхностей.
  • Объекты, находящиеся дальше от взрыва, реагируют на него медленнее.
  • Вы можете использовать шары в качестве основы для генерации частичек, позволяющих вашим эффектам точно отражать воздействие взрыва.

Минусы:

  • Добавляет сложности за тик.
ClassicThunder
источник
5
Очень хороший ответ. Мне особенно нравится метод частиц. Похоже, что было бы труднее получить мощный взрыв, хотя. Тривиально ли сделать частицы большей массой?
MichaelHouse
1
Тривиально воздействовать на все физические аспекты частиц, наиболее важными из которых являются плотность, скорость и затухание. Увеличение плотности и установка высокой скорости позволят вам сделать комически сильный взрыв.
ClassicThunder
Вы заставили частицы взрыва замедляться нарочно, или остановилась вся анимация? Было бы целесообразно добавить постоянное трение к частицам.
это
@self Box2D позволяет вам добавить демпфирование лайнера к объекту, который замедляет его линейно с определенной скоростью, это техника, используемая в GIF.
ClassicThunder
1
Отличный ответ :) Я бы добавил еще одного профессионала к последнему методу, чтобы вы могли использовать позиции гранул для рисования приятного на вид дыма или пыли.
iforce2d
2
  • Выберите все объекты в радиусе влияния бомбы.
  • Для каждого объекта
    • Используйте положение объекта и центр взрыва, чтобы рассчитать вектор импульса. Нечто подобное normalize(object - center).
    • Используйте расстояние от центра бомбы до объекта, чтобы рассчитать величину импульса. Что-то вроде(object - center).length
    • Примените импульс к объекту, используя вектор и величину, найденные в предыдущих шагах.

Что касается вычисления величины, вы можете начать с простого линейного спада, а затем перейти к другим формулам, если вам не нравятся результаты.

MichaelHouse
источник
Силы - это когда вы хотите влиять на объект с течением времени, а здесь нет такой ситуации. Было бы правильнее применить импульс.
ClassicThunder
Извините, я сказал силу, но связан с импульсом.
MichaelHouse