IFT3150 - Simulation de fluides stables en infographie Cynthia Beauchemin Résumé Ce travail a été fait dans le cadre du cours IFT3150 - Projet d informatique à l Université de Montréal à la session d été 2012 et porte sur la simulation de fluides stables en infographie. Il explique l algorithme Stable Fluids [Stam 1999] ainsi que la méthode du vorticity confinement. 1 Introduction La simulation de fluides en infographie est un sujet fascinant et pouvant donner des résultats impressionnants. C est pourquoi je l ai choisi comme sujet dans le cadre de ce projet. Dans ce rapport, nous verrons d abord quel type de système utiliser. Nous expliquerons en détails l algorithme de résolution du système de fluide stable. Nous verrons ce qu est la méthode du vorticity confinement, comment l appliquer et en quoi elle est intéressante. Finalement, nous parlerons brièvement des spécifications du système, de la visualisation des variables ainsi que des améliorations et extensions qui pourraient être apportées. 2 Création du système En simulation de fluides, deux grandes approches sont utilisées : la méthode Lagrangienne et la méthode Eulérienne. La méthode Lagrangienne utilise un système de particules. Chaque particule possède une position x et une vélocité u et optionnellement d autres quantités comme la température par exemple. Les valeurs des particules évoluent dans le temps en fonction de leurs propres valeurs ainsi que des valeurs des particules à proximité. La méthode Eulérienne, quant à elle, s intéresse plutôt à savoir comment évolue le fluide à un point fixé dans l espace. Elle n utilise donc pas de particules, mais plutôt une grille dans laquelle chaque case contient les quantités du fluide en ce point, soit la vélocité, la densité, la température, etc. Dans le cadre de ce projet, c est la méthode Eulérienne qui est utilisée. L espace est donc divisé en une grille dans laquelle les quantités (densité, température, couleur, etc. sont définies au milieu de chaque case, tel qu illustré dans la Figure 1. Les vélocités sont quant à elles définies sur chaque côté des cases plutôt qu au centre. 3 Solveur L évolution dans le temps des vélocités est définie par les équations de Navier-Stokes, soit les équations suivantes : u t = (u u 1 ρ p + ν 2 u + f (1 u = 0 (2 où u est la vélocité, ρ est la densité, p est la pression, ν est la viscosité, f est une force externe, est le gradient et est la divergence. La seconde équation sert à assurer la conservation de la masse. En d autres termes, elle permet de s assurer que la différence entre le flot entrant dans une case et le flot sortant de cette même case est nul. Le traitement de l évolution des vélocités du fluide se fait en quatre grandes étapes séquentielles : ajout des forces externes, advection, diffusion et projection. Chacune de ces étapes est réalisée à chaque pas te temps t et dépend de celui-ci. Nous commençons avec la solution u 0(x = u(x, t (3 où u(x, t est la vélocité à la position x au temps t et nous calculons la nouvelle vélocité au temps t + t. 3.1 Ajout des forces La première étape est la plus simple. Elle correspond au terme f dans l équation de Navier-Stokes. Elle consiste simplement à ajouter les forces externes (comme la gravité, les poussées, etc. pondérées par le pas de temps t. Nous avons : 3.2 Advection u 1(x = u 0(x + tf(x, t (4 L advection permet le déplacement des vélocités. Elle correspond au terme (u u dans l équation de Navier-Stokes. Pour faire l advection, l algorithme de Stam utilise une technique implicite appelée semi-lagrangienne. On se souvient que la méthode Lagrangienne pour la simulation des fluides utilise un système de particule. Ici, la méthode semi-lagrangienne combine l idée d un système de particule avec l utilisation de la grille. Elle suppose qu il y a une particule au centre d une case et se demande : Où était cette particule au pas de temps précédent?. Sachant où elle était au temps t t, on peut obtenir une bonne approximation de sa nouvelle valeur au temps t. Le problème consiste maintenant à trouver le chemin que la particule a parcouru entre le temps t t et t afin de déterminer son origine x P. La façon la plus simple d estimer son origine est d utiliser la formule explicite d Euler. On a alors simplement : x P = x tu(x (5 FIGURE 1: Grilles en 2D et en 3D. Photos tirées de Stam, 1999. Cette méthode peut donner des résultats acceptables mais il est généralement recommendé d utiliser des méthodes plus sophistiquées pour de meilleurs résultats, notamment la méthode de
Runge-Kutta d ordre supérieur. La méthode de second ordre est minimalement recommendée. Elle fonctionne en deux temps, de la façon suivante : x mid = x 1 tu(x 2 (6 x P = x tu(x mid (7 Une fois l origine de la particule déterminée, il suffit maintenant d interpoler les vélocités des cases les plus proches de ce point et d affecter ce vecteur interpolé comme nouvelle valeur de vélocité dans la case. On a donc : u 2(x = u 1(x P (8 La Figure 2 illustre le processus d advection. FIGURE 2: Processus d advection. Photo tirée de Stam, 1999. On remarque que cette méthode est inconditionnellement stable car la valeur interpolée ne peut en aucun cas être plus grande que la plus grande des valeurs des cases autour du point d origine. Cependant, cela fait en sorte que le système perd de l énergie pour la même raison. 3.3 Diffusion L étape de diffusion permet d échanger les quantités entre les cases voisines tel qu illustré dans la Figure 3. Elle correspond au terme ν 2 u dans l équation de Navier-Stokes. additionné sera également trop grand, ce qui entraînera l explosion du système (Voir Annexe B pour voir d où vient la division par h 2. Heureusement, l algorithme de Stam a su palier à ce problème. Tout comme pour le processus d advection, la diffusion utilise une technique implicite qui fonctionne à l envers. On cherche ici plutôt à trouver les vélocités telles que, lorsque diffusées vers l arrière dans le temps, nous donnent les vélocités courantes. L équation devient donc la suivante : u 3(x ν t 2 u 3(x = u 2(x (10 Le problème ici c est que lorsqu on discrédite 2 u 3(x, on se rend compte que toutes les vélocités du côté gauche de l équation sont inconnues! On a donc un très gros système linéaire à résoudre. Heureusement, celui-ci est clairsemé ce qui rend la tâche plus facile. On peut utiliser à peu près n importe quel solveur pour système linéaire. Dans mon projet, la méthode de Jacobi est utilisée car, bien qu un peu plus lente que d autres méthodes, elle est facile à implémenter et permet plus facilement de traiter les frontières internes et externes. Remarque : Lorsqu on simule des fluides à très faible viscosité comme de la fumée, on peut omettre l étape de diffusion sans apercevoir de différence majeure. En effet, dans l équation de Navier-Stokes, le terme de diffusion est ν 2 u. Il devient donc très petit lorsque ν est aussi très petit. Cela nous permet d éviter de résoudre tout un système linéaire et permet donc d accélérer considérablement les calculs. On parle alors de l équation non visqueuse d Euler plutôt que de l équation de Navier-Stokes. 3.4 Projection L étape de projection sert à assurer la conservation de la masse. Elle correspond au terme 1 p dans l équation de Navier-Stokes. ρ C est aussi à cette étape qu entre en jeu la deuxième équation de Navier-Stokes : u = 0. Pour se faire, on utilise le théorème de la décomposition de Hodge qui dit qu un champ de vecteurs est égal à la somme d un champ de conservation de masse et un champ de gradients. Champ de vecteurs Conservation Gradient (a Avant diffusion (b Processus de diffusion (c Après diffusion FIGURE 3: Processus de diffusion L idée générale est de faire partager les valeurs d une case avec ses voisines. La façon explicite de calculer cela est la suivante : u 3(x = u 2(x + ν t 2 u 2(x (9 Cependant, cette méthode devient instable lorsque les quantités se propagent plus loin que leurs voisins immédiats. Ceci peut survenir lorsque la viscosité est trop grande, lorsque le pas de temps est trop grand ou lorsque les tailles des cases sont trop petites. En effet, le terme ν t est un scalaire qui multiplie un vecteur qui sera ajouté h à la vélocité 2 courante. Si ce terme est trop grand, alors le vecteur FIGURE 4: Décomposition de Hodge. Photos tirées de Stam, 1999. Il suffit donc ici de soustraire le gradient de la pression à nos vélocités pour assurer la conservation de la masse. Il faut donc d abord calculer la pression. Celle-ci suit l équation de Poisson suivante : 2 p(x = u 3(x (11 Ici tous les p sont inconnus. Il suffit donc de résoudre ce nouveau système linéaire. Puis on soustrait le gradient de la pression à notre vélocité. C est-à-dire, u 4(x = u 3(x p(x (12 Et voilà! Nous avons terminé de calculer notre nouvelle vélocité.
3.5 Évolution des autres quantités Les autres quantités q du fluide (densité, température, couleur, etc. évoluent dans le temps en fonction de l équation suivante : q t = (u q + κq 2 q + S q α qq (13 où S q est une source, κ q est la constante de diffusion et α q est la constante de dissipation. Celui-ci peut être supprimé si on ne souhaite pas que q se dissipe. On remarque ici une grande similarité avec l équation de Navier- Stokes. En effet, les étapes sont à peu près les mêmes. L ajout des sources (S q, l advection ( (u q et la diffusion (κ q 2 q se font exactement de la même façon que l ajout des forces (f, l advection ( (u u et la diffusion (ν 2 u pour les vélocités. L étape de dissipation est facultative et consiste simplement à diviser notre quantité q par 1+ tα q, ce qui fera légèrement diminuer q. 4 Vorticity Confinement Le vorticity confinement est une méthode qui a été pensée par le Dr. John Steinhoff afin de résoudre l effet de vortex (de tourbillon dans les fluides. L idée générale consiste à repérer les endroits où se forment les vortex et de renforcer ceux-ci. Cette méthode est particulièrement utile lors de l implémentation de fluides stables car l algorithme de Stam perd de l énergie et le vorticity confinement permet de réinjecter des forces dans le système de manière intelligente. Le calcul du vorticity confinement se fait en 3 étapes. On calcule d abord le rotationnel ω du champ de vecteur. ω = u (14 La Figure 5.a illustre les valeurs de ω dans un style rouge/vert pour les valeurs négatives/positives. Il est important de noter que en 2 dimensions on peut considérer ω comme un scalaire, mais celui-ci est en fait un vecteur. En effet, en 2D, ω est un vecteur à trois dimensions dont seule la composante en z est non nulle. Voir l Annexe A.4 pour plus de détails. On calcule ensuite le vecteur N suivant : N = η η où η = ω (15 On obtient donc un champs de vecteur dans lequel les vecteurs pointent vers les centres des vortex les plus proches. La Figure 5.b illustre les valeurs de η. Finalement, on calcule un vecteur de force engendré par le vorticity confinement : f conf = ɛ h (N ω (16 En faisant le produit croisé de N avec ω, on obtient un vecteur orthogonal à ceux-ci, et donc, un vecteur dans le sens du tourbillon tel qu illustré dans la Figure 5.c. Bref, le vorticity confinement est une façon simple mais très efficace d ajouter des effets de tourbillons et de turbulence (lorsque ɛ devient grand dans le fluide. Dans le solveur, cette étape est ajoutée tout de suite après l ajout des forces. (a ω (b η (c f conf FIGURE 5: Vorticity Confinement 5 Spécification et visualisation Le programme a été codé en C++ et roule au niveau du CPU. La visualisation du système se fait en temps réel avec OpenGL. L affichage des densités se fait à l aide d un GL QUADS couvrant la totalité de la fenêtre et sur lequel est appliqué une texture et l affichage des vecteurs se fait à l aide de plusieurs GL LINES. Le programme a été écrit dans un but d apprentissage et permet la visualisation de plusieurs variables du fluide (densité ρ, vélocité u, vorticity confinement (ω, η, f conf. 6 Améliorations et extensions Un grand nombre d améliorations pourraient être apportées à ce projet. Tout d abord, il serait possible d améliorer les performances de différentes façons. Les calculs pourraient être parallélisés pour plusieurs étapes notamment l ajout des forces et l advection. Le programme pourrait plutôt être programmé sur le GPU au lieu du CPU. Le programme pourrait être précalculé avec un pas de temps fixé et être exécuté par la suite avec ses valeurs précalculées. Pour la visualisation en 3D, la simulation pourrait être intégrée dans un système de lancer de rayon. On aurait donc pu avoir une projection perspective et ainsi visualiser le fluide sous n importe quel angle. 7 Conclusion Nous avons vu qu il existait deux grandes approches (Lagrangienne et Eulérienne pour simuler les fluides en infographie et laquelle doit être utilisée pour l algorithme Stable Fluids [Stam 1999]. Nous avons expliqué en détails les quatres grandes étapes de résolution du système de fluide : l ajout des forces, l advection, la diffusion et la projection. Nous avons aussi expliqué la méthode de vorticity confinement qui est très utile pour ajouter des effets de tourbillon ou de turbulence et qui est aussi une bonne façon de réinjecter de l énergie dans le système. Nous avons brièvement parlé des spécifications de l implémentation et de la visualisation des différentes variables du fluide. Finalement, nous avons énoncé différentes possibilités d améliorations et d extensions du système. Cela dit, il en reste certainement beaucoup d autres qu il nous faudra découvrir. A Opérateurs Pour mieux comprendre l équation de Navier-Stokes, on peut considérer le symbole comme un vecteur symbolique de dérivées
partielles spaciale. C est-à-dire, ( = = x, y ( x, y, z en 2D. en 3D. Les opérateurs deviennent alors beaucoup plus faciles à se rappeler. Pour expliquer les opérateurs, j utiliserai s pour désigner un scalaire, u pour désigner un vecteur et f pour désigner l un ou l autre. A.1 Gradient Le gradient retourne tout simplement les dérivées partielles spaciales d une fonction dans un vecteur. En simulation de fluides, les vecteurs u et les quantités q sont fonctions de leurs positions. Le gradient est simplement : ( f f = x, f y, f z A.2 Divergence L opérateur de divergence s applique seulement aux vecteurs. Il sert à mesurer la convergence ou la divergence d un vector en un point. u = u x + v y + w z B Discrétisation Maintenant, afin de résoudre l équation de Navier-Stokes, il faut savoir comment appliquer les dérivées partielles aux vecteurs et aux scalaires. Voici comment : x f i,j,k = (f i+1/2,j,k f i 1/2,j,k /h y f i,j,k = (f i,j+1/2,k f i,j 1/2,k /h z f i,j,k = (f i,j,k+1/2 f i,j,k 1/2 /h On a donc les discrétisations suivantes : f i,j,k = f i+1/2,j,k f i 1/2,j,k f i,j+1/2,k f i,j 1/2,k /h f i,j,k+1/2 f i,j,k 1/2 u i,j,k = ( u i+1/2,j,k u i 1/2,j,k +v i,j+1/2,k v i,j 1/2,k +w i,j,k+1/2 w i,j,k 1/2 /h 2 f i,j,k = (f i+1,j,k + f i 1,j,k +f i,j+1,k + f i,j 1,k +f i,j,k+1 + f i,j,k 1 u = 6f i,j,k /h 2 (w i,j+1/2,k w i,j 1/2,k (v i,j,k+1/2 v i,j,k 1/2 (u i,j,k+1/2 u i,j,k+1/2 (w i+1/2,j,k w i 1/2,j,k (v i+1/2,j,k v i+1/2,j,k (u i,j+1/2,k u i,j 1/2,k /h A.3 Laplacien 2 Le Laplacien 2, qui est aussi écrit sous la forme est tout simplement la combinaison des opérateurs divergence et gradient. On obtient donc : A.4 Rotationnel 2 f = 2 f x + 2 f y + 2 f z Le rotationnel est un opérateur qui sert à mesurer comment un champ de vecteurs tourne autour d un point. En 3D, cet opérateur nous retourne le vecteur suivant : u = w v y z u w z x v u x y Références BRIDSON, R. 2008. Fluid Simulation for Computer Graphics. A K Peter. FEDKIW, R., STAM, J., AND JENSEN, H. W. 2001. Visual simulation of smoke. SIGGRAPH 01 Conference Proceedings, Annual Conference Series. STAM, J. 1999. Stable fluids. SIGGRAPH 99 Conference Proceedings, Annual Conference Series. STAM, J. 2003. Real-time fluid dynamics for games. Proceedings of the Game Developer Conference. Si u est un vecteurs en 2D, alors seul le troisième terme du vecteur obtenu est différent de zéro. On dit alors que le rotationnel donne un scalaire et on écrit plutôt : u = v x u y L opérateur rotationnel peut également s appliquer sur des scalaires. Il faut considérer notre scalaire s comme si on avait plutôt un vecteur tri-dimensionnel (0,0,s. ( s s = (0, 0, s = y, s x
Simulations en 2D Simulations en 3D Dimensions : 64 X 64 Dimensions : 40 X 40 X 40 Projection : Orthographique Éclairage : 2 lumières directionnelles vers X et -Y