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.