Cours FX · 3e année · Houdini 21

Labo Pyro

Une vraie simulation de fumée et de feu, dans une interface rangée comme celle de Houdini. Joue avec le Pyro Solver pendant que ça tourne, puis descends dans le cours pour comprendre ce que chaque paramètre fait vraiment.

  1. Choisis un setupDans la shelf Pyro FX : fumée, feu, explosion…
  2. Change un paramètrePendant que ça tourne. Les valeurs modifiées passent en gras, comme dans Houdini.
  3. Regarde dedansField Guide affiche un champ, Shape Guide montre où agit un opérateur.
  4. Compare A/BDeux simulations côte à côte, avec et sans un opérateur. Clique un nœud du réseau pour voir ses paramètres.
pyro_lab.hip Labo Pyro
Pyro FX Clique-glisse dans la vue pour pousser la fumée
Scene View /obj/pyro_lab/pyrosolver1
Parameters
Pyro Solver pyrosolver1 Cours ↓
/obj/pyro_lab
Frame1
Les bases

Ce que le solver calcule à chaque pas

Une grille de voxels, quelques champs par voxel, et toujours le même ordre d'opérations. Tout le reste en découle.

Pyro est un solver purement volumétrique : il n'y a pas de particules, seulement une grille de voxels. Chaque voxel stocke quelques valeurs, les champs (fields). La simulation consiste à faire évoluer ces champs, pas de temps après pas de temps.

Retiens surtout ceci : ce qui fait bouger la fumée, c'est le champ vel. La densité, elle, ne fait que se laisser transporter. Tous les paramètres de l'onglet Shape, sauf la dissipation, sont des forces qui modifient vel.

Les champs d'un voxel

Dans le labo, choisis un champ dans Field Guide, en haut de la vue, pour l'afficher : c'est l'équivalent du menu Fields › Field Guide du Pyro Solver. Ou clique directement sur une carte.

vel

Vecteur vitesse. Le moteur de tout le mouvement.

density

La suie visible. Plus c'est dense, plus la fumée est épaisse.

temperature

La chaleur. Normalisée : 0 = air ambiant, 1 = Reference Temp. Fait monter le gaz (buoyancy).

flame

Durée de vie restante du combustible. Sert d'émission au rendu et génère fumée, chaleur et expansion.

divergence

Expansion voulue. Positif = le gaz gonfle (explosion), négatif = il se contracte.

pressure

Champ auxiliaire calculé par la projection. Utile à visualiser, pas à modifier.

speed

Longueur de vel. Optionnel (Calculate Speed Field), pratique comme control field.

L'ordre des opérations

Voici l'ordre documenté par SideFX pour un pas de temps. Le labo suit le même ordre, et l'onglet Performance, sous le réseau, montre le temps passé dans chaque étape.

Deux remarques pour la prod :

  • La projection de pression vient en dernier et coûte le plus cher. C'est elle qui rend le gaz incompressible, qui crée les tourbillons et qui fait gonfler les explosions à partir du champ divergence.
  • Les opérateurs Shape agissent avant la projection. Une force qui pousse le gaz est donc ensuite « corrigée » pour que le volume se conserve : c'est pour ça qu'une poussée crée des rouleaux sur les côtés.
  1. temperature diffusée et refroidieDiffusion, Cooling Rate
  2. Advection de density, temperature, flame, velAdvection Scheme, Wind (passif)
  3. flame vieillit et produit ses sortiesFlame Lifespan, Emit From Flame
  4. density dissipéeDissipation, Clamp Below
  5. SourcingLes volumes de ta Pyro Source
  6. Resize du conteneurBoîte de la fumée + padding ; Sparse : tuiles actives
  7. Forces externesDensity Influences Gravity, nœuds de force
  8. BuoyancyBuoyancy Scale, Ambient / Reference Temp
  9. ViscosityFlou sur vel
  10. Shape operatorsDisturbance, Shredding, Turbulence
  11. Projection de pressionvel sans divergence, sauf où divergence le demande
Onglet Shape

Les forces qui sculptent la fumée

Certains opérateurs décident où va le gaz, d'autres ajoutent du détail sans changer ce mouvement, et un seul lisse. SideFX conseille de régler le mouvement global d'abord, et le détail en dernier.

Mouvement global

Où va le gaz, et à quelle vitesse.

Détail

Casse les formes sans changer le mouvement global.

Lissage

L'inverse du détail : un mouvement plus cohérent.

Le point commun : le control field

Presque chaque opérateur a trois étages qui décident où il agit :

  1. Un Threshold Field avec une plage. Par défaut, Disturbance n'agit que là où density est quasi nulle, Turbulence là où temperature dépasse 0.01, Shredding là où il y a de la flame.
  2. Un Control Field optionnel : la valeur d'un champ est ramenée de la Control Range vers 0–1, puis passe éventuellement dans la Control Ramp.
  3. Le résultat multiplie la force globale (le slider principal).

Autrement dit, un control field est un masque. Utilise Shape Guide dans le labo pour voir ce masque : c'est l'équivalent du menu Shape › Shape Guides de Houdini.

temperature ex. 0.35 fit(0.1 → 0.6) = 0.5 Control Ramp × Disturbance force locale
Valeur du champ → plage 0–1 → courbe (optionnelle) → multiplie la force globale.

Buoyancy

Shape › Buoyancyactivé par défaut
Ce que ça fait

L'air chaud est moins dense que l'air ambiant, donc il monte. Buoyancy ajoute à vel une accélération vers le haut qui dépend de la temperature de chaque voxel.

Comment

Le champ temperature est normalisé : 0 correspond à Ambient Temp (300 K) et 1 à Reference Temp (3000 K). Le solver convertit en kelvins, puis calcule la poussée avec la gravité (9.8). Plus l'écart avec l'ambiant est grand, plus ça monte vite. Une température négative ferait descendre le gaz.

Réglage

SideFX conseille de fixer Ambient/Reference Temp et Gravity une fois pour toutes, puis de régler la vitesse de montée avec Buoyancy Scale. Le Cooling Rate (onglet Fields) décide à quelle hauteur la fumée ralentit : regarde où la montée s'essouffle.

L'inverse

Density Influences Gravity fait tomber la fumée dense. Utile pour de la fumée lourde, des nuées ardentes, de la poussière (setup Fumée lourde de la shelf).

Disturbance

Shape › Disturbancedéfaut 0.5 · Block-Based
Ce que ça fait

Ajoute des petites forces aléatoires pour casser les formes trop lisses, surtout les « champignons » réguliers au sommet de la fumée, sans changer le mouvement global. Ces poussées aléatoires s'annulent en moyenne.

Comment (Block-Based)

L'espace est découpé en blocs de Base Block Size. Chaque bloc reçoit un vecteur aléatoire constant, tenu pendant Pulse Length secondes, puis retiré au sort. On empile plusieurs couches de blocs de plus en plus petits (Max Octaves, Lacunarity, Roughness), comme un fractal de noise.

En mode Continuous, chaque voxel a son propre vecteur, renouvelé à chaque frame : détail au plus petit possible, vite bruité.

Le piège du Threshold

Par défaut, Threshold Field = density et Threshold Range = 0.05 → 0. Disturbance n'agit donc que là où il n'y a presque pas de fumée : dans l'air autour et sur les bords fins. Elle imite l'air ambiant agité qui grignote la fumée. Active le Shape Guide pour le voir : la zone dense reste noire.

Quand l'utiliser

Fumée qui monte en blocs lisses, caps trop ronds, avalanche (mode Continuous).

Turbulence

Shape › Turbulencedéfaut 0.1 · Swirl Size 1
Ce que ça fait

Ajoute des grands tourbillons qui brassent la fumée : rouleaux, masses qui se tordent. SideFX la réserve au « bas » des fréquences : gros mouvement, et on laisse Disturbance et Shredding faire le petit détail.

Comment

Un noise (Simplex ou Fast Simplex) calculé dans l'espace, qui évolue dans le temps selon Pulse Length, est transformé en champ de rotation (un curl noise) puis ajouté à vel. Swirl Size est la taille des tourbillons en unités. Max Octaves ajoute des couches deux fois plus petites, pondérées par Roughness.

Threshold

Par défaut elle n'agit que là où temperature > 0.01 : dans le gaz chaud, pas dans l'air. C'est aussi une optimisation, avec moins de voxels à traiter.

Quand l'utiliser

Fumée qui monte trop droit, feu rapide qui manque de caractère, colonnes d'explosion.

Le piège

Trop de turbulence donne un look « noise plaqué » : tout se tortille pareil.

Shredding

Shape › Shreddingdéfaut 0.5 · dans la flame
Ce que ça fait

Donne au feu ses langues et ses déchirures. Sans shredding, un feu est dominé par des grandes langues verticales, molles et régulières.

Comment

Même générateur de blocs aléatoires que Disturbance, mais appliqué en rotation : la vitesse de chaque voxel est tournée vers une direction aléatoire, sans changer sa longueur. Le flux est redirigé sans accélérer ni ralentir, donc le feu garde sa vitesse de montée mais se déchire.

Threshold

Threshold Field = flame, plage 0.1 → 1 : il n'agit que dans les flammes, et plus fort là où la flame est jeune.

Quand l'utiliser

Tout feu. Commence vers 0.5–1 avec des blocs proches de la taille d'une langue de feu.

Le piège

Trop fort, le feu devient du bruit aléatoire.

L'ancien Pyro Solver (avant H18) avait un shredding différent, basé sur le gradient de température avec Squash et Stretch. Tu le croiseras dans de vieux tutos.

Wind

Shape › WindWind Speed 1 · direction (1, 0, 0)
Ce que ça fait

Un vent passif : il est ajouté seulement au moment de l'advection. Tout est transporté par vel + wind, mais vel lui-même ne contient pas le vent.

Conséquence

Si tu affiches speed ou les flèches de vitesse, tu ne vois pas le vent. Et comme il ne passe pas par la projection, il ne crée pas de tourbillons à lui seul : il penche et transporte la colonne. Pour un vent qui interagit vraiment (rafales, obstacles), on source une vitesse ou on utilise un nœud de force.

Le piège

Le vent fait sortir la fumée plus vite du conteneur : en sparse, pense au padding et aux substeps si le vent est fort.

Flame Expansion

Shape › Flame ExpansionExpansion Rate 0.7
Ce que ça fait

Là où il y a de la flame, le gaz gonfle. C'est ce qui fait qu'une boule de feu continue à s'étendre et à rouler en montant, bien après la détonation.

Comment

La flame est ramenée de Flame Range vers 0–1, multipliée par Expansion Rate, et ajoutée au champ divergence. La projection de pression fabrique ensuite des vitesses qui sortent de ces zones. Une valeur négative aspire le gaz.

Le piège

Avec de la divergence, garde Advection-Reflection sur Disabled (conseil SideFX pour les explosions).

Viscosity

Shape › Viscosityoff par défaut
Ce que ça fait

Un flou sur vel. Les voxels voisins sont forcés d'aller dans la même direction : mouvement plus cohérent, fluide, « sirupeux ». À 0, les voxels bougent librement et le résultat est plus chaotique.

Quand l'utiliser

Fumée lente et élégante, flamme de bougie, vapeur, lave gazeuse, ou pour calmer une sim trop bruitée.

Le piège

C'est l'opposé des opérateurs de détail : n'empile pas beaucoup de viscosity avec beaucoup de disturbance.

Onglet Fields

Ce que deviennent la fumée, la chaleur et la flamme

Trois champs, trois façons de disparaître : la fumée se dissipe, la chaleur refroidit, la flamme se consume et fabrique le reste.

Density · Dissipation

Fields › Density
Dissipation

Fait disparaître la fumée avec le temps. D'après la doc du solver sparse, 0.1 retire 10 % de la fumée tous les 1/24 de seconde, et 1 la fait disparaître immédiatement. C'est multiplicatif : la fumée s'estompe en douceur vers 0.

Clamp Below

Force à 0 les densités minuscules (0.005). En sparse, c'est important : sinon ces traces invisibles gardent la zone active énorme et la sim ralentit.

Astuce

Avec un control field sur temperature, tu peux faire disparaître la fumée froide plus vite que la chaude.

Temperature · Diffusion et Cooling Rate

Fields › Temperature
Cooling Rate

Ramène la température vers 0, l'air ambiant (0.5 par défaut). Comme la température pilote la buoyancy, c'est lui qui décide à quelle hauteur la fumée arrête de monter vite.

Diffusion

Floute la température : la chaleur s'étale, les bords sont plus doux et la poussée plus uniforme.

Flame · Lifespan et Emit From Flame

Fields › Flame
Plus de fuel

Depuis Houdini 18, il n'y a plus de fuel qui s'enflamme dans le solver. Tu sources directement un champ flame, qui représente la durée de vie restante du combustible. Flame Lifespan (2 s) est le temps pour consommer une valeur de 1.

Trois sorties

En vieillissant, la flame peut produire trois sorties, chacune avec sa Flame Range : de la fumée (Density › Emit From Flame), de la chaleur (Temperature › Emit From Flame) et de l'expansion (Shape › Flame Expansion). Exemple classique : chaleur quand la flame est jeune, suie quand elle s'éteint.

flame = 1 (source) flame = 0 (éteinte) le temps passe → la flame décroît de 1/Lifespan par seconde Temperature · Flame Range 0.5–1 Smoke · 0.1–0.4 Expansion · Flame Range 0.2–1
Exemple tiré de la doc SideFX : chaleur au début de la vie, suie vers la fin.
Onglets Setup et Advanced

Résolution, pas de temps, advection

Les réglages qui décident de la précision et du coût de la sim, avant même de parler de look.

Voxel Size

La taille d'un voxel. Diviser par 2 donne 8 fois plus de voxels en 3D (4 fois dans ce labo 2D), donc 8 fois plus de mémoire et de temps. SideFX conseille de régler le look à basse résolution puis de monter : le solver est conçu pour que le résultat reste proche.

Time Scale, Substeps, CFL

Time Scale ralentit ou accélère la sim (on peut l'animer pour le souffle initial d'une explosion). Max Substeps autorise plusieurs sous-pas par frame ; le CFL Condition décide combien : un sous-pas ne doit pas déplacer le gaz de plus de CFL voxels. Symptôme d'un manque de substeps sur une sim rapide : des traînées et des escaliers.

Advection Scheme

L'advection transporte les champs. Semi-Lagrangian remonte le courant une fois et interpole : simple, mais ça floute à chaque pas. Modified MacCormack (défaut) fait un aller-retour pour estimer l'erreur et la corriger : détails plus nets. BFECC ajoute encore un passage : le plus net, le plus cher. Clamp Values › Revert évite les valeurs aberrantes que la correction peut créer.

Advection-Reflection

Réinjecte une partie de l'énergie que la projection enlève : les tourbillons tiennent plus longtemps. Single-Project coûte presque rien, Double-Project est plus propre mais double le coût (le labo propose Single-Project). À laisser sur Disabled quand il y a de la divergence.

Sparse, Dense, Minimal OpenCL

Dans les deux modes, le conteneur suit la fumée à chaque pas : c'est la boîte qui englobe les voxels où les Reference Fields (density flame) sont positifs, agrandie de Padding (0.3), sans dépasser la taille max. Au-delà, il n'y a pas d'air simulé : le bord est ouvert.

Dense calcule toute cette boîte. En Sparse (le défaut), le solver ne calcule en plus que les tuiles actives de la boîte, celles proches de la fumée. Ailleurs, c'est du vide, et la Reset Rule par défaut (All Inactive) remet vel et temperature à 0. Deux bouffées éloignées s'ignorent donc tant que leurs zones ne se touchent pas.

Minimal OpenCL tourne sur la carte graphique en temps réel : idéal pour régler les étapes de ce cours de manière interactive dans Houdini.

Conséquences pratiques :

  • Une force appliquée dans l'air vide ne fait rien : dans le labo, « Pousser » loin de la fumée n'a aucun effet. Utilise « Chauffer + fumée ».
  • Le Padding change le mouvement. Avec un bord ouvert tout près du nuage, l'air s'échappe facilement et une boule chaude monte plus vite qu'au milieu d'un grand volume d'air. Trop petit, il coupe la fumée en escaliers.
  • Pense à Clamp Below : des densités minuscules agrandissent le conteneur pour rien.
Onglet Look · méthode

Regarder, puis régler dans le bon ordre

Le Look ne change pas la simulation, seulement ce que tu vois. Et la méthode de SideFX évite de tout re-régler à chaque étape.

Look (viewport et rendu)

L'onglet Look ne change pas la simulation, seulement son affichage (et le Pyro Shader si tu l'assignes).

  • Density Scale : épaisseur de la fumée. Shadow Density : force des ombres internes, qui donnent du volume.
  • Fire Intensity Volume (défaut flame) et Intensity Scale : où et combien ça brille.
  • Fire Color Volume (défaut flame) et Color Mode : Color Ramp, ou Physical Blackbody qui convertit la température en couleur physique à partir de Reference Temp.
Essaie

Charge le setup Feu, puis dans l'onglet Look passe Fire Color Volume sur temperature et Color Mode sur Physical Blackbody : les zones chaudes deviennent blanc-jaune, celles qui refroidissent rouge sombre.

La méthode conseillée par SideFX

Chaque étape change peu les précédentes : on itère sur peu de paramètres à la fois.

  1. Soigner la sourceAvec du noise : Worley F2-F1 pour la base d'un feu (voir l'Atlas des noises).
  2. La sim de baseVoxel size, substeps.
  3. Température et buoyancyLa vitesse et la hauteur de montée.
  4. FlameLifespan et sorties.
  5. Shape operatorsEn dernier, pour le détail.
En production

Recettes et diagnostics

Trois points de départ éprouvés, puis une grille pour savoir quel paramètre regarder quand quelque chose cloche.

Fumée

  • Source density + temperature, avec du noise pour casser l'émission.
  • Buoyancy Scale pour la vitesse de montée, Cooling Rate pour la hauteur.
  • Dissipation 0.05–0.2, Clamp Below activé.
  • Disturbance pour casser les caps, un peu de Turbulence pour les grands mouvements.

Feu

  • Source flame + temperature, noise Worley F2-F1 sur la base.
  • Flame Lifespan court (0.3–1 s) : il règle la hauteur des flammes.
  • Temperature › Emit From Flame en Pull, fumée émise quand la flame s'éteint.
  • Shredding pour les langues, Turbulence légère, Disturbance faible.

Explosion

  • Source courte (quelques frames) avec divergence forte : le souffle.
  • Flame Expansion pour que la boule continue à gonfler.
  • Advection-Reflection sur Disabled, substeps en hausse.
  • Turbulence et Disturbance pour les rouleaux, Ground plane si ça part du sol.

Diagnostics

SymptômeParamètre à regarderPourquoi
Caps de fumée lisses, en champignonDisturbance (Block Size ≈ taille des détails voulus)Casse les bords sans changer le mouvement global.
Feu mou, grandes langues verticalesShredding, Flame LifespanLe shredding redirige le flux dans la flamme ; le lifespan règle la hauteur.
Colonne trop droite, sans vieTurbulence (Swirl Size ≈ largeur de la colonne)Ajoute les grands brassages.
La fumée monte trop haut / pas assezBuoyancy Scale, Cooling RateLa poussée vient de la température ; le refroidissement la coupe.
Traînées ou escaliers sur une sim rapideMax Substeps, CFL, PaddingLe gaz traverse trop de voxels par pas.
Détails qui fondent, tout est flouAdvection Scheme, Voxel SizeSemi-Lagrangian floute à chaque pas ; la résolution limite le détail.
Sim sparse de plus en plus lenteDissipation › Clamp BelowDes densités minuscules gardent la zone active.
Explosion instable, qui explose numériquementAdvection-Reflection = DisabledRecommandé dès qu'il y a de la divergence.
Fines traînées alignées sur les axesAdvanced › Hourglass FilteringFiltre les modes parasites de la grille.