Jak mogę stworzyć eksplozję bomby w Farseer, która odepchnie pobliskie obiekty?


14

Próbuję stworzyć wybuch bomby w Farseer. Utworzyłem okrąg dla bomby. Jeśli jednak bomba wybuchnie, otaczające ją obiekty (ciała) powinny odlecieć, ponieważ są odpychane przez ogromną siłę eksplozji. Nie jestem jednak pewien, jak stworzyć tę siłę - jak to zrobić?


Warto zauważyć, że Farseer jest wyposażony w próbkę, która powoduje wybuchy. Jest to „AdvancedDemo5” (w bieżącym źródle). Jest podobny do metody zbliżeniowej w doskonałej odpowiedzi Classic Thunder, tylko mniej wyrafinowany (impuls o stałej wielkości w AABB).
Andrew Russell,

Odpowiedzi:


28

Polecam sprawdzić na stronie eksplozja iforce2d . Świetnie sobie radzi, analizując różne sposoby radzenia sobie z eksplozjami z kompromisami między wydajnością a dokładnością. Omówiono tu 3 metody, które tutaj streszczę. Więc to po prostu podsumowuję informacje, które znalazłem podczas badań i żadna z nich nie jest moją własną pracą.

Również tutaj chcesz zastosować impulsy, a nie siły. Aby zrozumieć, dlaczego czytać tego .

Metoda bliskości

Metoda bliskości

Jest to ta sama metoda, którą Byte56 omawia w swojej odpowiedzi. Pomysł jest prosty. Posiadaj punkt wybuchu i przyłóż impuls w przeciwnym kierunku od punktu, który wpłynie na wszystkie obiekty z siłą zależną od ich odległości.

Plusy:

  • Bardzo szybki
  • Łatwy do kodowania.

Cons:

  • Wybuchy przechodzą przez obiekty nieruchome i ciała statyczne.
  • Obiekty znajdujące się w obszarze wpływu podmuchu można pominąć, jeśli sprawdzimy tylko odległość do środka masy.
  • Powierzchnia nie jest brana pod uwagę.
  • Wszystko ma wpływ na raz.

Metoda Raycast

Metoda Raycast

Ten jest dość prosty, wyrzuć promienie z miejsca wybuchu i zastosuj impulsy, gdy zderzą się z przedmiotem pod wpływem odległości pod wpływem impulsu.

Plusy:

  • Wydajność mniej intensywna niż metoda pocisków.
  • Wybuch blokowany przez obiekty.
  • Uwzględniona powierzchnia.

Cons:

  • Wszystko ma wpływ na raz.
  • Im większa eksplozja, tym więcej promieni potrzebujesz, aby mieć pewność, że eksplozja wpłynie na wszystko.
  • Wydajność bardziej intensywna niż metoda zbliżeniowa.

Metoda cząstek

Metoda cząstek

Mój osobisty faworyt. Podobne do metody RaySasting, ale zamiast promieni wykorzystujesz silnik fizyki i wypluwasz małe granulki, które wchodzą w interakcje z twoją sceną.

Plusy:

  • Niezwykle łatwe pod względem kodu. Wygeneruj kulki i przyłóż impuls do każdej z nich. Nie masz kodu do napisania na tyknięcie. Wystarczy mieć zegar, który się włącza i wyłącza / resetuje ciała po zakończeniu eksplozji.
  • Wybuch jest blokowany przez obiekty.
  • Uwzględnia się powierzchnię.
  • Wybuch odbija się od powierzchni.
  • Obiekty znajdujące się dalej od wybuchu reagują na to wolniej.
  • Możesz użyć kulek jako podstawy do generowania cząsteczek, dzięki czemu Twoje efekty dokładnie odzwierciedlą wpływ eksplozji.

Cons:

  • Dodaje złożoność poszczególnych tików.

5
Bardzo miła odpowiedź. Szczególnie podoba mi się metoda cząstek. Wygląda na to, że utrudniłoby to potężną eksplozję. Czy sprawienie, by cząstki były większe, jest banalne?
MichaelHouse

1
Trywialne jest wywieranie wpływu na wszystkie fizyczne aspekty cząstek, z których najbardziej istotna jest gęstość, prędkość i tłumienie. Zwiększenie gęstości i ustawienie dużej prędkości pozwoli ci dokonać komicznie gwałtownej eksplozji.
ClassicThunder

Czy sprawiłeś, że cząstki eksplozji celowo zwolniły, czy tylko cała animacja się zatrzymała? Sensowne byłoby dodanie stałego tarcia do cząstek.
tego

@self Box2D pozwala na dodanie tłumienia liniowej do obiektu, który spowalnia go liniowo w pewnym tempie, jest to technika stosowana w gifie.
ClassicThunder

1
Doskonała odpowiedź :) Chciałbym dodać jeszcze jednego profesjonalistę do ostatniej metody, w którym można użyć pozycji peletów do wyciągnięcia ładnie wyglądającego dymu lub kurzu.
iforce2d

2
  • Wybierz wszystkie obiekty w promieniu wpływu bomby.
  • Dla każdego obiektu
    • Użyj położenia obiektu i środka wybuchu, aby obliczyć wektor impulsu. Coś jak normalize(object - center).
    • Użyj odległości od środka bomby do obiektu, aby obliczyć wielkość impulsu. Coś jak(object - center).length
    • Zastosuj impuls do obiektu, używając wektora i wielkości znalezionej w poprzednich krokach.

Jeśli chodzi o obliczanie wielkości, możesz zacząć od prostego liniowego spadku, a następnie przejdź do innych formuł, jeśli nie lubisz wyników.


Siły powstają, gdy chcesz wpłynąć na obiekt w czasie, co nie jest tutaj sytuacją. Bardziej właściwe byłoby zastosowanie impulsu.
ClassicThunder

Przepraszam, powiedziałem siłę, ale połączoną z impulsem.
MichaelHouse
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.