Auteur : Saddik Amine

Chapitre 3 TD6 - Nuages volumétriques

Résumé

Ce rapport décrit la mise en œuvre d’un système de nuages volumétriques dans Unity à l’aide du package CloudsToy. Après avoir intégré le prefab CloudsToy dans une scène contenant un terrain montagneux et un contrôleur de déplacement, nous avons paramétré le volume des nuages, mesuré les impacts sur les performances et implémenté des effets d’éclair.

Objectifs

  • Comprendre la différence entre les nuages sprites/skybox et les nuages volumétriques.
  • Mettre en place des nuages volumétriques couvrant un terrain et permettant au joueur de se déplacer à l’intérieur et au‑dessus.
  • Étudier l’interaction entre les nuages et l’éclairage dynamique (cycle jour/nuit).
  • Concevoir un système météo simple (clair, nuageux, orageux) et évaluer les performances.

Matériel et méthode

  • Importation du package gratuit CloudsToy.
  • Création d’un terrain montagneux et peinture de textures.

Terrain montagneux

  • Ajout d’un contrôleur First Person (Capsule + CharacterController + script de déplacement).
  • Insertion du prefab CloudsToy Mngr et ajustement des paramètres (taille de création, multiplicateur de disparition, densité, couverture).
  • Activation des Gizmos pour visualiser les volumes de nuages dans la Scene view.

Vue d'ensemble

Dans la scène, la boîte bleue représente la zone de création des nuages : c’est à l’intérieur de ce volume que les particules se forment et se déploient. La boîte jaune, quant à elle, délimite la zone de disparition : les nuages s’y estompent progressivement au fur et à mesure qu’ils quittent la zone bleue.

L’activation des Gizmos dans la vue Scene permet de visualiser les volumes de simulation (comme les boîtes bleue et jaune). On distingue alors des traînées bleutées autour des nuages, qui rendent visible la forme et la répartition du volume de nuages dans l’espace, facilitant ainsi les réglages de hauteur, densité et portée.

Paramètres utilisés

ParamètreValeurCommentaire
Taille de création (X × Y × Z)1500 × 100 × 1500volume de génération des nuages
Disappear Mult2,0multiplie la boîte de disparition (jaune)
Clouds Num67nombre d’éléments de nuages
Densité / Couverture≈ 0,65 / 0,45contrôle l’épaisseur et la couverture
Vitesse maximum (X / Y / Z)–10 / 0 / 0vent dominant en X
Multiplicateur de vitesse0,85vitesse globale des nuages

Implémentations

En ajustant la hauteur du CloudsToy Mngr, on peut déplacer la couche de nuages dans la scène. Lorsque le joueur s’y engage, il peut littéralement traverser le volume nuageux : la visibilité diminue, l’environnement devient flou et les contours des objets se perdent progressivement, renforçant l’effet d’immersion.

Vue joueur dans les nuages

Dans l’inspecteur du CloudsToy Mngr, plusieurs presets sont disponibles, permettant de modifier rapidement le style des nuages : par exemple un mode orageux (Nimbus 2) pour une ambiance sombre et dense, ou un mode coucher de soleil pour des teintes plus chaudes et diffusées.

Conclusion

Ce TD a permis de comprendre comment intégrer et paramétrer un système de nuages volumétriques dans Unity. En jouant sur la position et les dimensions du volume, on peut créer des nuages qui recouvrent le paysage ou laissent émerger des sommets. Les paramètres offerts par CloudsToy permettent de créer des ambiances variées (clair, nuageux, orage). L’intégration de scripts d’animation jour/nuit et d’effets météorologiques renforce l’immersion et ouvre des perspectives pour des projets plus ambitieux.

Questions Théoriques

Principes de base des nuages volumétriques

Les nuages volumétriques modélisent un volume 3D rempli d’une densité (champ scalaire) qui est rendu en accumulant la lumière le long des rayons (ray-marching). Contrairement aux sprites ou skyboxes 2D, le volumétrique offre profondeur, occlusion interne et interaction crédible avec la lumière.

Pseudo-code Ray-marching

DEFINIR volume_box (position, taille)
DEFINIR paramètres visuels (scale bruit, density, coverage, stepCount)

Pour chaque pixel à l'écran :
    calculer entrée/sortie du rayon dans volume_box
    initialiser transmittance = 1, couleur = 0
    pour t de entrée à sortie par pas = stepSize :
        position_sample = origine + dir * t
        density = Perlin3D(position_sample * scale) * densityMultiplier * coverage
        lightFactor = estimer_contribution_lumiere(position_sample, direction_soleil)
        scatter = density * phase_function(dir, lightDir) * lightColor * lightFactor
        couleur += transmittance * scatter * stepSize
        transmittance *= exp(-density * extinction * stepSize)
        si transmittance < seuil_sortie alors sortir de la boucle
    afficher couleur (appliquer tone mapping)

← Retour à Saddik Amine