Wie kann ich in Farseer eine Bombenexplosion auslösen, die Objekte in der Nähe wegschiebt?

14

Ich versuche, in Farseer eine Bombenexplosion auszulösen. Ich habe einen Kreis für die Bombe erstellt. Wenn die Bombe jedoch explodiert, sollten die Objekte (Körper), die sich um sie herum befinden, wegfliegen, da sie durch die enorme Kraft der Explosion zurückgedrängt werden. Ich bin mir jedoch nicht sicher, wie ich diese Kraft aufbauen soll - wie kann ich das tun?

Homer Simpson
quelle
Es ist erwähnenswert, dass Farseer mit einer Probe geliefert wird, die Explosionen ausführt. Es ist "AdvancedDemo5" (in der aktuellen Quelle). Es ähnelt der Näherungsmethode in der ausgezeichneten Antwort von Classic Thunder, ist jedoch weniger ausgefeilt (ein Impuls mit fester Größe innerhalb eines AABB).
Andrew Russell

Antworten:

28

Ich würde empfehlen, die Seite "explosion iforce2d" zu lesen . Es macht einen großartigen Job, wenn man die verschiedenen Arten des Umgangs mit Explosionen mit den Kompromissen zwischen Leistung und Genauigkeit betrachtet. Es geht über 3 Methoden, die ich hier zusammenfassen werde. Das ist also nur eine Zusammenfassung der Informationen, die ich bei der Recherche gefunden habe und keine meiner eigenen Arbeiten.

Auch Sie wollen hier keine Kräfte impulsen. Um zu verstehen , warum lesen diese .

Die Annäherungsmethode

Die Annäherungsmethode

Dies ist die gleiche Methode, die Byte56 in seiner Antwort behandelt. Das Konzept ist einfach. Haben Sie einen Explosionspunkt und wenden Sie einen Impuls in die entgegengesetzte Richtung von dem Punkt weg an, der alle Objekte mit einer Stärke beeinflusst, die von ihrer Entfernung abhängt.

Vorteile:

  • Sehr schnell
  • Einfach zu codieren.

Nachteile:

  • Explosionen passieren unbewegliche Objekte und statische Körper.
  • Objekte, die sich im Einflussbereich der Explosion befinden, können übersprungen werden, wenn Sie nur den Abstand zum Massenmittelpunkt überprüfen.
  • Fläche wird nicht berücksichtigt.
  • Alles ist gleichzeitig betroffen.

Die Raycast-Methode

Die Raycast-Methode

Dieser ist einfach genug, wirft Strahlen aus dem Ursprung Ihrer Explosion aus und setzt Impulse, wenn sie mit einem von der Entfernung bestimmten Impuls auf ein Objekt prallen.

Vorteile:

  • Weniger leistungsintensiv als die Projektilmethode.
  • Explosion durch Gegenstände blockiert.
  • Fläche berücksichtigt.

Nachteile:

  • Alles ist gleichzeitig betroffen.
  • Je größer die Explosion, desto mehr Strahlen werden benötigt, um sicherzustellen, dass die Explosion alles beeinflusst.
  • Leistungsintensiver als die Näherungsmethode.

Die Partikelmethode

Die Partikelmethode

Mein persönlicher Favorit. Ähnlich wie bei der RaySasting-Methode, aber anstelle von Strahlen setzen Sie die Physik-Engine ein und spucken kleine Pellets aus, die mit Ihrer Szene interagieren.

Vorteile:

  • In Bezug auf den Code extrem einfach. Generieren Sie die Bälle und geben Sie jedem einen Impuls. Sie haben keinen Code zum Schreiben pro Tick. Habe nur einen Timer, der läuft und die Körper deaktiviert / zurücksetzt, nachdem die Explosion abgeschlossen ist.
  • Die Explosion wird durch Gegenstände blockiert.
  • Fläche wird berücksichtigt.
  • Explosion wird von Oberflächen reflektiert.
  • Objekte, die weiter von der Explosion entfernt sind, reagieren langsamer darauf.
  • Sie können die Kugeln als Grundlage für die Erzeugung von Teileffekten verwenden, damit Ihre Effekte den Explosionsschlag genau wiedergeben können.

Nachteile:

  • Fügt Komplexität pro Tick hinzu.
ClassicThunder
quelle
5
Sehr nette Antwort. Besonders gut gefällt mir die Partikelmethode. Es scheint, als würde es schwieriger werden, eine mächtige Explosion zu bekommen . Ist es trivial, die Partikel massereicher zu machen?
MichaelHouse
1
Es ist trivial, alle physikalischen Aspekte der Partikel zu beeinflussen, wobei Dichte, Geschwindigkeit und Dämpfung am wichtigsten sind. Wenn Sie die Dichte nach oben drehen und eine hohe Geschwindigkeit einstellen, können Sie eine komische Explosion auslösen.
ClassicThunder
Haben Sie Explosionspartikel absichtlich verlangsamt oder ist nur die gesamte Animation gestoppt? Es wäre sinnvoll, den Partikeln eine konstante Reibung zu verleihen.
Dies ist der
Mit @self Box2D können Sie einem Objekt eine Liniendämpfung hinzufügen, die es linear mit einer bestimmten Geschwindigkeit verlangsamt. Dies ist die im GIF verwendete Technik.
ClassicThunder
1
Ausgezeichnete Antwort :) Ich würde der letzten Methode noch einen Pro hinzufügen, indem Sie die Pelletpositionen verwenden könnten, um etwas gut aussehenden Rauch oder Staub zu zeichnen.
iforce2d
2
  • Wählen Sie alle Objekte im Einflussbereich der Bombe aus.
  • Für jedes Objekt
    • Verwenden Sie die Objektposition und den Mittelpunkt der Explosion, um den Impulsvektor zu berechnen. So etwas wie normalize(object - center).
    • Verwenden Sie den Abstand vom Zentrum der Bombe zum Objekt, um die Größe des Impulses zu berechnen. Etwas wie(object - center).length
    • Wenden Sie einen Impuls auf das Objekt unter Verwendung des Vektors und der Größe an, die in den vorherigen Schritten ermittelt wurden.

Bezüglich der Berechnung der Größe können Sie mit einem einfachen linearen Abfall beginnen und dann zu anderen Formeln wechseln, wenn Ihnen die Ergebnisse nicht gefallen.

MichaelHouse
quelle
Kräfte sind für, wenn Sie ein Objekt im Laufe der Zeit beeinflussen möchten, was hier nicht der Fall ist. Es wäre richtiger, einen Impuls anzulegen.
ClassicThunder
Entschuldigung, ich sagte Kraft, aber verbunden mit Impuls.
MichaelHouse