La déclaration media est utilisée pour spécifier des particules en suspension dans un élément comme l'air ou l'eau. Elle peut être utilisée pour spécifier la fumée, la brume, le brouillard, le gaz, le feu, la poussière etc. Les versions précédentes avaient deux systèmes incompatibles pour générer de tels effets. L'un d'eux était le halo pour les effets englobés dans des objets transparents ou semi transparents. L'autre était l'atmosphère pour des effets qui concernaient toute la scène. Cette duplication de systèmes était complexe et inutile. Le halo et l'atmosphère ont été éliminés. Voir "Pourquoi interior et media sont ils nécessaires ?" pour d'autres détails sur ce changement. Voir "L'objet media" pour des détails sur son utilisation avec les objets. Voir "Le média atmosphérique" pour les détails sur l'utilisation du média pour les effets atmosphériques en dehors des objets. Cette section et celles qui suivent expliquent les détails sur les diverses options utiles pour les objets médias ou le média atmosphérique.
Le média fonctionne en testant la densité de particules à certains points le long du rayon. Des échantillons sont également pris jusqu'à ce que le résultat approche un niveau de confiance spécifié. POV-Ray fournit trois méthodes d'échantillonnage. Quand il est utilisé dans une déclaration d'intérieur d'objet, les tests ne se font qu'à l'intérieur de l'objet. Pour un média atmosphérique, les tests se font entre la caméra et tout objet touché par le rayon. Ainsi, pour des effets localisés, il est préférable d'utiliser un objet conteneur même si le modèle de densité peut produire des effets seulement dans une petite aire, que le média soit enfermé ou non.
La syntaxe complète est :
MEDIA: media { [MEDIA_IDENTIFIER] [MEDIA_ITEMS...] } MEDIA_ITEMS: method Number | intervals Number | samples Min, Max | confidence Value | variance Value | ratio Value | absorption COLOR | emission COLOR | aa_threshold Value | aa_level Value | scattering { Type, COLOR [ eccentricity Value ] [ extinction Value ] } | density { [DENSITY_IDENTIFIER] [PATTERN_TYPE] [DENSITY_MODIFIER...] } | TRANSFORMATIONS DENSITY_MODIFIER: PATTERN_MODIFIER | DENSITY_LIST | COLOR_LIST | color_map { COLOR_MAP_BODY } | colour_map { COLOR_MAP_BODY } | density_map { DENSITY_MAP_BODY }
Les valeurs par défaut sont :
aa_level : 4 aa_threshold : 0.1 absorption : <0, 0, 0> confidence : 0.9 emission : <0, 0, 0> intervals : 10 method : 3 ratio : 0.9 samples : Min 1, Max 1 variance : 1/128 SCATTERING COLOR : <0, 0, 0> eccentricity : 0.0 extinction : 1.0
Si un identificateur de média est spécifié, il doit être le premier élément. Tous les autres éléments peuvent être déclarés dans n'importe quel ordre. Tous sont optionnels. Vous pouvez avoir de multiples déclarations de densité dans une même déclaration de média. Voir "Densité multiple vs. Média multiple" pour les détails. Les transformations n'affectent que les déclarations de densité déjà spécifiées. Toute densité après une transformation n'est pas affectée. Si le média n'a pas de déclaration de densité, et qu'aucune n'a été spécifiée dans un identificateur de média, alors la transformation n'a pas d'effet. Tous les autres éléments du média, sauf pour la densité et les transformations, écrasent les valeurs par défaut, où celles déclarées précédemment pour ce média.
Note : certains effets dépendent des sources de lumières. Toutefois, la participation d'une source de lumière dépend des mots clés media_interaction et media_attenuation. Voir "L'interaction du média atmosphérique" et "L'atténuation atmosphérique" pour les détails.
Note : dans la documentation de POV-Ray 3.1, il est dit :
"un effet étrange a été découvert pendant les tests, et il a été trop difficile de le corriger. Si l'objet conteneur utiliseCela n'est plus le cas depuis POV-Ray 3.5. Que vous spécifieztransmitplutôt que lefilterpour la transparence, alors le média ne donne pas d'ombre."
transmit ou filter pour créer un objet conteneur transparent, le média projetera toujours une ombre. Si l'ombre n'est pas désirée, utilisez le mot clé no_shadow pour l'objet conteneur.
Il y a trois types d'interaction de particules dans le média : l'absorption, l'émission et la dispersion. Ces trois activités peuvent apparaître dans un même média. Elles requièrent toutes une couleur. Seuls les composants du rouge, du vert et du bleu sont utilisés. Les valeurs du filtre et de la transmission sont ignorées. Pour cette raison, il est permis d'utiliser une valeur numérique pour spécifier une intensité de couleur blanche. Par exemple, les deux lignes suivantes sont légales, et donnent le même résultat :
emission 0.75 emission rgb <0.75, 0.75, 0.75>
Le mot clé absorption spécifie une couleur de lumière qui est absorbée lorsqu'on regarde à travers le média. Par exemple absorption rgb <0, 1, 0> bloque la lumière verte, mais autorise le passage du rouge et du bleu. Ainsi un objet blanc derrière le média paraîtra magenta.
La valeur par défaut est rgb <0, 0, 0> qui signifie qu'aucune lumière est absorbée.
Le mot clé emission donne une couleur pour la lumière émise par les particules. Bien que nous ayons parlé d'une lumière "émise", cela signifie seulement que les particules sont visibles même en l'absence d'éclairage. Elles n'émettent pas vraiment de lumière pouvant éclairer les objets autour. C'est comme un objet avec de fortes valeurs ambient. La valeur par défaut est rgb <0, 0, 0> qui dit qu'aucune lumière est émise.
La syntaxe pour scattering est :
SCATTERING: scattering { Type, COLOR [ eccentricity Value ] [ extinction Value ] }
La première valeur numérique donne le type de dispersion. C'est suivi par la couleur de la lumière dispersée. La valeur par défaut, si aucune déclaration de dispersion est donnée, est rgb <0, 0, 0> qui signifie pas de dispersion.
Cet effet est seulement visible quand de la lumière arrive sur le média. C'est similaire à la diffusion réflexive d'un objet. En plus de la lumière réfléchie, ce média absorbe la lumière comme un média d'absorption. Le quota d'absorption pour une quantité donnée de dispersion est contrôlé par le mot clé optionnel extinction et une valeur numérique. La valeur par défaut est 1.0 qui donne une effet d'extinction égale à la dispersion. Des valeurs comme extinction 0.25 donnent 25% de la quantité normale. L'utilisation de extinction 0.0 la désactive. Toute valeur autre que le défaut 1.0, contrarie le modèle physique réel, mais baisser l'extinction peut vous donner plus de flexibilité artistique.
La valeur entière Type spécifie l'une des cinq fonctions de dispersion représentant les modèles différents : isotropique, Mie (atmosphère brumeuse et sombre), Rayleigh, et Henyey - Greenstein.
Type 1, dispersion isotopique qui est la dispersion la plus simple car indépendante de la direction. La quantité de lumière dispersée par les particules dans l'atmosphère ne dépend pas de l'angle entre la vue et l'illumination.
Types 2 et 3 sont la dispersion brumeuse et sombre de Mie qui sont utilisées pour des particules relativement petites comme de minuscules gouttes d'eau d'un brouillard, d'un nuage et les particules responsables de la pollution. Dans ces modèles, la dispersion est extrêmement directionnelle vers l'avant, c'est-à-dire que la diffusion est maximale quand la lumière incidente est anti-parallèle à l'axe de vision (la lumière vient directement sur le spectateur). C'est minimal lorsque la lumière incidente est parallèle à l'axe de vision. Les modèles d'atmosphère brumeuse et sombre diffèrent dans leurs caractéristiques de dispersion. Le modèle sombre est beaucoup plus directionnel que le modèle brumeux.


Type 4 : la dispersion Rayleigh modèle la dispersion pour des particules extrêmement petites, comme celles de l'air. La quantité de lumière dispersée dépend de l'angle d'incidence de la lumière. Elle est importante quand la lumière incidente est parallèle ou anti-parallèle à l'axe de vision, et petite quand la lumière est perpendiculaire à l'axe de vision. Vous devez noter que le modèle Rayleigh, utilisé dans POV-Ray, ne prend pas en compte la dépendance de la dispersion avec la longueur d'onde.

Type 5 : la dispersion Henyey - Greenstein est basée sur une fonction analytique, et peut être utilisée pour modéliser une grande variété de différents types de dispersion. La fonction modélise une ellipse, avec une excentricité donnée e. Cette excentricité est spécifiée par le mot clé optionnel eccentricity, qui est seulement utilisé pour le type de diffusion cinq. Une excentricité de zéro, le défaut, définit une dispersion isotropique, tandis que les valeurs positives donnent une dispersion dans la direction de la lumière, à l'inverse des valeurs négatives. Les grandes valeurs de e (ou les petites valeurs dans le cas des négatives) augmentent la propriété directionnelle de la dispersion.

Les effets média sont calculés par échantillonnage du média le long du rayon. Il utilise une méthode appelée l'intégration de Monte Carlo. Le mot clé intervals peut être utilisé pour donner le nombre entier d'intervalles pour échantillonner le rayon. Le défaut est 10. Pour les objets média, les intervalles sont déployés entre les points d'entrée et de sortie du rayon à travers le conteneur. Pour le média atmosphérique, les intervalles s'étendant sur la longueur totale du rayon, de son départ jusqu'à l'objet touché. Pour les types de média qui interagissent avec les projecteurs et les lumières cylindriques, les intervalles non éclairés ont un poids différent des éclairés, lors de la distribution des échantillons.
Le mot clé ratio distribue les intervalles différemment entre les aires illuminées et les autres. La valeur par défaut de 0.9 fait que les intervalles éclairés prennent plus d'échantillons. Notez que le nombre total d'intervalles doit excéder le nombre d'intervalles illuminés. Si un rayon traverse 8 points illuminés et que vous n'avez spécifié que 5 intervalles, une erreur survient.
Les mots clés samples Min, Max donnent le nombre maximal et minimal d'échantillons pris par intervalle. Le défaut est samples 1,1.
Pendant que l'intervalle est échantillonné, la variance est calculée. Si elle est en dessous d'une valeur seuil, d'autres échantillons ne sont pas pris. Les mots clés variance et confidence donnent la variance allouée et la confiance que vous lui accordez. Le calcul exact est quelque peu complexe et appelle des tests et des principes statistiques difficiles à décrire ici. Les valeurs par défaut sont variance 1.0/128 et confidence 0.9. Pour des calculs plus lents et plus précis, baissez la variance et augmentez la confiance.
Note : le nombre maximal d'échantillons limite les calculs, même si la variance et la confiance ne sont pas atteints.
Le mot clé method vous permet de spécifier la méthode d'échantillonnage employée, POV-Ray en fournit trois. Method 1 est la méthode décrite au dessus.
L'échantillonnage method 2 distribue les échantillons uniformément le long du rayon de visée ou du rayon de lumière. Ce dernier peut quelque fois rendre les choses plus douces. Si vous spécifiez un maximum d'échantillons plus grand que le minimum, POV prendra des échantillons supplémentaires, mais ils seront aléatoires, comme dans la méthode 1. Donc, il est suggéré de placer le maximum à la même valeur que le minimum. jitter rendra la méthode 2 similaire à la méthode 1. Cela peut être suivi par un numérique, et une valeur de 1 étalera les échantillons dans la fourchette entre les échantillons.
L'échantillonnage method 3 utilise l'échantillonnage adaptatif (similaire à l'anti-crénelage adaptatif) qui est très proche de la méthode d'échantillonnage utilisée dans l'atmosphère de POV-Ray 3.0. Toutefois, ce code a été écrit pour fonctionner avec le média. L'échantillonnage adaptatif fonctionne en prenant un autre échantillon entre deux échantillons existants s'il y a trop de variance dans les deux échantillons d'origine. Cela aboutit à moins de prise d'échantillons dans les aires où les effets du média restent constants. L'échantillonnage adaptatif n'est appliqué que si le minimum d'échantillons est fixé à 3 ou plus.
Vous pouvez spécifier la profondeur de récursion de l'anti-crénelage en utilisant le mot clé aa_level suivi d'un entier. Vous pouvez spécifier le seuil d'anti-crénelage en utilisant aa_threshold suivi d'un numérique. Le défaut pour aa_level est 4 et le défaut pour aa_threshold est 0.1. jitter fonctionne aussi avec la méthode 3. L'échantillonnage de la méthode 3 ignore la valeur du maximum d'échantillons. Il est en général meilleur d'utiliser seulement un intervalle avec la méthode 3. Trop d'intervalles peut donner des artefacts, et POV créera plus d'intervalles s'il en a besoin.
Les particules de média sont normalement distribuées de manière constante. Toutefois, la déclaration de densité vous permet de varier la densité à travers l'espace, en utilisant des fonctions de modèle comme celles des textures. Si aucune déclaration de densité n'est donnée, la densité reste constante, à la valeur 1.0. Plus d'une densité peut être donnée par déclaration de média. Voir "Les densités multiples vs. Médias multiples". La syntaxe pour density est :
DENSITY: density { [DENSITY_IDENTIFIER] [DENSITY_TYPE] [DENSITY_MODIFIER...] } DENSITY_TYPE: PATTERN_TYPE | COLOR DENSITY_MODIFIER: PATTERN_MODIFIER | DENSITY_LIST | color_map { COLOR_MAP_BODY } | colour_map { COLOR_MAP_BODY } | density_map { DENSITY_MAP_BODY }
La déclaration de densité peut commencer avec un identificateur de densité optionnel. Toutes les valeurs suivantes modifient les défauts, ou les valeurs de l'identificateur. L'élément suivant est le type de modèle. C'est toute fonction modèle de POV-Ray comme bozo, wood, gradient, waves, etc. D'une utilité particulière, les modèles spherical, planar, cylindrical et boxed qui étaient auparavant seulement disponibles pour le halo. Tous les modèles retournent une valeur entre 0.0 et 1.0. Cette valeur est interprétée comme la densité du média à ce point. Voir "Les modèles" pour les détails sur certains types particuliers de modèles. Bien qu'un modèle de couleur unie soit légal, il n'est utilisé que quand la déclaration de densité est dans un density_map.
Une déclaration de densité peut être modifiée par tout modificateur de modèle général comme les transformations, la turbulence et la torsion. Voir "Les modificateurs de modèle" pour les détails. En plus, d'autres modificateurs spécifiques à la densité peuvent être utilisés.
Habituellement, un média utilise juste une constante de couleur. Même si vous variez la densité, c'est seulement une couleur qui est spécifiée par les mots clés absorption, emission ou scattering. Toutefois, quand vous simulez le feu ou des explosions avec emission, le centre de la flamme (aire de haute densité) est plus brillant et blanc ou jaune. Les bordures de la flamme (densité moindre) passent à l'orange, le rouge et quelque fois un bleu profond. Pour modéliser le changement de couleur selon la densité, vous pouvez spécifier un spectre de couleur. La fonction du modèle retourne une valeur entre 0.0 et 1.0, et cette valeur est passée au spectre de couleur pour calculer la couleur ou le mélange de couleurs qui est utilisé. Voir "Les spectres de couleurs" pour les détails sur le fonctionnement des valeurs du modèle avec le spectre de couleurs. Cette couleur résultante est multipliée par la couleur d'absorption, d'émission ou de dispersion. Actuellement, il n'est pas possible de spécifier différents spectres de couleurs pour chaque média au sein d'une même déclaration de média.
Considérons cet exemple :
media { emission 0.75 scattering {1, 0.5} density {spherical color_map { [0.0 rgb <0, 0, 0.5>] [0.5 rgb <0.8, 0.8, 0.4>] [1.0 rgb <1, 1, 1>] } } }
Le spectre de couleurs va de blanc à la densité 1.0 à un jaune lumineux à la densité 0.5 à un bleu profond à la densité 0. Prenons un point échantillonné à la densité 0.5. L'émission est 0.75*<0.8, 0.8, 0.4> ou <0.6, 0.6, 0.3>. De même, la couleur diffusée est 0.5*<0.8, 0.8, 0.4> ou <0.4, 0.4, 0.2>.
Pour les modèles de bloc damier, hexagone et brique, vous pouvez spécifier une liste de couleurs comme ceci :
density { checker density {rgb <1, 0, 0>} density {rgb <0, 0, 0>} }
Voir "Les pigments à liste de couleurs" qui décrit comment un pigment utilise une liste de couleurs. Le même principe s'applique pour leur utilisation avec les densités.
En plus de la spécification de mélange de couleurs avec un spectre de couleurs, vous pouvez mélanger les densités avec un spectre de densités. La syntaxe pour un spectre de densités est la même que pour un spectre de couleurs, sauf que vous spécifiez une densité à chaque entrée.
La syntaxe pour density_map est :
DENSITY_MAP: density_map { DENSITY_MAP_BODY } DENSITY_MAP_BODY: DENSITY_MAP_IDENTIFIER | DENSITY_MAP_ENTRY... DENSITY_MAP_ENTRY: [ Value DENSITY_BODY ]
Où Value est une valeur numérique entre 0.0 et 1.0 inclus, et chaque DENSITY_BODY est toute chose qui peut être dans une déclaration density{...}. Le mot clé density et les parenthèses {} n'ont pas besoin d'être spécifiés.
Note : les parenthèses [] font partie de DENSITY_MAP_ENTRY. Elles ne sont pas des symboles de notation des parties optionnelles. Elles cernent chaque entrée du spectre de densités.
Il peut y avoir de 2 à 256 entrées dans un spectre.
Les spectres de densités peuvent être emboîtées à un niveau de complexité désiré. Les densités dans un spectre peuvent avoir des spectres de couleurs, ou des spectres de densités, ou tout type de densité voulu.
Des densités complètes peuvent aussi être utilisées dans les modèles de bloc comme le damier, l'hexagone et la brique. Par exemple :
density { checker density {Flame scale .8} density {Fire scale .5} }
Note : dans le cas de modèle de bloc, l'emballage de la densité est nécessaire autour de chaque information de densité.
Un spectre de densités est aussi utilisé dans le type de densité average. Voir "Le modèle moyen" pour les détails.
Vous pouvez déclarer et utiliser des identificateurs de densité, mais le seul moyen de déclarer une liste de modèle de bloc de densité est de déclarer un identificateur de densité pour la totalité.
Il est possible d'avoir plus d'un média par objet, et il est légal d'avoir plus d'une densité par média. Les effets sont un peu différents. Considérons cet exemple :
object { MyObject pigment {rgbf 1} interior { media { density {Some_Density} density {Another_Density} } } }
Tandis que le média est échantillonné, des calculs sont faits pour chaque modèle de densité à chaque échantillon. Les échantillons résultants sont multipliés ensembles. Supposons qu'une densité retourne rgb <.8, .8, .4> et qu'une autre rende rgb <.25, .25, 0>. Le résultat est rgb <.2, .2, 0>.
Note : dans les aires où un densité retourne zéro, cela effacera l'autre densité. Le résultat final est que seules les aires de chevauchement de densités seront visibles. C'est similaire à une intersection CSG.
Maintenant considérons :
object { MyObject pigment {rgbf 1} interior { media { density {Some_Density} } media { density {Another_Density} } } }
Dans ce cas, chaque média est calculé indépendamment. Les couleurs résultantes sont additionnées. Supposez qu'une densité et un média retournent rgb <.8, .8, .4> et qu'une autre donne rgb <.25, .25, 0>. La couleur résultante est rgb <1.05, 1.05, .4>. Le résultat final est que les aires de chevauchement des densités seront brillantes et que toutes les aires seront visibles. C'est similaire à L'union CSG. Voyez la scène exemple scenes\interior\media\media4.pov pour une illustration.
| 3.5.3 Les photons |