2.3.5 Utilisation des effets atmosphériques

Vous savez que vous avez fait trop de raytracing quand ...
... Vous voulez tricher et voir le code source de la nature.
-- Mark Stock

POV-Ray offre une variété d'effets atmosphériques (caractéristiques qui affectent l'arrière-plan ou l'air ambiant).

Il est facile d'assigner une couleur ou une palette complexe de couleurs à un ciel. Vous pouvez tout créer, depuis un ciel d'été bleu limpide, jusqu'à un ciel orageux, lourdement nuageux. Même les ciels étoilés peuvent être aisément créés.

Vous pouvez utiliser différentes sortes de brouillard. De multiples brouillards stratifiés de différentes couleurs peuvent ajouter une touche magique à la scène.

Un effet encore plus réaliste peut être créé en utilisant une atmosphère, un brouillard constant qui interagit avec la lumière provenant des sources lumineuses. Les faisceaux de lumière deviennent visibles et les objets jettent des ombres dans le brouillard.

Enfin et pas le moindre, vous pouvez ajouter un arc-en-ciel à votre scène.

2.3.5.1 L'arrière-plan

La caractéristique background est utilisée pour assigner une couleur à tous les rayons qui ne touchent pas d'objet. Cela est fait de la manière suivante.

camera {
	location <0, 0,-10>
	look_at <0, 0, 0>
}
background {color rgb <0.2, 0.2, 0.3>}
sphere {
	0, 1
	pigment {color rgb <0.8, 0.5, 0.2>}
}

L'arrière-plan devient visible si un ciel est utilisé et si une translucidité persiste après que tous les pigments stratifiés aient été calculés.

2.3.5.2 Le ciel

Le sky_sphere peut être utilisé pour créer aisément un ciel couvert de nuages, une nuit étoilée ou un quelconque ciel de votre choix.

Dans les exemples suivants, nous commencerons avec un simple ciel qui deviendra de plus en plus complexe, à mesure que nous lui ajouterons des caractéristiques.

2.3.5.2.1 Création d'un ciel avec une couleur graduelle

A côté du ciel uni qui est couvert par la caractéristique background, le ciel le plus simple est une couleur graduelle. Vous devez avoir noté que la couleur du ciel varie avec l'angle de la normale à la surface de la terre. Si vous regardez au-dessus , le ciel est normalement d'un bleu plus profond qu'à l'horizon.

Nous voulons modéliser cet effet en utilisant un ciel comme dans la scène suivante (skysph1.pov).

#include "colors.inc"
camera {
	location <0, 1,-4>
	look_at <0, 2, 0>
	angle 80
}
light_source {<10, 10,-10> White}
sphere {
	2*y, 1
	pigment {color rgb <1, 1, 1>}
	finish {ambient 0.2 diffuse 0 reflection 0.6}
}
sky_sphere {
	pigment {
		gradient y
		color_map {
			[0 color Red]
			[1 color Blue]
		}
		scale 2
		translate -1
	}
}

La partie intéressante est la déclaration du ciel. Elle contient un pigment qui décrit l'apparence du ciel. Nous voulons créer une couleur graduée le long de l'angle de vue mesuré vis à vis de la normale de surface. Puisque le vecteur de direction du rayon est utilisé pour calculer les couleurs du pigment, nous utilisons le gradient y.

Le dimensionnement et le déplacement sont utilisés pour répartir les points dérivés du vecteur de direction vers la bonne portée. Sans ces transformations, le motif serait répété deux fois. La déclaration scale est utilisée pour éviter la répétition, et le translate -1 place la couleur de l'index zéro au bas du ciel (c'est le point du ciel sous vos pieds).

Après cette transformation, la couleur de l'entrée 0 est au bas de la sphère, sous nous, et la couleur de la position 1 est au sommet, au-dessus de nous.

Les couleurs de toutes les autres positions sont interpolées de ces deux couleurs, comme le montre le résultat.

Un simple ciel graduel
Un simple ciel graduel

Si vous voulez qu'une couleur démarre à un angle précis, vous aurez d'abord à convertir l'angle en index de palette. Cela est fait avec la formule color_map_index = (1 - cos(angle)) / 2 où l'angle est mesuré par rapport à la normale négative de la surface de la terre. C'est la normale pointant vers le centre de la terre. Un angle de 0 degrés décrit le point sous nos pieds, 180 degrés représente le zénith.

Dans POV-Ray vous devez d'abord convertir la valeur en degrés en valeur en radians, comme c'est montré ici.

sky_sphere {
	pigment {
		gradient y
		color_map {
			[(1-cos(radians(30)))/2 color Red]
			[(1-cos(radians(120)))/2 color Blue]
		}
		scale 2
		translate -1
	}
}

Cette scène utilise un gradient de couleur qui commence avec le rouge à 30 degrés et passe au bleu à 120 degrés. En dessous de 30 degrés, tout est rouge, tandis qu'au dessus de 120 degrés, tout est bleu.

2.3.5.2.2 Ajout du soleil

Dans l'exemple suivant, nous créerons un ciel avec un soleil rouge, entouré d'un halo rouge qui se mélange au bleu sombre d'un ciel de nuit. Nous le ferons en utilisant seulement la caractéristique sky_sphere.

La caractéristique utilisée est montrée plus bas. Un sol est également ajouté pour plus de réalisme (skysph2.pov).

sky_sphere {
	pigment {
		gradient y
		color_map {
			[0.000 0.002 color rgb <1.0, 0.2, 0.0>
				color rgb <1.0, 0.2, 0.0>]
			[0.002 0.200 color rgb <0.8, 0.1, 0.0>
				color rgb <0.2, 0.2, 0.3>]
		}
		scale 2
		translate -1
	}
	rotate -135*x
}
plane {
	y, 0
	pigment {color Green}
	finish {ambient .3 diffuse .7}
}

Le motif graduel et la transformation dans le pigment sont les mêmes que dans la section précédente.

Le spectre de couleurs en contient trois. Un rouge brillant, légèrement jaunâtre pour le soleil, un rouge plus sombre pour le halo et un bleu sombre pour le ciel de nuit. La couleur du soleil ne couvre qu'une très faible partie du ciel car nous ne voulons pas qu'il devienne trop gros. La couleur utilise les valeurs 0.000 à 0.002 du spectre pour avoir un contraste tranchant à 0.002 (nous ne voulons pas que le soleil se mélange dans le ciel). Le rouge sombre du halo se mélange dans le bleu sombre du ciel depuis la valeur 0.002 jusqu'à 0.200. Toutes les valeurs au delà de 0.200 révèleront le ciel bleu sombre.

Le rotate -135*x est utilisé pour faire tourner le soleil et la totalité de la voûte céleste à sa position finale. Sans cette rotation, le soleil serait à 0 degrés, en dessous de nous.

Un soleil rouge descend dans la nuit
Un soleil rouge descend dans la nuit

En regardant l'image, nous verrons quels impressionnants effets sont disponibles avec la caractéristique sky_sphere.

2.3.5.2.3 Ajout de quelques nuages

Pour améliorer notre image, nous voulons ajouter quelques nuages en ajoutant un second pigment. Ce nouveau pigment utilise le modèle bozo pour créer quelques jolis nuages. Puisqu'il réside au-dessus des autres pigments, il doit avoir quelques couleurs translucides dans sa palette de couleurs (voir les entrées de 0.5 à 1.0).

sky_sphere {
	pigment {
		gradient y
		color_map {
			[0.000 0.002 color rgb <1.0, 0.2, 0.0>
				color rgb <1.0, 0.2, 0.0>]
			[0.002 0.200 color rgb <0.8, 0.1, 0.0>
				color rgb <0.2, 0.2, 0.3>]
		}
		scale 2
		translate -1
	}
	pigment {
		bozo
		turbulence 0.65
		octaves 6
		omega 0.7
		lambda 2
		color_map {
			[0.0 0.1 color rgb <0.85, 0.85, 0.85>
				color rgb <0.75, 0.75, 0.75>]
			[0.1 0.5 color rgb <0.75, 0.75, 0.75>
				color rgbt <1, 1, 1, 1>]
			[0.5 1.0 color rgbt <1, 1, 1, 1>
				color rgbt <1, 1, 1, 1>]
		}
		scale <0.2, 0.5, 0.2>
	}
	rotate -135*x
}
Un ciel nuageux avec un soleil
Un ciel nuageux avec un soleil

Le ciel a un inconvénient, que vous notez en regardant l'image (skysph3.pov). Le soleil n'émet aucune lumière, et les nuages ne font aucune ombre. Si vous voulez des ombres de nuages, vous devrez utiliser une véritable sphère, large, avec une texture appropriée, et une source de lumière quelque part en dehors de la sphère.

2.3.5.3 Le brouillard

Vous pouvez utiliser la caractéristique fog pour ajouter deux différents types de brouillard à votre scène : le brouillard constant et la nappe de brouillard. Le constant a une densité égale en tous points, tandis que la densité de la nappe décroît avec la hauteur.

L'usage des deux types sera décrit en détail dans les sections suivantes.

2.3.5.3.1 Un brouillard constant

Le type de brouillard le plus simple est le constant, qui une densité constante en tous lieux. Il est spécifié par un mot clé distance qui décrit actuellement la densité du brouillard, et color.

La valeur de la distance détermine la distance où 36.8% de l'arrière-plan est toujours visible (pour une explication plus détaillée sur le mode de calcul du brouillard, lire la référence "Le brouillard").

La couleur du brouillard peut être utilisée pour créer n'importe quoi depuis le blanc le plus pur jusqu'au rouge sang. Vous pouvez également utiliser un brouillard noir pour simuler une vue limitée.

L'exemple suivant montrera comment ajouter un brouillard à une simple scène (fog1.pov).

#include "colors.inc"
camera {
	location <0, 20,-100>
}
background {color SkyBlue}
plane {
	y,-10
	pigment {
		checker color Yellow color Green
		scale 20
	}
}
sphere {
	<0, 25, 0>, 40
	pigment {Red}
	finish {phong 1.0 phong_size 20}
}
sphere {
	<-100, 150, 200>, 20
	pigment {Green}
	finish {phong 1.0 phong_size 20}
}
sphere {
	<100, 25, 100>, 30
	pigment {Blue}
	finish {phong 1.0 phong_size 20}
}
light_source {<100, 120, 40> color White}
fog {
	distance 150
	color rgb <0.3, 0.5, 0.2>
}
Une scène brumeuse
Une scène brumeuse

Selon leur distance, les sphères sont plus ou moins évanouies dans le brouillard verdâtre, comme le plan en damier.

2.3.5.3.2 Placer un minimum de translucidité

Si vous voulez être sûr que l'arrière-plan ne disparaisse pas complètement, vous pouvez placer un canal de transmission à la couleur du brouillard, à la quantité d'arrière-plan que vous voulez garder visible.

En utilisant une valeur de transmission de 0.2 comme dans

fog {
	distance 150
	color rgbt <0.3, 0.5, 0.2, 0.2>
}

la translucidité du brouillard ne descendra jamais en dessous de 20%, comme vous pouvez le voir sur l'image (fog2.pov).

Brouillard avec ajout d'un seuil de translucidité
Brouillard avec ajout d'un seuil de translucidité
2.3.5.3.3 Création d'un brouillard filtrant

Le brouillard verdâtre que nous avons utilisé ne filtre pas la lumière. Il ne fait que diminuer son intensité. Nous pouvons changer cela en utilisant un canal filtrant différent de zéro dans la couleur du brouillard (fog3.pov).

fog {
	distance 150
	color rgbf <0.3, 0.5, 0.2, 1.0>
}

La valeur du filtre détermine la quantité de lumière filtrée par le brouillard. Dans notre exemple, 100% de la lumière sera filtrée par le brouillard. Si nous avions utilisé une valeur de 0.7, seulement 70% aurait été filtrée. Les 30% restant seraient passés sans filtration.

Un brouillard filtrant
Un brouillard filtrant

Vous noterez que l'intensité des objets n'est pas seulement diminuée, mais que leur couleur est influencée par celle du brouillard. La sphère rouge, et surtout la bleue, prennent une teinte verte.

2.3.5.3.4 Ajout de turbulence au brouillard

Pour rendre notre brouillard, quelque peu ennuyeux, plus intéressant, nous pouvons ajouter de la turbulence, pour qu'il paraisse moins constant (fog4.pov).

fog {
	distance 150
	color rgbf <0.3, 0.5, 0.2, 1.0>
	turbulence 0.2
	turb_depth 0.3
}
Brouillard plus intéressant avec la turbulence
Brouillard plus intéressant avec la turbulence

Le mot clé turbulence spécifie la quantité de turbulence, tandis que la valeur de turb_depth déplace le point où est calculé la valeur de la turbulence sur le tracé du rayon. Une valeur près de zéro déplace le point vers l'observateur, tandis d'une valeur proche de un le déplace vers l'intersection (la valeur par défaut est 0.5). Ce paramètre peut être utilisé pour éviter le bruit qui peut apparaître à cause de la turbulence (cela arrive normalement sur les points d'intersection très éloignés, surtout si aucune intersection n'intervient comme lorsque l'arrière-plan est touché). Si cela arrive, baissez la valeur de turb_depth jusqu'à ce que le bruit disparaisse.

Vous devez garder en mémoire que l'actuelle densité du nuage ne changera pas. Seulement la distance de base de l'atténuation est modifiée par la valeur de la turbulence.

2.3.5.3.5 Utilisation d'une nappe de brouillard

Le type de brouillard le plus intéressant et le plus flexible est la nappe de brouillard, qui est sélectionnée avec la caractéristique fog_type. Son apparence est décrite avec les mots clés fog_offset et fog_alt. fog_offset spécifie la hauteur, c'est à dire la valeur de y, en dessous de laquelle il a une densité constante de 1. fog_alt détermine la vitesse à laquelle sa densité approche de zéro, lorsqu'on se déplace le long de l'axe y. A une hauteur de 'fog_offset+fog_alt', le brouillard aura une densité de 25%.

L'exemple suivant (fog5.pov) utilise une nappe de brouillard avec une densité constante en dessous de y=25 (le centre de la sphère rouge) et qui chute rapidement à des altitudes supérieures.

fog {
	distance 150
	color rgbf <0.3, 0.5, 0.2, 1.0>
	fog_type 2
	fog_offset 25
	fog_alt 1
}
Un exemple de nappe de brouillard
Un exemple de nappe de brouillard
2.3.5.3.6 Utilisation de plusieurs couches de brouillard

Il est possible d'utiliser plusieurs couches de brouillard, par l'intervention de plus d'une caractéristique fog dans votre scène. Cela est pratique si vous voulez avoir de beaux effets avec des nappes de brouillard turbulentes. Vous pouvez additionner plusieurs brouillards colorés, différents, pour créer une scène féerique, par exemple.

Essayez seulement cet exemple (fog6.pov).

fog {
	distance 150
	color rgb <0.3, 0.5, 0.2>
	fog_type 2
	fog_offset 25
	fog_alt 1
	turbulence 0.1
	turb_depth 0.2
}
fog {
	distance 150
	color rgb <0.5, 0.1, 0.1>
	fog_type 2
	fog_offset 15
	fog_alt 4
	turbulence 0.2
	turb_depth 0.2
}
fog {
	distance 150
	color rgb <0.1, 0.1, 0.6>
	fog_type 2
	fog_offset 10
	fog_alt 2
}
Utilisation de plusieurs couches de brouillard
Utilisation de plusieurs couches de brouillard

Vous pouvez combiner des brouillards constants, des nappes de brouillard, des brouillards filtrants ou non filtrants, des brouillards avec un seuil de translucidité, etc.

2.3.5.3.7 Le brouillard et les objets creux

Chaque fois que vous utilisez un brouillard et une caméra dans un objet qui n'est pas creux, vous n'obtiendrez aucun effet de brouillard. Pour une explication sur les raisons de ce phénomène, voir Les objets vides et pleins.

Pour éviter ce problème, vous devez rendre tous ces objets creux en vous assurant que la caméra est à l'extérieur (en utilisant le mot clé inverse) ou en leur ajoutant le mot clé hollow (qui est le plus simple).

2.3.5.4 L'arc-en-ciel

La caractéristique rainbow peut être utilisée pour créer des arcs-en-ciel, ou d'autres effets étranges. L'arc-en-ciel est comme un brouillard, réduit à un volume conique.

2.3.5.4.1 Débuter avec un arc-en-ciel simple

L'arc-en-ciel est spécifié avec de nombreux paramètres : l'angle de vue, la largeur de la bande de couleur, la direction de la lumière entrante, la distance du brouillard basée sur la densité de particules et le spectre de couleurs.

La taille et la forme sont déterminées par les mots clés angle et width. Le mot clé direction fixe la direction de la lumière entrante, donc de la position de l'arc-en-ciel. Il est visible quand l'angle, entre le vecteur de direction et la direction de la lumière incidente, est plus grand que angle - largeur / 2 et plus petit que angle + largeur / 2.

La lumière entrante est la source virtuelle responsable de l'arc-en-ciel. Il n'est pas nécessaire qu'elle soit réelle pour créer un effet arc-en-ciel.

L'arc-en-ciel est un effet de brouillard, c'est à dire que la couleur de l'arc est mélangée à celle de l'arrière-plan basée sur la distance au point d'intersection. Si vous choisissez de petites valeurs de distance, l'arc sera visible sur les objets, et pas seulement sur l'arrière-plan. Vous pouvez éviter cela en utilisant de très grandes valeurs de distance.

Le spectre de couleurs est une part cruciale de l'arc car il contient toutes les couleurs qui, normalement, sont vues dans un arc-en-ciel. La couleur de la bande la plus interne est celle de l'entrée 0, et celle de l'entrée 1 pour la bande la plus extérieure. Vous devez noter que, à cause des limites d'affichage de couleurs des écrans, il est impossible de créer un vrai arc-en-ciel. Quelques couleurs ne seront pas affichées.

Le canal filtrant du spectre de couleurs est utilisé comme pour les brouillards. Il détermine combien de lumière passant au travers est filtrée par la couleur.

L'exemple suivant montre une scène simple avec un sol, trois sphères et une arc-en-ciel quelque peu exagéré (rainbow1.pov).

#include "colors.inc"
camera {
	location <0, 20,-100>
	look_at <0, 25, 0>
	angle 80
}
background {color SkyBlue}
plane {y,-10 pigment {color Green}}
light_source {<100, 120, 40> color White}
// declaration des couleurs de l'arc-en-ciel
#declare r_violet1 = color rgbf <1.0, 0.5, 1.0, 1.0>;
#declare r_violet2 = color rgbf <1.0, 0.5, 1.0, 0.8>;
#declare r_indigo = color rgbf <0.5, 0.5, 1.0, 0.8>;
#declare r_blue = color rgbf <0.2, 0.2, 1.0, 0.8>;
#declare r_cyan = color rgbf <0.2, 1.0, 1.0, 0.8>;
#declare r_green = color rgbf <0.2, 1.0, 0.2, 0.8>;
#declare r_yellow = color rgbf <1.0, 1.0, 0.2, 0.8>;
#declare r_orange = color rgbf <1.0, 0.5, 0.2, 0.8>;
#declare r_red1 = color rgbf <1.0, 0.2, 0.2, 0.8>;
#declare r_red2 = color rgbf <1.0, 0.2, 0.2, 1.0>;
// création de l'arc-en-ciel
rainbow {
	angle 42.5
	width 5
	distance 1.0e7
	direction <-0.2,-0.2, 1>
	jitter 0.01
	color_map {
		[0.000 color r_violet1]
		[0.100 color r_violet2]
		[0.214 color r_indigo]
		[0.328 color r_blue]
		[0.442 color r_cyan]
		[0.556 color r_green]
		[0.670 color r_yellow]
		[0.784 color r_orange]
		[0.900 color r_red1]
	}
}

Quelques irrégularités sont ajoutées aux bandes de couleur avec le mot clé jitter.

Un arc-en-ciel très coloré
Un arc-en-ciel très coloré

Cet arc est trop lumineux. Vous n'en verrez jamais comme ça dans la réalité. Nous pouvons atténuer les couleurs de l'arc en baissant les valeurs RGB du spectre.

2.3.5.4.2 Accroître la translucidité de l'arc-en-ciel

Le résultat obtenu est beaucoup trop éclatant. Juste réduire les couleurs de l'arc aide, mais il est préférable d'augmenter la translucidité car c'est plus réaliste si l'arrière-plan est visible à travers l'arc.

Nous pouvons utiliser le canal de transmission des couleurs dans le spectre en spécifiant un minimum de translucidité, comme avec le brouillard. Pour obtenir des résultats réalistes, nous utiliserons de grandes valeurs de transmission comme nous pouvons le voir dans l'exemple suivant (rainbow2.pov).

rainbow {
	angle 42.5
	width 5
	distance 1.0e7
	direction <-0.2,-0.2, 1>
	jitter 0.01
	color_map {
		[0.000 color r_violet1 transmit 0.98]
		[0.100 color r_violet2 transmit 0.96]
		[0.214 color r_indigo transmit 0.94]
		[0.328 color r_blue transmit 0.92]
		[0.442 color r_cyan transmit 0.90]
		[0.556 color r_green transmit 0.92]
		[0.670 color r_yellow  transmit 0.94]
		[0.784 color r_orange transmit 0.96]
		[0.900 color r_red1 transmit 0.98]
	}
}

Les valeurs de transmission augmentent sur les bandes externes pour le noyer doucement dans l'arrière-plan.

Un arc-en-ciel beaucoup plus réaliste
Un arc-en-ciel beaucoup plus réaliste

Le résultat semble beaucoup plus réaliste que notre premier arc-en-ciel.

2.3.5.4.3 Utiliser un arc de l'arc-en-ciel

Actuellement, notre arc-en-ciel a une forme circulaire, même s'il est en partie caché derrière le plan du sol. Vous pouvez aisément créer un arc d'arc-en-ciel en utilisant le mot clé arc_angle avec un angle inférieur à 360 degrés.

Si vous utilisez un arc_angle 120, par exemple, vous obtiendriez un arc d'arc-en-ciel qui s'interromprait brutalement à la fin. Cela ne paraît pas bon. Pour éviter cela, le mot clé falloff_angle peut être utilisé pour spécifier une région où l'arc se fond lentement dans l'arrière-plan.

Comme expliqué dans la section de référence de l'arc-en-ciel (voir "L'arc-en-ciel"), l'arc s'étend de -arc_angle/2 jusqu'à arc_angle/2 tandis que l'estompage va de -arc_angle/2 à -falloff_angle/2 et de falloff_angle/2 à arc_angle/2. Voici la raison pour laquelle falloff_angle doit être plus petit ou égal à arc_angle.

Dans les exemples suivants, nous utilisons un arc de 120 degrés avec 45 degrés de région de diminution des deux côtés de l'arc (rainbow3.pov).

rainbow {
	angle 42.5
	width 5
	arc_angle 120
	falloff_angle 30
	distance 1.0e7
	direction <-0.2,-0.2, 1>
	jitter 0.01
	color_map {
		[0.000 color r_violet1 transmit 0.98]
		[0.100 color r_violet2 transmit 0.96]
		[0.214 color r_indigo transmit 0.94]
		[0.328 color r_blue transmit 0.92]
		[0.442 color r_cyan transmit 0.90]
		[0.556 color r_green transmit 0.92]
		[0.670 color r_yellow transmit 0.94]
		[0.784 color r_orange transmit 0.96]
		[0.900 color r_red1 transmit 0.98]
	}
}

Les angles d'arc sont mesurés sur l'axe montant de l'arc-en-ciel, qui peut être spécifié en utilisant le mot clé up. Par défaut cet axe est l'axe y.

Un arc d'arc-en-ciel
Un arc d'arc-en-ciel

Finalement, nous avons un arc-en-ciel réaliste.

Complément sur l'arrière-plan

Complément sur "sky_sphere"

Complément sur la taille

Complément sur le déplacement

Complément sur le brouillard

Complément sur la couleur

Complément sur l'arc-en-ciel

Complément sur l'angle

2.3.4 Les options de texture évoluées 2.3.4 Les options de texture évoluées 2.3.6 Cours sur le média simple 2.3.6 Cours sur le média simple