Terrains heightfield, biomes et végétation

Sculpter, éroder, masquer et peupler un paysage - de façon non destructive

Un système de terrain procédural complet

Le système Heightfield de Houdini est l'un des workflows de création de terrain les plus capables disponibles dans n'importe quel logiciel VFX. Introduit dans Houdini 16.5, il repose sur une représentation volumétrique de heightmap, traitée par des nœuds SOP dédiés qui permettent de sculpter, éroder, masquer et peupler un terrain de façon entièrement procédurale et non destructive.

Contrairement aux approches où un terrain n'est qu'un maillage déformé, le Heightfield de Houdini est un volume 2.5D : chaque cellule de la grille contient une valeur de hauteur plus un ensemble de couches pouvant stocker des informations supplémentaires - les masques en particulier. Ces masques sont la clé de toute la logique de placement de la végétation, des biomes et des matériaux.

L'approche procédurale signifie que l'on peut modifier un paramètre en amont - la fréquence du bruit générant les montagnes, par exemple - et voir tout le terrain, ses masques, ses biomes et sa végétation se recalculer automatiquement. Cette non-destructivité est ce qui rend le workflow Heightfield si précieux en production.

Générer et sculpter le terrain

Le nœud Heightfield

Tout commence avec le Heightfield SOP, qui crée la grille de base. Ses paramètres principaux définissent toute la scène :

  • Grid Spacing - la taille de chaque cellule en unités Houdini. Une valeur de 1.0 donne une cellule d'un mètre, un bon point de départ pour un terrain à l'échelle humaine.
  • Size X / Size Y - les dimensions générales du terrain. Un terrain de 1024×1024 unités avec un Grid Spacing de 1.0 donne une résolution de 1024×1024 cellules.
  • Height Scale - le facteur d'échelle vertical, permettant d'amplifier ou d'aplatir le relief général sans toucher aux nœuds en aval.
  • Sampling - la résolution effective de la heightmap. Une résolution plus élevée donne plus de détail mais une utilisation mémoire plus lourde.

Nœuds de génération de bruit

Le Heightfield Noise est le générateur de relief principal, appliquant différents types de bruit mathématique à la heightmap pour créer des formes naturelles :

  • Perlin Noise - le classique. Des formes douces et organiques, idéal pour des plaines vallonnées et des collines douces.
  • Simplex Noise - plus naturel que Perlin, avec une régularité moins visible. Largement utilisé pour les montagnes.
  • Billowy Noise - crée des formes bouffantes, parfait pour les dunes de sable ou un terrain façon nuage.
  • Ridged Noise - génère des crêtes acérées et des vallées prononcées - le choix naturel pour les chaînes de montagnes.
  • Distortion - déforme le bruit lui-même pour créer des formes plus organiques et moins régulières.

La clé d'un terrain convaincant est d'empiler plusieurs nœuds Heightfield Noise à différentes fréquences et amplitudes : un bruit basse fréquence pour la forme générale (les grandes montagnes), moyenne fréquence pour les collines secondaires, et haute fréquence pour le détail de surface (rugosité, micro-relief).

Nœuds de sculpture et d'érosion

  • Heightfield Erode - le nœud le plus puissant pour donner à un terrain un aspect naturel. Il simule l'érosion hydraulique (eau) et thermique (gravité) en calculant le déplacement de sédiments à travers la surface, et génère automatiquement au passage plusieurs masques utiles : Flow (zones de drainage), Sediment (dépôts), Curvature.
  • Heightfield Blur - lisse les zones sélectionnées. Utile pour adoucir des transitions trop abruptes ou simuler des plaines sédimentaires.
  • Heightfield Distort by Layer - déforme la heightmap en utilisant une autre couche comme vecteur de displacement, créant des formes complexes impossibles à obtenir avec du bruit seul.
  • Heightfield Terrace - génère des terrasses horizontales, caractéristiques de certains types de roche ou de cultures en terrasses.
  • Heightfield Project - projette un masque ou une image externe sur le terrain pour importer une forme spécifique (un littoral dessiné, une île issue d'une carte, etc.).

Masques de caractéristiques : définir les zones du terrain

Les masques sont le concept central derrière toute la logique de végétation et de biomes dans le workflow Heightfield. Un masque est une couche de heightmap supplémentaire dont les valeurs vont de 0 à 1, représentant l'intensité d'une caractéristique géographique. Ces masques pilotent ensuite le placement des plantes, le choix des matériaux, et la définition des biomes.

Heightfield Mask by Feature

C'est l'outil principal pour générer des masques à partir des caractéristiques géométriques du terrain, en analysant la forme de la heightmap selon le critère choisi :

  • Height - un masque basé sur l'altitude. Les zones hautes approchent 1, les zones basses approchent 0. Utilisé pour définir la neige sur les sommets, la végétation alpine, les zones de toundra. Paramètres : Min Height, Max Height.
  • Slope - un masque basé sur l'inclinaison de la surface. Une pente de 0° (plat) donne 0, une pente de 90° (falaise verticale) donne 1. Essentiel pour distinguer les falaises (pas de végétation) des plaines (végétation dense) - le seuil typique pour exclure les falaises se situe au-delà de 35°.
  • Curvature - un masque basé sur la convexité ou la concavité de la surface. Les zones convexes (crêtes, dômes) et concaves (vallées, bassins) peuvent être masquées séparément - particulièrement utile pour placer humidité et végétation dense dans les creux, et les plantes tolérantes à la sécheresse sur les crêtes exposées.
  • Flow - généré par Heightfield Erode, ce masque marque où l'eau draine naturellement. Idéal pour placer la végétation riveraine (plantes de berge), les zones humides et les marais.
  • Sediment - également issu de l'érosion, il montre où les sédiments se déposent - zones plates et basses. Correspond aux alluvions, aux berges et aux plaines inondables.
  • Occlusion - calcule les zones nichées dans des creux avec peu d'exposition à la lumière du ciel, simulant l'humidité relative : les zones occluses retiennent plus d'humidité et favorisent une végétation différente des zones exposées.

Heightfield Mask by Occlusion

Ce nœud dédié calcule un masque d'occlusion ambiante directement sur le terrain, simulant la proportion de ciel visible en chaque point : une valeur de 1 signifie que le point est totalement exposé (un sommet, une crête), 0 signifie qu'il est entièrement dans un creux (fond de vallée, gorge). C'est l'un des masques les plus utiles pour construire des biomes crédibles, car il corrèle directement avec l'ensoleillement et l'humidité réels.

Combiner les masques

La véritable puissance des masques vient de leur combinaison. Heightfield Layer est l'outil de base pour combiner plusieurs masques via des opérations booléennes ou mathématiques - addition, soustraction, multiplication, minimum, maximum. Un masque de forêt tempérée, par exemple, pourrait combiner :

forest = (low_altitude) × (gentle_slope) × (moderate_flow)

En pratique, cela se traduit par une chaîne de nœuds Heightfield Layer multipliant successivement des masques. Heightfield Remap permet d'ajuster les courbes de transition (falloff) entre zones pour des transitions douces et naturelles plutôt que des coupures nettes.

Le nœud Heightfield Paint

Quand la génération procédurale ne suffit pas, Heightfield Paint permet de peindre manuellement des masques directement dans le viewport - pour corriger localement un masque généré automatiquement, découper des zones d'exclusion spécifiques, ou guider artistiquement le placement de certains éléments. C'est l'outil de finition qui complète l'approche procédurale.

Biomes : organiser la végétation par zone

Un biome est une zone géographique définie par des conditions environnementales spécifiques - altitude, pente, humidité, ensoleillement - qui déterminent ce qui y pousse. Dans Houdini, les biomes ne sont pas un concept logiciel natif en tant que tel, mais une méthodologie que l'artiste construit en combinant des masques pour définir des zones d'appartenance exclusives ou graduées.

Définir des biomes en combinant des masques

L'approche recommandée est de définir chaque biome comme l'intersection de plusieurs masques caractéristiques. Une configuration typique pour un terrain de montagne tempéré :

  • Biome alpin (sommets) - altitude > 80% + pente modérée. Végétation basse, roches, neige. Presque aucun grand arbre.
  • Forêt de conifères - altitude 50-80% + pente < 40°. Épicéa, sapin, pin sylvestre. Sous-bois de fougères et myrtilles.
  • Forêt mixte - altitude 20-50% + pente < 35° + occlusion modérée. Mélange feuillus/conifères, sous-bois riche.
  • Plaine / prairie - basse altitude + pente quasi nulle + fort sediment. Herbe haute, arbustes bas, fleurs sauvages.
  • Ripisylve - fort flow + basse altitude. Saules, aulnes, plantes aquatiques, roseaux.
  • Falaise / éboulis - pente > 40°. Pas de végétation, ou plantes rupicoles (lichen, plantes de falaise).

Ces biomes ne devraient pas avoir de bords durs. Utiliser Heightfield Remap sur chaque masque crée des transitions progressives et des écotones réalistes (zones de transition entre biomes) - dans la nature, les forêts ne s'arrêtent pas à une altitude précise, elles s'estompent sur des dizaines de mètres.

Visualiser et tester les biomes

Avant de lancer le scatter de végétation, il vaut la peine de visualiser les masques de biomes directement sur le terrain. Heightfield Visualize affiche n'importe quelle couche heightfield en couleur dans le viewport, permettant de confirmer que les zones de biomes ont un sens géographique avant de placer la moindre végétation.

La règle des 3×3 : structurer la diversité des plantes

La règle des 3×3 est une méthodologie de plantation qui garantit à la fois diversité visuelle et cohérence écologique dans un environnement naturel. Le principe est simple : pour chaque biome, définir 3 types d'espèces, chacune en 3 tailles (petite, moyenne, grande). Cela produit 9 variations par biome - suffisant pour éviter la répétition visuelle tout en restant gérable en production.

Les trois types

  • Type 1 - Dominants (canopée) - les grands arbres ou arbustes qui définissent la silhouette et le volume du biome, les éléments les plus visibles à distance. Exemple pour une forêt tempérée : chêne, hêtre, épicéa. Ils occupent 20-30% de la surface mais représentent 80% de la masse visuelle.
  • Type 2 - Intermédiaires (strate arbustive) - arbustes, petits arbres et plantes de taille moyenne qui remplissent l'espace entre les dominants et le sol, créant transition visuelle et profondeur. Exemple : noisetier, troène, genévrier, fougère arborescente.
  • Type 3 - Couvre-sol (strate basse) - plantes de sol, herbes, mousse, fleurs, champignons qui couvrent le sol et remplissent les espaces vides - les plus nombreux en densité mais les plus petits. Exemple : fougères, herbes, ronces, myrtilles, mousse.

Les trois tailles

Pour chaque type, préparez trois variantes de taille du même modèle 3D ou de la même espèce, obtenues par mise à l'échelle ou par des modèles distincts :

  • Small (S) - 30-60% de la taille de référence. Jeunes plants, individus rabougris, ou espèces naturellement naines. Densité élevée.
  • Medium (M) - 100% de la taille de référence. L'individu adulte standard. Densité modérée.
  • Large (L) - 130-200% de la taille de référence. Individus exceptionnels, spécimens anciens. Faible densité, fort impact visuel.

La variation de taille ne devrait pas être purement une question d'échelle : idéalement chaque taille varie aussi en forme (branches plus tombantes pour les vieux arbres, silhouette plus élancée pour les jeunes) et en texture (feuillage plus dense et plus sombre pour les adultes). Dans Houdini, cela signifie trois assets séparés dans la bibliothèque, instanciés selon le masque de taille.

Exemple concret : forêt tempérée 3×3

  • Chêne S/M/L - tronc fin / tronc moyen / tronc large avec couronne étalée. Dispersé sur le masque de forêt mixte, faible densité.
  • Noisetier S/M/L - arbuste compact / arbuste étalé / buisson dense. Dispersé sur la strate arbustive, densité moyenne.
  • Fougère aigle S/M/L - petite touffe / touffe moyenne / grande fougère. Dispersée sur le sol forestier, densité élevée.

Cette grille 3×3 donne 9 passes de scatter indépendantes, chacune avec ses propres paramètres de densité, de masque et d'orientation. L'ordre de placement compte : commencer par les grands dominants, puis les intermédiaires, puis le couvre-sol - chaque couche peut utiliser le masque de présence des couches précédentes pour s'y adapter (les fougères poussent à l'ombre des chênes, pas en plein soleil).

Heightfield Scatter : placer la végétation

Le nœud Heightfield Scatter place des éléments sur la surface d'un Heightfield, générant un nuage de points distribué selon les paramètres de densité et de masquage définis. Ces points alimentent ensuite un nœud Copy to Points ou Instance pour placer les modèles 3D de végétation réels.

Paramètres principaux

  • Count - nombre total de points à générer. À noter que c'est une valeur absolue, pas une densité relative - à ajuster selon la taille du terrain.
  • Global Density - un multiplicateur de densité global, permettant d'ajuster rapidement tout le scatter sans toucher à Count.
  • Seed - la seed aléatoire pour la distribution. Changer la seed donne une distribution différente avec les mêmes paramètres - essentiel pour obtenir de la variation entre deux scatters similaires.
  • Relax Iterations - applique un algorithme de relaxation de Poisson pour éviter des points trop groupés, donnant une distribution plus naturelle et moins aléatoire en apparence.
  • Layer Mask - la couche heightfield utilisée comme masque de densité. Les zones à valeur 1 reçoivent la densité maximale, les zones à 0 n'ont aucun point.

Scatter piloté par les masques de biomes

La connexion entre les masques de biomes et Heightfield Scatter se fait via le paramètre Layer Mask. Pour chaque biome et type de végétation, on crée un nœud Heightfield Scatter séparé utilisant le masque correspondant. En suivant l'exemple 3×3 pour une forêt tempérée :

Scatter 1: Oak S      | Mask: mixed_forest × low_altitude | Count: 200  | Seed: 1
Scatter 2: Oak M      | Mask: mixed_forest × low_altitude | Count: 150  | Seed: 2
Scatter 3: Oak L      | Mask: mixed_forest × low_altitude | Count: 50   | Seed: 3
Scatter 4: Hazel S    | Mask: mixed_forest × shade        | Count: 500  | Seed: 4
Scatter 5: Hazel M    | Mask: mixed_forest × shade        | Count: 350  | Seed: 5
Scatter 6: Hazel L    | Mask: mixed_forest                | Count: 150  | Seed: 6
Scatter 7: Fern S     | Mask: forest_floor × occlusion     | Count: 2000 | Seed: 7
Scatter 8: Fern M     | Mask: forest_floor × occlusion     | Count: 1500 | Seed: 8
Scatter 9: Fern L     | Mask: forest_floor                 | Count: 800  | Seed: 9

Chaque Heightfield Scatter produit un nuage de points avec des attributs (position, normale du terrain, pente locale) pouvant être utilisés pour orienter les instances de végétation - les plantes s'alignent naturellement avec la normale du terrain grâce à l'attribut N auto-généré.

Attributs automatiques de Heightfield Scatter

  • P (Position) - la position 3D du point sur la surface du terrain.
  • N (Normal) - la normale de surface au point, pour aligner les instances avec le sol.
  • up - le vecteur vertical du monde, utile combiné à N pour contrôler l'orientation.
  • height - la valeur d'altitude au point, pour varier les paramètres d'instance selon l'élévation.
  • slope - la valeur de pente au point, pouvant moduler la taille ou l'orientation des instances.

Instanciation et variation de modèle

Une fois les points générés, utilisez Copy to Points (pour une géométrie complète) ou Instance (pour des instances GPU légères) pour placer les modèles 3D. Pour appliquer la règle des 3×3, un seul Heightfield Scatter peut piloter une variation aléatoire d'asset via un Attribute Wrangle :

// Assigner aléatoirement l'une des 3 tailles
i@variant = int(rand(@ptnum) * 3);  // 0, 1 ou 2

// Variation d'échelle aléatoire au sein de chaque taille
float scales[] = {0.6, 1.0, 1.5};
f@scale = scales[@variant] * fit01(rand(@ptnum + 42), 0.85, 1.15);

Copy to Points lit ensuite l'attribut variant pour choisir l'asset correspondant dans une liste, et l'attribut scale pour appliquer la mise à l'échelle - produisant une variation naturelle sans multiplier le nombre de nœuds dans le réseau.

Organisation du réseau et performance

Un réseau Heightfield complet peut rapidement devenir complexe avec de multiples couches de masques et passes de scatter. Une organisation rigoureuse est essentielle pour rester lisible et facile à modifier.

Structure recommandée en blocs fonctionnels

  • Bloc Terrain de base - nœuds Heightfield + Heightfield Noise (basse, moyenne et haute fréquence). Sortie nommée OUT_terrain_base.
  • Bloc Érosion - Heightfield Erode avec paramètres d'érosion hydraulique et thermique. Sortie OUT_terrain_eroded, générant les couches Flow et Sediment.
  • Bloc Masques - tous les nœuds Heightfield Mask by Feature et leurs combinaisons, un Null par masque final, explicitement nommé : MASK_altitude, MASK_slope, MASK_flow, MASK_forest, MASK_alpine, etc.
  • Bloc Biomes - combinaison des masques pour définir chaque biome. Sorties nommées BIOME_forest, BIOME_meadow, BIOME_alpine, etc.
  • Bloc Scatter - les 9 passes Heightfield Scatter (une par cellule 3×3), suivies d'un Merge pour consolider tous les points.
  • Bloc Instances - Copy to Points ou Instance sur le nuage de points fusionné. Sortie finale OUT_vegetation.

Conseils de performance

  • Travailler d'abord à basse résolution - commencer avec un grand Grid Spacing (basse résolution) pour mettre en place la logique des masques et du scatter ; n'augmenter la résolution que pour le rendu final.
  • Basculer le flag Display sélectivement - afficher le terrain et les instances en même temps peut être lourd ; travailler sur les masques avec seulement le terrain affiché, puis activer les instances pour les vérifications.
  • Limiter les Relax Iterations - la relaxation de Poisson est coûteuse ; 2-3 itérations suffisent généralement. Réserver des valeurs élevées aux scatters clairsemés où la régularité compte.
  • Précalculer les masques lourds - l'occlusion et l'érosion sont coûteuses à calculer. Utiliser Heightfield File pour les mettre en cache une fois le résultat satisfaisant, et charger le cache pour le reste du pipeline.

Export et intégration pipeline

Exporter le terrain

  • Heightmap PNG/EXR - via Heightfield Output, exportant la heightmap en image 16 ou 32 bits. Un format universel compatible avec Unity, Unreal, et la plupart des moteurs.
  • Maillage Houdini (bgeo/obj/FBX) - via Convert Height Field (SOP), convertissant le heightfield en géométrie polygonale standard pour les matériaux Houdini et le rendu avec Karma ou Mantra.
  • USD - un export complet de scène terrain + végétation via le workflow Solaris - le standard de l'industrie pour les pipelines complexes.

Exporter les masques pour le texturing

Les masques générés pour la végétation sont tout aussi précieux pour le texturing du terrain - les exporter comme textures pour le splat mapping (mélange de textures selon les masques) dans le moteur de rendu :

  • Texture de roche - sur le masque de forte pente.
  • Texture de neige - sur le masque de haute altitude.
  • Texture d'herbe - sur le masque de plaine/sédiment.
  • Texture de terre humide - sur les masques de flow et d'occlusion.

Outils complémentaires et ressources

  • Houdini SideFX Labs - le package gratuit Labs ajoute de nombreux nœuds de terrain supplémentaires, incluant la génération procédurale de routes, de rivières, et une population de biomes avancée. Fortement recommandé.
  • Gaea - un logiciel dédié à la génération de terrain avec un workflow d'érosion très avancé ; les terrains construits dans Gaea peuvent être importés dans Houdini comme heightmaps pour appliquer la logique de végétation ci-dessus.
  • World Creator - une alternative temps réel à Gaea avec un viewport GPU très rapide ; un bon complément à Houdini pour la phase de sculpture artistique.

Documentation