Cours FX · 3e année · Houdini

Atlas des noises

Les 15 types du menu Noise Type de l'Attribute Noise SOP (et de la Unified Noise VOP), expliqués et manipulables en direct. Choisis un type dans le menu, active Montrer la structure pour voir ce que l'algorithme « voit », et survole l'image pour sonder les valeurs.

Survole l'image pour lire la valeur du noise.
Coupe 1D le long de la ligne pointillée0 → 1
Affichage
Noise Pattern
Taille des motifs. Fréquence = 1 / Element Size.
Fractal
Vue d'ensemble

Les 15 types d'un coup d'œil

Même Element Size, même Offset, pas de fractal : seul l'algorithme change. Clique une vignette pour la charger dans l'explorateur. La couleur de la pastille indique la famille.

Les bases

Pourquoi pas simplement rand() ?

rand() donne une valeur totalement indépendante pour chaque point : deux points voisins n'ont rien à voir. C'est du bruit blanc, de la « neige » de télé. Inutilisable pour déformer une surface ou pousser de la fumée : ça grésille.

Un noise cohérent (Perlin, Worley…) respecte quatre règles :

  • Continu : deux points proches ont des valeurs proches.
  • Déterministe : même position → même valeur, à chaque frame, sur chaque machine. C'est ce qui rend le résultat stable au render et au cache.
  • Taille de détail contrôlée : les motifs ont une taille typique (l'Element Size).
  • Pas de répétition visible, alors qu'il est calculé à partir d'une petite grille.

L'astuce commune : on place du hasard seulement sur une grille (ou sur des points épars), puis on interpole en douceur entre ces points. Compare les trois modes à droite :

  • Value noise : une valeur aléatoire à chaque point de grille, on relie en courbe douce. Simple, mais on devine la grille (les pics tombent sur les points).
  • Gradient noise (le principe de Perlin) : à chaque point de grille on tire une pente aléatoire, et la courbe vaut 0 sur le point. Les bosses tombent entre les points de grille : beaucoup plus naturel.

Un noise, c'est du hasard « rangé » sur une grille, puis lissé. Chaque famille change juste la façon de ranger et de lisser.

Carte mentale

Quatre familles derrière les 15 noms

Le menu de Houdini a l'air long, mais il n'y a que quatre idées. Retiens la famille, tu devines le look.

Gradient sur grille

Fast, Perlin, Perlin Flow, Simplex

Une pente aléatoire à chaque coin d'une grille, interpolation douce. Look : collines, vagues, fumée.

noise() · onoise() · flownoise() · xnoise()
Cellulaire (Worley)

Worley, Manhattan, Chebyshev · F1 / F2-F1

Des points semés au hasard ; on mesure la distance aux plus proches. Look : cellules, cratères, fissures.

wnoise() · mwnoise() · cwnoise()
Convolution éparse

Sparse Convolution, Alligator

Des « tampons » arrondis posés sur des points aléatoires, additionnés ou superposés. Look : blobs, bosses.

snoise() · anoise()
Cloud (fractal distordu)

Perlin, Simplex, Fast Simplex Cloud

Un noise fractal dont chaque couche est déformée par la précédente. Look : nuages cotonneux.

Cloud Noise VOP
Famille 1 · Gradient sur grille

Perlin et ses cousins

Comment ça marche (Perlin), pour un point P :

  1. On trouve la case de la grille qui contient P (4 coins en 2D, 8 en 3D).
  2. Chaque coin possède un vecteur gradient aléatoire mais fixe (tiré d'une table avec un hash des coordonnées du coin : c'est ça, le côté déterministe).
  3. Pour chaque coin : dot(gradient, P − coin). Si P est « dans le sens » de la flèche, la valeur monte.
  4. On mélange les 4 résultats avec une courbe de fade en S (6t⁵−15t⁴+10t³) pour que les jonctions entre cases soient invisibles.

Dans l'explorateur, active Montrer la structure sur Perlin : les flèches orange sont les gradients. Les zones claires sont devant les flèches, les zones sombres derrière.

Les variantes du menu :

  • Fast : basé sur la fonction VEX onoise(). Même principe, calcul moins cher, look légèrement différent. Houdini multiplie sa fréquence par 1.25, donc à Element Size égal les motifs sont plus petits.
  • Simplex (xnoise()) : la grille carrée est remplacée par des triangles (tétraèdres en 3D). Moins de coins à évaluer (3 au lieu de 4 en 2D, 4 au lieu de 8 en 3D, 5 au lieu de 16 en 4D) et moins d'alignements sur les axes. Intéressant en noise animé 4D.
  • Perlin Flow (flownoise()) : au lieu de translater le noise dans le temps, on fait tourner les gradients avec Flow Rotation. Le motif bouillonne sur place au lieu de glisser. Une rotation de 0 à 1 fait un tour complet, donc l'animation boucle parfaitement. Active « Animer la rotation » dans l'explorateur et regarde les flèches.

Perlin vaut toujours « zéro » (0.5 en sortie) pile sur les coins de la grille. C'est pour ça que la doc Houdini conseille un Offset non nul : autour de 0, on voit apparaître des artefacts.

Perlin + structureGrille et gradients de l'octave de base.
FastMême idée, fréquence ×1.25.
Simplex + structureGrille de triangles au lieu de carrés.
Perlin Flow · rotation 0.18Mêmes coins que Perlin, gradients tournés.
Famille 2 · Cellulaire

Worley : tout est question de distance

Comment ça marche :

  1. On découpe l'espace en cases et on sème un point aléatoire par case (les « feature points »).
  2. Pour un point P, on regarde les points des cases voisines (3×3 en 2D, 3×3×3 en 3D).
  3. F1 = distance au point le plus proche. F2 = distance au deuxième plus proche.

F1 vaut 0 sur chaque feature point et grandit en s'éloignant : taches sombres, dômes, cratères. F2 − F1 vaut 0 quand P est à égale distance de deux points, c'est-à-dire pile sur la frontière entre deux cellules : on obtient un réseau de lignes (fissures, écailles, sol sec, caustiques).

Dans l'explorateur, choisis Worley Cellular F2-F1 et survole l'image : la ligne pleine va au point F1, la ligne pointillée au point F2, et le cercle a un rayon égal à F1.

Manhattan et Chebyshev ne changent qu'une chose : la formule de la distance. Le « cercle » de rayon 1 change de forme, et toutes les cellules héritent de cette forme.

Bonus VEX : wnoise() renvoie aussi un seed unique par cellule. @Cd = rand(seed); donne une couleur par cellule, pratique pour des variations par morceau.

F1 = « à quelle distance est le point le plus proche ? ». F2 − F1 = « suis-je près d'une frontière ? ».

Worley F1Sombre sur les points (distance 0).
Worley F2-F1Sombre sur les frontières.
Euclidienne (Worley)√(dx² + dy²)
Manhattan|dx| + |dy|
Chebyshevmax(|dx|, |dy|)
Worley F2-F1Cellules arrondies, organiques.
Manhattan F2-F1Angles à 45°, look circuit.
Chebyshev F2-F1Rectangles, pavés, pixels.
Famille 3 · Convolution éparse

Sparse Convolution et Alligator : des tampons

Imagine un tampon encreur rond et doux (un noyau, ou kernel) : fort au centre, nul à son bord, comme un metaball. On le pose à plein d'endroits aléatoires. C'est la convolution éparse : « éparse » parce qu'on ne pose des tampons qu'à quelques points, pas partout.

  • Sparse Convolution (snoise()) : chaque tampon a un poids aléatoire, positif ou négatif, et on additionne tous ceux qui touchent P. Résultat : des blobs doux, sans grille visible du tout. La doc Houdini parle d'un roll-off « comme un metaball ». Dans les vignettes, les points orange poussent vers le haut, les bleus vers le bas.
  • Alligator (anoise()) : chaque point porte une bosse de hauteur aléatoire, et on garde la plus haute. Là où deux bosses se rencontrent, on obtient un pli net en « V ». Ça ressemble à de la peau d'alligator, d'où le nom. Houdini précise que c'est un cousin du Worley qu'on ne peut pas reproduire exactement avec les fonctions Worley.

Attention à l'échelle : dans Unified Noise, Sparse Convolution a une fréquence ×1.25 et Alligator ×1.64. Passer de Perlin à Alligator sans toucher à l'Element Size donne donc des motifs plus petits.

Sparse = tampons additionnés (blobs). Alligator = on garde la bosse la plus haute (bosses + plis).

Sparse ConvolutionCercles = portée de chaque tampon.
AlligatorTaille du point = hauteur de la bosse.
Sparse en reliefCollines molles.
Alligator en reliefBosses et plis nets.
Pour tous les types

Fractal : empiler des octaves

Un noise seul a une seule taille de détail. La nature, non : une montagne a des crêtes, puis des rochers, puis des cailloux. On empile donc plusieurs copies du même noise, de plus en plus petites et de plus en plus faibles. C'est le fBm (fractional Brownian motion). Dans Houdini, c'est l'onglet Fractal.

  • Max Octaves : combien de couches. Chaque octave coûte un calcul complet de plus.
  • Lacunarity : combien la fréquence est multipliée à chaque couche (2 = deux fois plus petit à chaque fois).
  • Roughness : combien l'amplitude est multipliée à chaque couche (0.5 = deux fois plus faible). Près de 1 = très rugueux, près de 0 = lisse.

Fractal Type change la façon d'additionner :

  • Standard : on additionne tout, partout pareil.
  • Terrain : le détail ajouté est multiplié par la valeur actuelle. Les vallées (valeurs basses) restent lisses, les sommets deviennent accidentés. Comme un vrai relief érodé.
  • Hybrid : proche de Terrain, avec des vallées plus marquées.

Un détail qui compte en FX : le détail plus petit que l'espacement de tes points est perdu, voire se transforme en grésillement (aliasing). 8 octaves sur une grille de 100×100 points, c'est du calcul pour rien. Houdini arrête d'ailleurs d'ajouter des octaves quand il n'y a « plus de place » pour le détail.

Lacunarity = de combien ça rétrécit. Roughness = de combien ça s'affaiblit. Octaves = combien de fois.

StandardDétail uniforme partout.
TerrainVallées lisses, crêtes rugueuses.
HybridContraste vallées / sommets.
Famille 4 · Cloud

Perlin, Simplex et Fast Simplex Cloud

Les trois derniers types du menu viennent de la Cloud Noise VOP (Houdini 20+). Ce sont des fractals avec une astuce en plus : à chaque octave, la position de lecture est décalée selon la pente de l'octave précédente. Les petits détails « glissent » autour des gros volumes, ce qui donne des bords gonflés et cotonneux, comme un cumulus.

  • Distortion : la force et le sens de ce décalage. Positif : vers les valeurs décroissantes ; négatif : vers les valeurs croissantes. Compare −1, 0 et +1 ci-contre.
  • Perlin Cloud : base Perlin. Simplex Cloud : base Simplex, moins d'alignements. Fast Simplex Cloud : autre structure de grille et accumulation moins chère, pour les gros volumes.
  • Dans l'Attribute Noise, ces types débloquent aussi Stretch, Droop (faire « pendre » le noise dans une direction) et Worley Details (ajouter des puffs Worley). À essayer sur un volume de densité.

Cloud = fractal + chaque couche déformée par la précédente → formes de nuage.

Distortion −1
Distortion 0= fractal normal.
Distortion +1
Perlin Cloud
Simplex Cloud
Fast Simplex Cloud
Antisèche

Quel noise pour quel effet ?

Noise TypeFamilleCe qu'il faitLookVEXUsages FX typiques
En production

Les pièges classiques dans Houdini

Location Attribute → rest

Le noise « glisse » sur ma géo animée

Par défaut le noise est lu à la position P. Si la géo bouge, elle traverse le champ de noise, qui a l'air de défiler dessus. Fais un Rest Position SOP avant l'animation et mets rest dans Location Attribute : le noise reste collé.

Offset · Animate Noise · Flow Rotation

Trois façons d'animer

Offset $T*0.25 : le noise translate. Le moins cher, mais ça « glisse ». Animate Noise : noise 4D, évolue sur place, plus cher. Perlin Flow + Flow Rotation $FF/100 : tourbillonne et boucle. Pas $F : toutes les valeurs entières donnent le même résultat (un tour complet).

Noise Type × Element Size

J'ai changé de type et tout a rétréci

Fast et Sparse Convolution ont une fréquence ×1.25, Alligator ×1.64. Réajuste l'Element Size après un changement de type pour comparer à taille égale.

Output Raw Value

Mon noise est tout gris

Brut, un noise tombe surtout autour du milieu de sa plage (distribution en cloche). Output Raw Value off étale les valeurs uniformément. Sinon, joue avec la Remap Ramp, Gain et Contrast.

Offset ≠ 0

Artefacts près de l'origine

Les noises de gradient valent 0.5 sur chaque coin de grille, et plusieurs fonctions ont des zones figées autour de l'origine. Toujours démarrer avec un Offset non nul, par exemple 0.37.

Max Octaves

Détail invisible, calcul visible

Chaque octave recalcule tout le noise. Si ta résolution (points, voxels) ne peut pas afficher le détail, tu paies pour rien, voire tu crées de l'aliasing qui scintille d'une frame à l'autre.

Vector noise sur v

Pour de la vitesse : curl noise

Un noise vectoriel classique crée des « puits » où les particules s'agglutinent. Pour une vitesse (POP, Pyro, advection), préfère curlnoise() ou le Curl Noise VOP : champ sans divergence, les particules tourbillonnent sans se tasser.

Periodic

Texture qui se répète sans couture

Dans Unified Noise, Periodic rend le noise répétable (tiles, loops). Ça ne marche que si Lacunarity = 2, sinon les octaves n'ont plus la même période.

Le fractal Perlin à la main, en VEX

Ce que fait l'Attribute Noise en mode Standard, en simplifié. À coller dans un Point Wrangle, puis cliquer sur le bouton « Create spare parameters ».

// Point Wrangle : displacement fractal le long de N
vector pos = v@rest / chf("element_size") + chv("offset");
float n = 0, amp = 1;
for (int i = 0; i < chi("octaves"); i++) {
    n   += amp * (noise(pos) - 0.5); // Perlin centré sur 0
    pos *= chf("lacunarity");        // ex. 2 : détail 2× plus petit
    amp *= chf("roughness");         // ex. 0.5 : 2× plus faible
}
@P += @N * n * chf("amp");

Worley F2 − F1 et couleur par cellule

Base de fissures, d'écailles ou de pré-fracture.

// Point Wrangle
int   seed;
float f1, f2;
wnoise(v@P * chf("freq"), seed, f1, f2);
f@cracks = f2 - f1;   // 0 sur les frontières
@Cd      = rand(seed); // une couleur par cellule
// Manhattan : mwnoise()   Chebyshev : cwnoise()
Entraînement

Devine le noise

Un type au hasard, un offset au hasard. Retrouve-le à l'œil, comme quand on analyse une référence.

0 / 0