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 ...
- Wissen, wann zu erkennen ist, wann Platz zum Füllen vorhanden ist, und dann dem Raum Kugeln hinzufügen.
- Entfernen von Kugeln aus dem Raum, wenn dieser schrumpft.
- 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:
.
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!
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.
quelle