Vie de particules 3D

Salut! J'ai décidé de partager avec mes lecteurs mes petites expériences avec les systèmes de particules dans l'espace tridimensionnel. J'ai pris comme base la publication sur Habré sur les expériences avec des particules dans l'espace 2D.



Commençons par un lien vers un article qui m'a poussé à l'action. Mais il y a une autre raison, puisque récemment je me suis de plus en plus déplacé vers Ubuntu dans mes expériences, beaucoup de choses ont été bonnes depuis l'installation gratuite de l'OS et ensuite sur la liste des avantages. Il y a des inconvénients, j'ai du mal avec les pilotes pour une installation de système d'exploitation non standard comme deux cartes vidéo et plusieurs moniteurs.


J'ai pris C ++ comme base, ajouté le support de CUDA en tant que plate-forme informatique, il y a beaucoup de particules et le processeur central ne peut évidemment pas faire face à une telle charge en temps réel, et le moteur graphique Ogre3D pour eux dans l'entreprise. Ils ont fait la bouillie, je vais assaisonner le récit Gif avec des animations et des citations de l'article sur la version 2D de la simulation.


"Premièrement, j'ai suivi les traces du jeu de la" vie ": chaque particule a un compteur de" surpopulation ", qui est égal à la somme des carrés inverses des distances aux autres particules. Si ce compteur est inférieur à une certaine limite, c'est-à-dire qu'il y a peu de voisins, alors la particule est attirée par d'autres particules, et s'il y a beaucoup de voisins, ça repousse, si les particules se croisent, alors elles se repoussent en tout cas, pour ne pas se traverser.


Nous dispersons au hasard des particules sur le terrain et voyons ce qui se passe. "



Vidéo avancée
Maintenant, un peu sur la logique de ce qui se passe dans le programme. Un tableau de particules avec certains paramètres est créé. Certains paramètres sont responsables des propriétés physiques: rayon, masse, vitesse, etc., partie pour créer des liaisons entre particules, telles que: type de particules, nombre de connexions de particules avec d'autres particules, etc. En moyenne, j'ai utilisé de 700 à 3000 particules dans la simulation, car je voulais compter en temps réel, une valeur plus élevée entraînait l'inhibition de l'image en raison de l'augmentation du volume des calculs. Ensuite, tout cela est transféré dans la mémoire de la carte vidéo, où le GPU, en mode de forte parallélisation, traite trois sous-programmes principaux: simulation du mouvement des particules, traitement des collisions de particules (collisions) et formation et destruction de liaisons entre particules.


"Nous changeons les règles du jeu. Nous ne compterons plus les voisins. Laissons les particules simplement attirer ou repousser selon leur type. Si toutes les particules sont du même type, alors il n'y a que 2 options: elles repoussent toutes ou toutes attirent."


J'ai essayé plusieurs options pour les forces attractives-répulsives, les dépendances linéaires sur les distances entre particules, inversement proportionnelles à la distance, etc. réglé sur la dépendance quadratique inverse, mais avec une restriction sur le rayon d'action, quelque chose comme 45 rayons de particules.



"Nous ne changerons pas beaucoup les règles. Au lieu de cela, nous allons ajouter une nouvelle fonctionnalité. Maintenant, les particules formeront des liaisons à courte distance. Si les particules sont connectées, elles sont constamment attirées les unes vers les autres. Cette attraction ne s'affaiblit pas avec la distance. Mais, si la distance est au-dessus d'un certain seuil, alors la connexion est rompue. "


Ici, la règle a un peu changé, introduit la distance de formation de la liaison, c'est la distance de destruction de la liaison et la distance de repos de la particule dans la liaison, c'est-à-dire que la particule essaie constamment de prendre une position proche de la position de repos, donc, à un moment discret, la particule oscille près de la position zéro. Ceci est visible sur toutes les vidéos. Il est possible d'appliquer des lois plus complexes lors de la formation d'une liaison comme l'élasticité, mais pour l'instant je l'ai simplifiée, mais nous avons une "soupe primaire" et pas une substance solide.



Vidéo avancée


ou comme image



Puis le processus d'essais et d'erreurs a commencé. Premièrement, la programmation sur le GPU nécessite une attention particulière dans les soi-disant "courses sur lecture-modification-écriture de données partagées", ce qui signifie qu'il peut y avoir des problèmes lorsque plusieurs threads essaient simultanément de changer la variable. Des instabilités surviennent comme celles-ci:



Ensuite, il a fallu limiter la zone d'espace dans laquelle se déroule l'expérience, la première chose qui m'est venue à l'esprit est un cube. Mais grâce aux bugs des premières versions du programme, des particules en ont rampé hardiment, formant quelque chose de similaire aux stations spatiales de la fiction des années 70.



version étendue de la vidéo


Comme dit le proverbe, si ce n'est pas un cube, alors qu'il y ait une balle:



Ici, la logique est qu'après le départ du centre de la particule, une force commence à agir en face de son mouvement, qui ressemble même à la gravité.


__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}}; 

Il a apporté un morceau de code tel qu'il est, ce sont des matrices d'interaction de trois types de particules entre elles.
-la première ligne est le principe de la formation des liaisons: 1 il y a une possibilité d'établir une connexion avec une autre particule, respectivement 0, non.
-la deuxième ligne est la loi d'attraction de la répulsion des particules. En fait, dans ce mode de réalisation, tous se repoussent, sauf pour l'attraction du deuxième type de particules vers le troisième. Vous pouvez bien sûr refléter la matrice, mais dans ce cas.
-la troisième ligne est le nombre de liaisons de particules communes par type.
-quatrième est le nombre de liaisons de particules avec chaque type de particules. Le premier type, par exemple, ne peut pas former une liaison avec lui-même.


Nous obtenons des particules dans un fort mouvement brownien:



version étendue de la vidéo


J'ai dû introduire une perte d'énergie dans les collisions.



version étendue de la vidéo


Tout est devenu trop statique, on réduit les forces d'interaction des particules.



version étendue de la vidéo


Si vous regardez la vidéo, vous pouvez voir comment le cadre est en cours de construction. Ensuite, il reste statique de toute façon.


Nous changeons les règles concernant les coefficients matriciels.



version étendue de la vidéo
Nous voyons la formation de la ressemblance des molécules organiques. Il y a même des anneaux de benzène.



Une autre vidéo montre ce qui se passera si vous modifiez la longueur des liaisons entre les particules dans la dynamique, à partir de la deuxième minute de la vidéo, cela est particulièrement prononcé.



Mais il faut essayer de répéter la version de l'auteur 2D, dont les citations se trouvent dans le corps de l'article. Il existe une variante d'une telle "vie":



ou tel



Que peut-on ajouter? Premièrement, les sources du programme . Deuxièmement, il y a plusieurs articles sur le hub qui décrivent les automates cellulaires ou les systèmes libres (en théorie, un automate cellulaire est l'équivalent d'une machine de Turing ) avec un titre rendu qui inclut le mot "vie", j'ai donc décidé de l'utiliser aussi, un peu comme une tradition. Bien qu'il s'agisse plutôt d'un kalédoscope, des règles simples donnent lieu à des comportements complexes comme des particules et un système de miroirs dans un jouet pour enfant.


Et la vidéo a ajouté, en fait, une image envoûtante, il semble que ce soit des molécules, puis des réseaux de neurones, mais la vie n'est pas encore là. En tant qu'option de développement, la génétique doit être ajoutée, mais il n'est pas clair quelle peut être une fonction de fitness pour ces "créatures".



J'espère que quelqu'un l'aimera et qu'il s'éloignera de la 3D car l'auteur est passé de la 2D. L'essentiel pour moi était de répéter les leçons sur CUDA et Ogre3D sous Ubuntu.



Et il y aura des idées à écrire, peut-être que nous trouverons quelque chose d'intéressant :)

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


All Articles