Gibt es eine 2D-Physik-Engine, die Flüssigkeiten und Gase modellieren kann? [geschlossen]


20

An dieser Stelle spielen die Plattform und die Programmiersprache keine Rolle. Ich möchte nur wissen, ob es dafür etwas gibt. Jede Hilfe wird geschätzt.


Ich habe eine benutzerdefinierte 2D-Fluid-Engine implementiert. Mit diesem Artikel über viskoelastische Flüssigkeiten und dem Code von Flui ° D ° emo als Vorlage konnte ich ein Arbeitsbeispiel erstellen . Allerdings sind die Fluids nicht so stabil, wie ich es gerne hätte, und Code könnte viel Optimierungsliebe gebrauchen (Multicore-Verarbeitung, Cache-Freundlichkeit usw.). Was ich möchte, ist eine Bibliothek, die all das bereits erledigt hat, sodass ich sie nur in Box2d und mein Spiel integrieren muss.
deft_code

Antworten:


8

Schauen Sie sich an, welche Q-Games für Pixeljunk Shooter verwendet wurden. Es ist ein 2D-Spiel mit ziemlich komplexer Fluidphysik. Ich bin mir nicht sicher, ob sie eine hausgemachte oder Middleware-Physik-Engine verwendet haben, aber die Informationen sind wahrscheinlich irgendwo da draußen.


8
Sie haben eine selbstentwickelte Engine verwendet, enthalten jedoch Techniken, die mit jeder Physik-Engine und einem benutzerdefinierten Code angewendet werden können. Die gaben tatsächlich einen sehr informativen Vortrag über ihre Fluiddynamik bei GDC (Folien hier: gdcvault.com/play/1012447/Go-With-the-Flow-Fluid )
Ghost

6

Nun, ich habe nicht darüber nachgedacht, aber ich weiß, dass fast jede Physik-Engine die Idee emulieren kann. Box2D usw.

Grundsätzlich können Partikel von Oberflächen und von einander abprallen (schneller für Gase), aber auch eine konstante Wirkung wie bei der Schwerkraft haben (Flüssigkeiten haben alle die gleiche Wirkung, aber einige Gase möchten Sie möglicherweise langsam aufsteigen).

Wenn Sie die äußeren Partikel verbinden, erhalten Sie eine polygonale Form, die die Masse darstellt

ODER

Wenn Sie einfach eine Pixel- oder Partikelgrafik über jedes Partikel zeichnen, können Sie stattdessen einen Wolkeneffekt für die Masse erzielen.


4
Diese Antwort ist nicht für Echtzeitspiele in praktischer Größe geeignet.
AttackingHobo

3
Ich bin mir nicht sicher, warum Sie das sagen würden, da Fluiddynamik sehr oft als Partikel modelliert wird. Beispiele finden Sie in den nvidia Tech-Videos zu flüssigen Partikeln auf Youtube, im Programm Algodoo (ehemals Phun) oder im Vortrag von Q-Games über das PixelJunk-Shooter-Spiel (Folien unter gdcvault.com/play/1012447/Go-With-the- Flow-Fluid ). Im letzteren Fall zeigt Q-Games, wie sie aus einer Ansammlung von Partikeln ein Polygon konstruieren. Ich würde denken, dass dies bestätigt, dass diese Antwort für Echtzeit-Implementierungen IMHO durchaus gültig ist.
Geist

Wowow warum die downvotes? Ich tobe nicht, will nur wissen warum. Es ist eine realistische Technik und wird angewendet.
Joel

"Partikel, die von Oberflächen und von einander abprallen (schneller für Gase)", klingt so, als würden Sie Flüssigkeiten auf molekularer Ebene beschreiben, und während ein naiver Ansatz mit einer Backsimulation funktionieren könnte, funktioniert er nicht gut für Echtzeitspiele. Partikel sind in Ordnung, solange die Art der Simulation korrekt ist. "Bouncing Arround" scheint mit Makroteilchen zu funktionieren. Sie haben auch grob falsch dargestellt, wie die Dichte simuliert wird.
AttackingHobo

Partikel funktioniert gut genug en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics . Wurde in der neuesten Demo von FLT verwendet, wie in directtovideo.wordpress.com/2011/05/03/numb-res beschrieben. Diese Implementierung ist möglicherweise etwas schwer, aber einfachere Annäherungen wie im GDC-Talk von Pixel Junk Shooter sollten problemlos funktionieren.
ungültig

6

Die einzige Bibliothek, die ich mir vorstellen könnte, die sich speziell mit Flüssigkeiten befasst, ist Fluidic . Es ist ziemlich alpha und hat nur eine Veröffentlichung. Die Physikbibliothek Bullet unterstützt die "Hydrodynamik geglätteter Teilchen", eine Technik zur Modellierung von Flüssigkeiten. Obwohl die Bibliothek auf 3D ausgerichtet ist, können Sie Einschränkungen auf eine Achse anwenden, damit sie in 2D funktioniert.

Meine Empfehlung wäre, wie ich bereits in einigen Kommentaren zu anderen Antworten erwähnt habe, eine Standard-Physik-Engine wie Box2D oder Chipmunk zu verwenden und eine Reihe von Kreisen zu verwenden, um das Wasser (mit Schwerkraft) oder das Gas (ohne Schwerkraft) zu modellieren und diese zu kombinieren in einen Wasser- oder Gaskörper. Sie können den einzelnen Körpern einige Einschränkungen auferlegen, um sie zusammenzuklumpen, sodass Sie die Viskosität simulieren können. Schauen Sie sich dieses Video an, um zu sehen, wie die einzelnen Körper (im Video als Quadrate modelliert) zusammenarbeiten. Beachten Sie jedoch, dass die in diesem Video verwendete Technik nicht mit der in diesem Absatz beschriebenen übereinstimmt. Sie können das Video verwenden, um ein Gefühl dafür zu bekommen, wie die Kreise miteinander interagieren, und versuchen, dies mit den Einschränkungen zu imitieren, die in der verwendeten Physikbibliothek vorhanden sind.

Der interessante Teil kommt, wenn Sie mehrere Kreise in Gewässer kombinieren möchten. Die einfachste Lösung, die ich finden kann, ist, jeden Kreis als Metaball zu zeichnen, damit er als Teil eines größeren Körpers erscheint. Sie finden die Mathematik und einige Beispielcodes hinter diesen Körpern hier .


Das Video, mit dem Sie verlinkt haben, verwendet viel mehr als nur viele Kreise. Er benutzt eine Technik, die als SPH bekannt ist. Der Blaze-Port von Flui ° D ° emo verwendet Box2d zum Auffinden von Kollisionen und zum Aufbringen von Kräften, verwendet jedoch SPH-Methoden zum Berechnen von Kräften, die nicht die starren Körper von Box2d sind.
deft_code

Da haben Sie absolut Recht. Das Video sollte anstelle eines Implementierungsbeispiels veranschaulichend sein. Vielen Dank, dass Sie meinen Fehler erwähnt haben, und ich habe die Antwort aktualisiert, um weitere Missverständnisse zu vermeiden.
Geist

3

Es ist ein paar Jahre her, dass diese Frage veröffentlicht wurde, aber ich bin darauf gestoßen, als ich gesucht habe, und dachte, ich würde sie aktualisieren.

Google hat LiquidFun (Open Source) für das Box2D-System veröffentlicht. Es gibt einige Einschränkungen, aber es ist ein schneller Weg, um mit Flüssigkeiten, Sand usw. Partikeln mit einer recht anständigen Leistung zu beginnen.

https://github.com/google/liquidfun

PixelJunk hat einen großartigen Ansatz, aber es ist eine private Bibliothek. In ihrem Vortrag auf der GCD 2010 teilten sie ein erstaunliches Maß an Details.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.