Wie simuliere ich Druck mit Partikeln?


11

Ich versuche, Druck mit einer Sammlung kugelförmiger Partikel in einem Unity-Spiel zu simulieren, das ich baue. Ein paar Anmerkungen zum Problem:

  • Das Ziel ist es, einen sich ständig ändernden 2D-Raum / Hohlraum mit kleinen, reibungslosen Kugeln zu füllen. Das Spiel versucht, den ständig wachsenden Druck von mehr Objekten zu simulieren, die in diesen Raum geschoben werden.
  • Die Ebene selbst scrollt ständig von links nach rechts. Wenn die Abmessungen des Raums vom Benutzer nicht geändert werden, wird sie automatisch kleiner (der am weitesten links stehende Teil des Raums wird kontinuierlich außerhalb des Bildschirms gescrollt).

Ich frage mich, welche Ansätze ich zur Lösung dieser Probleme wählen kann ...

  1. Wissen, wann zu erkennen ist, wann Platz zum Füllen vorhanden ist, und dann dem Raum Kugeln hinzufügen.
  2. Entfernen von Kugeln aus dem Raum, wenn dieser schrumpft.
  3. Strategien zur Simulation des Drucks auf die Kugeln, so dass sie "nach außen explodieren", wenn mehr Platz geschaffen wird.

Der aktuelle Ansatz, über den ich nachdenke, ist die Verwendung einer sich ständig bewegenden Wand, die sich außerhalb des Bildschirms befindet und sich mit dem Bildschirm bewegt, wie dieses Bild zeigt:

Druck!.

Diese sich bewegende Wand drückt und fängt die Kugeln in den Raum ein. Was das Hinzufügen neuer Kugeln angeht, so sollte ich entweder (1) Kugeln beim Erkennen des freien Raums replizieren oder (2) sie auf der linken Seite des Raums (wo sich die Wand befindet) erzeugen - den Rest der Kugeln dazu drücken fülle den Raum aus. Ich sehe Probleme mit Idee Nr. 1 voraus, da dies wahrscheinlich keinen Druck erzeugen / simulieren würde. Idee Nr. 2 scheint vielversprechender zu sein, wirft jedoch die Frage auf, wie diese neuen Kugelpartikel zum Laichen gebracht werden können (und welche Auswirkungen es hat, wenn sie keinen Platz haben).

Vielen Dank im Voraus für Ihre Weisheit!

Antworten:


6

Ich bin mir nicht ganz sicher, was Sie erreichen wollen. Schiebt die Wand die Partikel, während der Raum vom Bildschirm rollt, eine Spielmechanik?

Was Ihre drei Punkte betrifft, denke ich, dass diese Verhaltensweisen alle auftreten würden, wenn Sie Ihre Partikel so behandeln: Lassen Sie jedes Partikel jedes andere Partikel umgekehrt proportional zur Entfernung abstoßen und lassen Sie sie auch mit den Wänden Ihres Raums kollidieren, um sie zu stoppen.

Nahe beieinander liegende Partikel würden sich gegenseitig abstoßen und sich so ausbreiten, um den leeren Raum zu füllen, bis sie von Hindernissen gestoppt werden. Wenn sich die Wände bewegen, um den Raum zu verkleinern und die Partikel zu drücken, werden sie näher an andere Partikel gedrückt, stoßen sie stärker ab, was wiederum auf andere Partikel drückt und den Gesamtdruck erhöht.

Dies wäre einer n-Körpersimulation mit negativer Anziehung ziemlich ähnlich, so dass es abhängig von der Anzahl der Partikel ziemlich teuer werden könnte, die Abstoßung für jedes Partikel mit jedem anderen Partikel zu berechnen. Sie könnten möglicherweise versuchen, dies zu vereinfachen, indem jedes Partikel nur durch den gemittelten Schwerpunkt Ihrer Partikelmasse abgestoßen wird, was jedoch in langen, dünnen Bereichen mit Biegungen zu einem merkwürdigen Verhalten führen kann (Ihr Gas dehnt sich jedoch nicht in Bereiche aus, die sich von der Biegung wegbewegen Schwerpunkt zum Beispiel).

Beim Erstellen und Löschen von Partikeln (um sicherzustellen, dass genau die richtige Menge vorhanden ist, um den von mir angenommenen Raum visuell auszufüllen?) Möchten Sie wahrscheinlich sicherstellen, dass Sie keine Partikel hinzufügen oder entfernen, wenn die Dichte fehlt, da dies zu einer Beeinträchtigung führen würde mehr Partikel stoßen andere Partikel ab und erhöhen oder verringern somit den Druck.

Vielleicht möchten Sie einen Faktor in die Abstoßungsberechnung einführen, beispielsweise mit 1,0 beginnen. Wenn Sie x Partikel hinzufügen, geben Sie den neuen Faktor n / (n + x) ein, wobei n die Anzahl der Gesamtpartikel ist, bevor Sie die neuen hinzufügen.


2

Druck (wie in einem Gas) ist nur das Ergebnis von einfachen elastischen Kollisionen zwischen Ihren Partikeln und zwischen den Partikeln und der Wand. Sie messen nur die Anzahl der Kollisionen pro Zeit mit den Wänden, um einen Wert für Ihren Druck zu erhalten.

Die beiden von Ihnen angegebenen Ideen haben keinen direkten Zusammenhang mit dem Druck, da der Druck mit einer konstanten Menge an Partikeln in einem geschlossenen Volumen und einer bestimmten Temperatur angegeben wird (was dazu führt, dass sich die Partikel schneller oder langsamer bewegen).

Wenn Sie diesem geschlossenen System Partikel hinzufügen, sollte der Druck ansteigen, da das gesamte System mehr Energie enthält (Sie haben gerade ein neues Partikel mit einer bestimmten Temperatur <-> hinzugefügt).


Partikel sollten eine Masse für die elastischen Kollisionen haben, da angenommen wird, dass die Wände eine Masse nahe + unendlich haben
Aron_dc

Ich sagte, "Druck ist die Menge an Kollisionen pro Zeit mit den Wänden", die noch 100% genau ist. Bei einer elastischen Kollision nehmen Sie den Impuls dieses Partikels und messen, wie viel Impuls an die Wand abgegeben wird. Wenn also ein Teilchen in vertikaler Richtung zur Wand kollidiert, erhält die Wand einen Impuls von 2 mV (m = Masse des Teilchens; v = Geschwindigkeit des Teilchens). Sie messen also tatsächlich den an der Wand ankommenden Impuls. Das Teilchen wird nur reflektiert (v vor der Kollision = -v nach der Kollision). Dies hilft sogar dabei, den Druck von Gemischen verschiedener Gase (verschiedene m für Partikel) zu messen.
Aron_dc

0

In jeder Schleife sollten Sie alle Ihre Partikel durchlaufen und dann eine endgültige Kraft auf dieses Partikel berechnen. Grundsätzlich gibt ihnen die Wand immer einen positiven Kraftvektor auf der x-Achse, wenn sie damit kollidieren (Partikel.x - Partikel.r <= 0).

Dann gibt ihnen jedes Teilchen, mit dem sie kollidieren, abhängig vom Winkel zwischen ihnen auch einen Kraftvektor. Sie sammeln diese Winkel für alle Partikel, berechnen den Durchschnitt und los geht's!

Es gibt viele Optimierungstechniken, die Sie auch hier verwenden können. Schauen Sie sich einfach ein Tutorial zur Ballphysik an. Sie wollen im Grunde zu durchlaufen jedes Paar von Teilchen nur einmal und der Kraftvektor für berechnen beide und speichern sie in ihnen.

Dies simuliert im Grunde genommen Gase, und wenn Sie ihnen eine konstante Kraft geben, nehme ich an, auch Flüssigkeiten.

Zum Erstellen und Löschen von Partikeln implementiere ich eine ParticleEmitter-Klasse, die eine Position, eine Richtung und einige andere nützliche Dinge enthält. Ihr Beispiel wäre besser mit einem Emitter, der Partikel in einem bestimmten Bereich oder noch besser mit einem Rechteck erzeugen kann.

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.