Comment simuler la pression avec des particules?


11

J'essaie de simuler la pression avec une collection de particules sphériques dans un jeu Unity que je construis. Quelques notes sur le problème:

  • Le but est de remplir un espace / vide 2D en constante évolution avec de petites sphères sans frottement. Le jeu essaie de simuler la pression toujours croissante de plus d'objets poussés dans cet espace.
  • Le niveau lui-même défile constamment de gauche à droite, ce qui signifie que si les dimensions de l'espace ne sont pas modifiées par l'utilisateur, il diminuera automatiquement (la partie la plus à gauche de l'espace défilera continuellement hors écran).

Je me demande quelles sont les approches que je peux adopter pour résoudre ces problèmes ...

  1. Savoir quand détecter s'il y a de l'espace à remplir, puis ajouter des sphères à l'espace.
  2. Suppression des sphères de l'espace lorsqu'il rétrécit.
  3. Stratégies pour simuler la pression sur les sphères de sorte qu'elles "explosent vers l'extérieur" lorsque plus d'espace est créé.

L'approche actuelle que j'envisage est d'utiliser un mur en mouvement constant, qui est hors écran et se déplace avec l'écran, comme l'illustre cette image:

pression!.

Ce mur mobile poussera et emprisonnera les sphères dans l'espace. Quant à l'ajout de nouvelles sphères, j'allais faire en sorte que (1) les sphères se reproduisent lors de la détection d'espace libre, OU (2) les fassent apparaître sur le côté gauche de l'espace (où se trouve le mur) - poussant le reste des sphères à remplir l'espace. Je prévois des problèmes avec l'idée n ° 1 car cela ne créerait / ne simulerait probablement pas vraiment la pression; L'idée n ° 2 semble plus prometteuse, mais pose la question de savoir comment fournir un emplacement pour que ces nouvelles particules de sphère apparaissent (et les ramifications de leur apparition lorsqu'il n'y a pas d'espace).

Merci d'avance pour votre sagesse!

Réponses:


6

Je ne sais pas exactement ce que vous voulez réaliser, est-ce que le mur pousse les particules alors que l'espace roule sur l'écran est un mécanicien de jeu?

En ce qui concerne vos trois points, je pense que ces comportements émergeraient tous si vous traitez vos particules de la manière suivante: demandez à chaque particule de repousser toutes les autres particules inversement proportionnelles à la distance, et faites-les également entrer en collision avec les murs de votre espace pour les arrêter.

Les particules rapprochées se repousseraient et se répandraient ainsi pour remplir l'espace vide jusqu'à ce qu'elles soient arrêtées par des obstacles. Si / lorsque les murs se déplacent pour rendre l'espace plus petit et pousser les particules, elles se rapprocheront des autres particules, les repousseront plus fort qui à leur tour pousseront sur d'autres particules, augmentant la pression globale.

Ce serait assez similaire à une simulation à n corps avec une attraction négative, donc selon le nombre de particules, il pourrait être assez coûteux de calculer la répulsion pour chaque particule avec chaque autre particule. Vous pouvez éventuellement essayer de simplifier cela en faisant repousser chaque particule uniquement par le centre de gravité moyen de votre masse de particules, ce qui pourrait produire un comportement étrange dans de longues zones minces avec des coudes (votre gaz ne se dilatant pas dans des zones qui se plient loin de la centre de gravité, par exemple).

En ce qui concerne la création et la suppression de particules (pour vous assurer qu'il y a juste la bonne quantité pour remplir visuellement l'espace que je présume?), Vous voudrez probablement vous assurer de ne pas simplement ajouter ou supprimer des particules lorsque la densité fait défaut, car cela introduirait plus de particules repoussant les autres particules, et donc augmentant ou diminuant la pression.

Donc, vous voudrez peut-être introduire un facteur dans le calcul de la répulsion, disons commencer avec 1.0 et lorsque vous ajoutez x particules, créez le nouveau facteur n / (n + x) où n est le nombre de particules totales avant d'ajouter les nouvelles.


2

La pression (comme dans un gaz) n'est que le résultat de simples collisions élastiques entre vos particules et entre les particules et le mur. Il vous suffit de mesurer le nombre de collisions par temps avec les murs pour obtenir une valeur pour votre pression.

Les 2 idées que vous donnez n'ont aucun lien direct avec la pression, car la pression est donnée avec une quantité constante de particules dans une volumine fermée et une température donnée (ce qui entraîne un déplacement plus rapide ou plus lent des particules).

Si vous ajoutez des particules à ce système fermé, la pression devrait augmenter, car il y a plus d'énergie dans tout le système (vous venez d'ajouter une nouvelle particule avec une température <-> vitesse donnée).


les particules devraient avoir une masse pour les collisions élastiques, car les murs sont supposés avoir une masse proche de + infini
Aron_dc

J'ai dit que "la pression est la quantité de collisions par temps avec les murs", ce qui est précis à 100%. Dans une collision élastique, vous prenez l'impulsion de cette particule et mesurez combien d'impulsion est donnée au mur. Donc, si une particule entre en collision verticalement avec le mur, le mur reçoit une impulsion de 2mv (m = masse de particule; v = vitesse de particule). Vous mesurez donc réellement l'impulsion entrante sur le mur. La particule est juste réfléchie (v avant la collision = -v après la collision). Cela permet même de mesurer la pression de mélanges de différents gaz (m différent pour les particules).
Aron_dc

0

À chaque boucle, vous devez parcourir toutes vos particules, puis calculer une force finale sur cette particule. Fondamentalement, le mur leur donne toujours un vecteur de force positive sur l'axe x, s'ils entrent en collision avec lui (particule.x - particule.r <= 0).

Ensuite, chaque particule avec laquelle ils entrent en collision leur donne également un vecteur de force, selon l'angle entre eux. Vous collectez ces angles pour toutes les particules, calculez la moyenne, et c'est parti!

Il existe de nombreuses techniques d'optimisation que vous pouvez également utiliser ici, il suffit de rechercher un didacticiel sur la physique des billes. Vous voulez essentiellement parcourir chaque paire de particules une seule fois et calculer le vecteur de force pour les deux et le stocker en elles.

Cela simulera essentiellement les gaz, et si vous leur donnez une force constante, les liquides aussi, je présume.

Quant à la création et à la suppression de particules, j'implémente une classe ParticleEmitter, qui a une position, une direction et quelques autres trucs utiles. Votre exemple serait mieux avec un émetteur qui peut créer des particules dans une certaine plage, ou mieux encore, un rectangle.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.