Vous pouvez créer divers effets avec des systèmes de particules. Dans cet article, je vais décrire un moyen simple de les améliorer en ajoutant des turbulences. Je vais commencer par un système de particules 2D pour plus de simplicité. Les exemples de code sont en Javascript, mais ce sont surtout des mathématiques, il est donc facile de les adapter à une autre langue..
Articles SimilairesCommençons par créer un système de particules régulier en 2D. Nous allons utiliser des sprites simples avec:
X
, y
.vx
, vy
.Pour chaque particule, nous mettons à jour la vitesse en premier. Dans ce cas, nous atténuons un peu le mouvement pour rendre le mouvement plus intéressant et réaliste. Des forces comme la gravité ou le vent peuvent également être appliquées ici.
var amortissement = 1-0.005 this.vx * = amortissement this.vy * = amortissement
Ensuite, nous mettons à jour la position en utilisant la vélocité. Nous utiliserons un pas de temps fixe pour ce tutoriel. Si votre pas de temps varie, vous devrez multiplier la vitesse par votre delta temporel pour obtenir le changement de position..
this.x + = this.vx this.y + = this.vy
Nous réduisons un peu les particules pour simuler des bouffées de fumée en expansion.
this.scaleAll (1.01)
Nous réutilisons les particules au lieu de les enlever et de les ajouter, car nous voulons un flux constant ici:
this.life- = 1 if (this.life<=0) this.respawn(particleLifetime)
Et enfin, nous mettons à jour la transparence des particules pour les faire disparaître progressivement.
this.alpha = this.life / particleLifetime
le renaître
méthode ne fait que définir les valeurs initiales de la particule. Il est également utilisé pour peupler le système de particules au démarrage.
this.x = jaws.width * (Math.random () * 0.1-0.15) this.y = jaws.height * (0.45 + Math.random () * 0.1) this.vx = Math.random () * 2+ 4 this.vy = (Math.random () + Math.random () + Math.random () - 1.5) * 2 this.life = la vie this.scaleTo (1)
La caractéristique déterminante de la turbulence est le tourbillon. Ainsi, la manière simple et directe de simuler la turbulence est de créer un objet vortex qui affecte le mouvement des particules..
Commençons par calculer la vitesse dans le vortex, comme s'il s'agissait d'une roue pleine..
La vélocité au point sur le volant. Image de la roue par Pearson Scott Foresman de Wikimedia Commons.Premièrement, nous avons besoin d’un vecteur du centre de vortex à la particule:
var dx = particule.x-vortex.x var dy = particule.y-vortex.y
Ensuite, nous faisons pivoter ce vecteur de 90 degrés pour en former un orthogonal et nous le multiplions par la vitesse de rotation du vortex:
var vx = -dy * vortex.speed var vy = dx * vortex.speed
Génial, nous avons la vitesse que le vortex essaie de forcer sur les particules, mais comment l’appliquons-nous??
Nous avons besoin d’un facteur de pondération qui sera 1 au centre du vortex et disparaîtra avec la distance.
Nous allons utiliser cette formule ad-hoc, basée sur la distance carrée inverse, mais en évitant la singularité au centre:
facteur var = 1 / (1+ (dx * dx + dy * dy) /vortex.scale)
Appliquons la vitesse du vortex en la mélangeant avec la particule:
particule.vx + = (vx-particule.vx) * facteur particule.vy + = (vy-particule.vy) * facteur
Ça y est, nous avons un vortex qui affecte les particules maintenant!
Un seul vortex statique est utile pour déterminer comment l'appliquer aux particules, mais nous voulons plusieurs vortex et nous voulons qu'ils se déplacent. Faisons-les simplement dans un autre système de particules (invisible)! Donc, maintenant, ils ont aussi la vitesse et la durée de vie. Cela nécessitera quelques modifications au code.
Lors du calcul de la vitesse dans le vortex, nous devons également ajouter le mouvement du vortex:
var vx = -dy * vortex.speed + vortex.vx var vy = dx * vortex.speed + vortex.vy
Et nous souhaitons que les tourbillons disparaissent et disparaissent progressivement, et pas seulement qu'ils apparaissent soudainement. Appliquons une courbe simple au facteur de pondération:
var lifeFactor = vortex.life / vortexLifetime factor * = (1-lifeFactor) * lifeFactor * 4
Dans l'exemple de ce tutoriel, j'utilise plusieurs vortex qui se déplacent de manière similaire aux particules mais ont une durée de vie un peu plus courte. Cependant, déplacer les vortex de différentes manières, ainsi que régler leur vitesse de rotation et leur portée, peut produire une pléthore d'effets différents.
Par exemple, puisqu'un vortex essaie de déplacer des particules, un vortex statique tente d'empêcher les particules de le traverser et de les placer dans un tourbillon. Vous pouvez utiliser cet effet pour créer une zone turbulente qui ralentit les particules qui y entrent..
Vous pouvez créer des tourbillons lorsqu'un personnage se déplace dans le jeu ou lorsqu'un objet s'écrase sur le sol..
Rue de vortex de Kármán causée par le vent qui entoure les îles Juan Fernández au large de la côte chilienne. Image de Bob Cahalan de Wikimedia Commons.Un effet de turbulence courant est vortex street, qui est également facile à recréer, pour un objet statique dans le flux ou pour un objet se déplaçant rapidement..
Vous pouvez également entrer en collision avec l'environnement avec des tourbillons ou laisser le mouvement du personnage les affecter.
Je n'ai pas fait tourner les particules dans l'exemple. Il est facile d’ajouter et d’améliorer le système de particules habituel, mais il peut être encore amélioré en utilisant des vortex. Il suffit de mélanger la vitesse de rotation des particules avec le vortex comme nous l’avons fait avec la vitesse linéaire.
Vous pouvez améliorer le mouvement de vortex en laissant d'autres tourbillons l'affecter, comme avec des particules.
Différentes fonctions de pondération de vortex peuvent produire des résultats différents. Je viens d'utiliser un modèle ad-hoc qui a fonctionné pour cet exemple, mais vous pourriez en trouver d'autres plus adaptés à votre cas. Quasiment tout ce qui disparaîtra avec la distance du centre fera.
La technique est également facile à utiliser en 3D. Utilisez des vecteurs 3D pour les positions et les vitesses (y compris la vitesse angulaire de vortex) et calculez la vitesse dans le vortex en utilisant le produit croisé:
Vecteur3 r = particule.position-vortex.position; Vector3 v = Vector3.Cross (vortex.angularVelocity, r);
Bien sûr, ce n'est pas le seul moyen de créer de la turbulence, ni le seul moyen de créer des vortex. Regardons quelques autres.
Nous utilisions la liste des vortex au niveau du système de particules. C'est assez efficace, mais vous pouvez stocker un vortex (ou plusieurs) dans chaque particule.
Bien qu'il ait besoin de plus de mémoire, il améliore la localisation des données et permet de personnaliser davantage le mouvement des particules. Vous pouvez randomiser un peu le vortex pour chaque particule ou utiliser plusieurs couches de vortex pour rendre le système de particules 2D plus 3D..
Au lieu de stocker la liste des tourbillons dans le système de particules, elle peut être rendue globale. Cela économise de la mémoire et du temps CPU mettant à jour les vortex. Il est également facile d'ajouter de nouveaux vortex causés par le mouvement des personnages, des collisions de vortex avec l'environnement, etc..
Vous pouvez choisir un itinéraire plus réaliste et effectuer une simulation physique réelle du flux. C'est probablement trop lourd pour tout ce qui est de taille moyenne en 3D sans calcul GPU, mais tout à fait réalisable en 2D. Il existe des méthodes basées sur une grille (vous en voudrez des multi-résolutions pour la performance) et des particules. En outre, envisagez d’ajouter du tourbillon perdu en utilisant du bruit, il existe des documents sur ce sujet..
Au lieu de faire une simulation physique complète ou des tourbillons de type particule, vous pouvez stocker le tourbillon dans une grille. Mémorise les vitesses angulaires et linéaires et les propage à chaque pas de temps. Ensuite, dans votre système de particules, échantillonnez la grille pour trouver la vitesse de vortex affectant la particule..
Ce n’est pas aussi réaliste que la simulation fluide, mais c’est beaucoup plus rapide, car il n’est pas nécessaire de résoudre les équations de pression sur l’ensemble du réseau, mais simplement de propager et d’abaisser les vitesses..
Si vous voulez juste beaucoup de turbulences chaotiques sans vortex prononcés ("bouillonnement"), utiliser du bruit procédural pourrait être une meilleure idée. Recherchez le bruit Perlin ou simplex. Vous aurez besoin d'une dimension supplémentaire pour pouvoir animer le bruit. Donc, pour la 2D, il faut que le bruit 3D défile dans la troisième dimension avec le temps, et le bruit 4D pour la 3D.
Vous pouvez échantillonner le bruit plusieurs fois à certains décalages fixes pour obtenir des composantes de la force affectant votre particule..
Maintenant, vous pouvez améliorer vos effets de particules en ajoutant un système secondaire de particules vortex. Imaginez une explosion provoquée par une fusée forçant la fumée à proximité à tourbillonner autour du rayon de l'explosion, ou des feuilles tourbillonnant lorsqu'elles flottent sur une rivière. Expérimentez comment vous créez et déplacez des vortex pour obtenir l'effet souhaité ou découvrez quelque chose de nouveau!