3D-Lebensdauer

Hallo! Ich beschloss, meine kleinen Experimente mit Partikelsystemen im dreidimensionalen Raum mit meinen Lesern zu teilen. Ich habe die Veröffentlichung über Habré über Experimente mit Partikeln im 2D-Raum zugrunde gelegt.



Beginnen wir mit einem Link zu einem Artikel, der mich zum Handeln veranlasst hat. Aber es gibt noch einen weiteren Grund: Seit ich in meinen Experimenten immer mehr auf Ubuntu umgestiegen bin, waren viele Dinge seit der kostenlosen Installation des Betriebssystems und dann auf der Liste der Pluspunkte gut. Es gibt Minuspunkte, ich habe Probleme mit Treibern für nicht standardmäßige Betriebssysteminstallationen wie zwei Grafikkarten und mehrere Monitore.


Ich habe C ++ als Basis genommen, Unterstützung für CUDA als Computerplattform hinzugefügt, es gibt viele Partikel und der Zentralprozessor kann eine solche Belastung offensichtlich nicht in Echtzeit bewältigen und die Ogre3D- Grafik-Engine für sie im Unternehmen. Sie haben den Brei gemacht, ich werde die Gif-Erzählung mit Animationen und Zitaten aus dem Artikel über die 2D-Version der Simulation würzen.


„Zuerst bin ich in die Fußstapfen des Spiels„ Leben “getreten: Jedes Partikel hat einen„ Überbevölkerungszähler “, der der Summe der inversen Quadrate der Abstände zu anderen Partikeln entspricht. Wenn dieser Zähler unter einer bestimmten Grenze liegt, dh es gibt nur wenige Nachbarn, wird das Partikel von anderen Partikeln angezogen, und Wenn es viele Nachbarn gibt, stößt es ab, wenn sich die Teilchen schneiden, dann stoßen sie sich auf jeden Fall ab, um sich nicht gegenseitig zu durchdringen.


Wir streuen zufällig Partikel über das Feld und sehen, was passiert. "



Erweitertes Video
Nun ein wenig über die Logik dessen, was im Programm passiert. Ein Array von Partikeln mit bestimmten Parametern wird erstellt. Einige der Parameter sind für die physikalischen Eigenschaften verantwortlich: Radius, Masse, Geschwindigkeit usw., Teil zum Herstellen von Bindungen zwischen Partikeln, wie z. B.: Art der Partikel, Anzahl der Partikelverbindungen mit anderen Partikeln usw. Im Durchschnitt habe ich in der Simulation 700 bis 3000 Partikel verwendet, da ich in Echtzeit zählen wollte, führte ein größerer Wert aufgrund der Zunahme des Rechenvolumens zur Hemmung des Bildes. Dann wird all dieses Zeug in den Speicher der Grafikkarte übertragen, wo die GPU im starken Parallelisierungsmodus drei Hauptunterprogramme verarbeitet: Simulation der Partikelbewegung, Verarbeitung von Partikelkollisionen (Kollisionen) und Bildung und Zerstörung von Bindungen zwischen Partikeln.


"Wir ändern die Spielregeln. Wir werden keine Nachbarn mehr zählen. Lassen Sie die Partikel je nach Typ einfach anziehen oder abstoßen. Wenn alle Partikel vom gleichen Typ sind, gibt es nur zwei Möglichkeiten: Sie stoßen entweder alle ab oder alle ziehen sich an."


Ich habe verschiedene Optionen für anziehende Abstoßungskräfte, lineare Abhängigkeiten von den Abständen zwischen Partikeln, umgekehrt proportional zum Abstand usw. ausprobiert. entschied sich für die inverse quadratische Abhängigkeit, jedoch mit einer Einschränkung des Wirkradius, etwa 45 Teilchenradien.



"Wir werden die Regeln nicht viel ändern. Stattdessen werden wir eine neue Funktion hinzufügen. Jetzt bilden die Partikel in kurzer Entfernung Bindungen. Wenn die Partikel verbunden sind, werden sie ständig voneinander angezogen. Diese Anziehungskraft schwächt sich nicht mit der Entfernung ab. Wenn die Entfernung jedoch über einem bestimmten Schwellenwert liegt, dann Die Verbindung ist unterbrochen. "


Hier änderte sich die Regel ein wenig, führte den Abstand der Bindungsbildung ein, es ist der Abstand der Bindungszerstörung und der Ruheabstand des Partikels in der Bindung, dh das Partikel versucht ständig, eine Position in der Nähe der Ruheposition einzunehmen, daher schwingt das Partikel zu diskreter Zeit nahe der Nullposition. Dies ist auf allen Videos sichtbar. Es ist möglich, komplexere Gesetze anzuwenden, wenn eine Bindung wie Elastizität gebildet wird, aber im Moment habe ich es vereinfacht, aber wir haben eine "Primärsuppe" und keine feste Substanz.



Erweitertes Video


oder als Bild



Dann begann der Versuch und Irrtum. Erstens erfordert die Programmierung auf der GPU besondere Sorgfalt bei den sogenannten "Rennen beim Lesen, Ändern und Schreiben gemeinsam genutzter Daten", was bedeutet, dass es Probleme geben kann, wenn mehrere Threads gleichzeitig versuchen, die Variable zu ändern. Instabilitäten entstehen wie folgt:



Dann musste der Raum begrenzt werden, in dem das Experiment stattfindet. Das erste, was mir in den Sinn kam, war ein Würfel. Aber dank der Fehler in den ersten Versionen des Programms krochen Partikel kühn heraus und bildeten etwas Ähnliches wie Raumstationen aus der Fiktion der 70er Jahre.



erweiterte Version des Videos


Wie das Sprichwort sagt, wenn nicht ein Würfel, dann lass es einen Ball geben:



Hier ist die Logik, dass nach dem Verlassen des Zentrums des Teilchens eine Kraft entgegen ihrer Bewegung wirkt, die sogar wie Schwerkraft aussieht.


__device__ static int Links[3][3] = {{1,0,1},{1,0,0},{1,1,0}}; __device__ static int LinksField[3][3] = {{0,0,0},{0,0,1},{0,0,0}}; __device__ static int LinkTypeSize[3] = {3,8,2}; __device__ static int LinkTypePP[3][3] = {{0,1,1},{8,1,6},{0,1,1}}; 

Er brachte ein Stück Code mit, das sind Matrixen der Wechselwirkung von drei Arten von Partikeln miteinander.
-die erste Zeile ist das Prinzip der Bildung von Bindungen: 1 Es besteht die Möglichkeit, eine Verbindung mit einem anderen Teilchen herzustellen, 0 bzw. Nr.
-die zweite Linie ist das Gesetz der Anziehung der Abstoßung von Partikeln. Tatsächlich stoßen sich in dieser Ausführungsform alle gegenseitig ab, mit Ausnahme der Anziehung des zweiten Partikeltyps zum dritten. Sie können die Matrix natürlich spiegeln, aber in diesem Fall.
-th dritte Zeile ist die Anzahl der gemeinsamen Partikelbindungen nach Typ.
-vierte ist die Anzahl der Partikelbindungen mit jedem Partikeltyp. Der erste Typ kann beispielsweise keine Bindung mit sich selbst eingehen.


Wir bekommen Teilchen in einer starken Brownschen Bewegung:



erweiterte Version des Videos


Ich musste bei Kollisionen Energieverluste einführen.



erweiterte Version des Videos


Alles ist zu statisch geworden, wir reduzieren die Kräfte der Partikelwechselwirkung.



erweiterte Version des Videos


Wenn Sie sich das Video ansehen, können Sie sehen, wie der Rahmen erstellt wird. Dann bleibt es trotzdem statisch.


Wir ändern die Regeln bezüglich der Matrixkoeffizienten.



erweiterte Version des Videos
Wir sehen die Bildung der Ähnlichkeit organischer Moleküle. Es gibt sogar Benzolringe.



Ein weiteres Video zeigt, was passiert, wenn Sie die Länge der Bindungen zwischen Partikeln in der Dynamik ändern. Ab der zweiten Minute des Videos ist dies besonders ausgeprägt.



Aber wir müssen versuchen, die 2D-Version des Autors zu wiederholen, dessen Zitate im Hauptteil des Artikels stehen. Es gibt eine Variante eines solchen "Lebens":



oder so



Was kann hinzugefügt werden? Erstens die Programmquellen . Zweitens gibt es mehrere Artikel auf dem Hub, die zellulare Automaten oder freie Systeme beschreiben (theoretisch ist ein zellularer Automat das Äquivalent einer Turing-Maschine ), mit einer gerenderten Überschrift, die das Wort "Leben" enthält. Deshalb habe ich beschlossen, es auch wie eine Tradition zu verwenden. Obwohl es sich eher um ein Kaledoskop handelt, führen einfache Regeln zu komplexen Verhaltensweisen wie Partikeln und einem Spiegelsystem in einem Kinderspielzeug.


Und das Video fügte tatsächlich ein bezauberndes Bild hinzu, es scheint Moleküle, dann neuronale Netze, aber das Leben ist noch nicht da. Als Entwicklungsoption muss die Genetik hinzugefügt werden, aber es ist nicht klar, was eine Fitnessfunktion für diese "Kreaturen" sein kann.



Ich hoffe, es wird jemandem gefallen und es wird weiter von 3D entfernt sein, da der Autor von 2D entfernt ist. Die Hauptsache für mich war, die Lektionen über CUDA und Ogre3D unter Ubuntu zu wiederholen.



Und es werden Ideen geschrieben, vielleicht kommen wir auf etwas Interessantes :)

Source: https://habr.com/ru/post/de454430/


All Articles