Aller au menu - Aller au contenu

Icône Les médias (1/2)

Mise à jour : 01/07/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
525 visites depuis 7 jours, dont 0 sur ce chapitre classé 218/786
Les médias sont, dans POV-Ray, un outil très puissant, qui vous ouvrira encore de nouvelles portes.
Ils permettent de réaliser de nombreux effets de lumière, souvent de manière assez simple.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Chers téléspectateurs, bonsoir...

Non, je ne parle pas ici de journal télévisé ! :p
Les médias dans POV-Ray sont "simplement" des objets particuliers que la lumière traverse, et qui vont interagir avec cette lumière.
Concrètement, cela veut dire qu'il vous faut un objet, au moins partiellement transparent (à moins de mettre la lumière et la caméra directement dans l'objet), et doté d'une nouvelle propriété : hollow.
hollow veut dire "creux" : votre objet ne sera alors plus qu'une coquille vide. Ca ne change rien pour les opérations CSG (union, difference...) ni pour l'apparence (même sans hollow, si vous placez votre caméra à l'intérieur d'un objet, il aura l'air vide : vous voyez la surface interne de l'objet, c'est tout).
Le seul effet notable est donc que cela nous permet d'utiliser les médias.

Si vous oubliez de mettre hollow, le média n'apparaîtra pas ! C'est une erreur très fréquente.


On appellera conteneur l'objet qui contient notre média. Ce sera une limite spatiale à nos effets : un média n'agit QUE dans l'objet auquel il est assigné.

Pour définir un média, il faut créer un bloc media dans un bloc interior, lui-même placé dans la définition du conteneur.

Dans toute la suite de ce chapitre, nous utiliserons cette scène de test pour voir l'effet de nos médias :

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
camera {
  location  <1.8, 3, -5.2>
  look_at   <0.0, 0.2,  0.0>
}


light_source {
  <30, 20, -10>
  color rgb <1, 1, 1>
}

// ----------------------------------------

plane {
  // Un sol blanc
  y, 0
  pigment { color rgb 1 }
}

// Quelques objets de test pour voir l'effet du média
box { -1, 1 translate y scale 0.5 pigment { blue 1 } }
sphere { 0, 0.5 translate x+y*0.5 pigment { red 1 } }
cone { 0, 0.5, y, 0 translate -z pigment { green 1 } }

sphere {
    // Le conteneur
    0
    1
    pigment { rgbt 1 }
    hollow
    interior {
        media {
            // Caractéristiques du média
        }
    }
    scale 0.9
    translate x+y-2*z
}


Vous pouvez déjà rendre la scène telle quelle : vous verrez le plan et les trois objets, mais pas le conteneur : normal, on lui a donné pour couleur rgbt 1, ce qui correspond à rgbt <1,1,1,1>, c'est-à-dire un blanc entièrement transparent.

Voyons maintenant ce que l'on peut mettre dans ce bloc média...

Emission, absorption

Absorption


Les deux fonctions les plus simples d'un média sont l'absorption et l'émission de lumière. Cela permet de modifier facilement la lumière qui traverse l'objet.
Voici un exemple :
Code : Autre
1
2
3
media {
    absorption rgb 1
}

Comme vous le voyez, on indique absorption suivi de la couleur à absorber, ici le blanc (donc toutes les couleurs). Pas trop dur ! ;)

Voici le résultat :
Média : absorption

Comme on s'y attendait un peu, ça assombrit la lumière qui traverse la sphère : d'une part la lumière qui vient directement de la source, ce qui produit l'ombre ; d'autre part la lumière qui nous vient des objets, ce qui assombrit les trois objets de test.

En prenant un cône à la place de la sphère, on obtient cela :

Image utilisateur

On peut remarquer que, contrairement à un simple pigment peu transparent, le cône est plus sombre au centre et plus clair sur les bords. C'est normal ! :p Le média absorbe la lumière pendant que le rayon traverse l'objet. Donc si le rayon passe plus de temps dans l'objet, il est plus sombre ! Cela permet d'obtenir plus de réalisme qu'avec une simple valeur de transmit ou de filter.

Bien sûr, il est possible de mettre autre chose que du blanc dans l'absorption ! On peut également dépasser 1, cela ne fera qu'absorber encore plus.

Voici un autre exemple, avec des absorptions colorées :
Média : absorption colorée

On voit bien que seul l'objet de la couleur correspondante est affecté par l'absorption.

Une application classique de ce type de média ? L'eau !

Emission


L'émission ressemble beaucoup à l'absorption, mis à part que c'est le contraire... :-°
Pour l'utiliser, très simple :
Code : Autre
1
2
3
media {
    emission rgb 0.1
}

Média : émission

Ici, on n'a mit que rgb 0.1, car l'émission est bien plus visible que l'absorption. Mettre rgb 1 rendrait presque tout blanc !

Une chose que vous devriez avoir remarquée est que, cette fois, il n'y a pas d'ombre. C'est comme ça, l'émission dans les médias ne modifie que la lumière qui arrive à la caméra, cela ne transforme pas l'objet en source de lumière géante.

Ici encore, il est possible de donner une couleur à l'émission, tout comme pour l'absorption.

L'avantage de ce type de médias est que l'émission marche tout le temps, même s'il n'y a pas de source de lumière pour éclairer le conteneur. Cela permet de réaliser des objets brillants, mais qui ne sont pas assez lumineux pour vraiment éclairer les autres objets autour : des petites DEL, par exemple.


Bien sûr, il est possible de combiner l'absorption et l'émission (à condition de choisir des couleurs différentes, sinon c'est un peu stupide) : on peut ainsi absorber tout le bleu mais émettre du rouge...
Voici un exemple, assez extrême :
Code : Autre
1
2
3
4
media {
    absorption blue 5
    emission red 5
}

Image utilisateur

Le bleu a été entièrement absorbé, ce qui a rendu la boîte noire et le sol jaune, puis du rouge a été ajouté partout, ce qui a rendu la boîte et la sphère saturés en rouge, et le cône jaune (vert + rouge = jaune).

Un peu par ci, un peu par là...

Bon, c'est bien joli tout ça, mais ça ne nous avance pas trop...

Le problème, c'est que notre média émet ou absorbe assez uniformément, ce qui limite assez les applications possibles.

Heureusement, vous vous en doutez, il existe un moyen de modifier cette répartition au sein du conteneur :D : c'est la densité du média.

Pour la définir, très simple : il faut faire un bloc density dans le bloc media. C'est dans ce bloc que nous allons mettre la description de la densité.
Cette densité est en fait une "fonction" qui assigne à chaque point de l'espace la concentration du média à cet endroit.
Tiens tiens... associer à chaque point de l'espace une valeur, ça ressemble un peu aux pigments, non ? :-°
Et oui, vous allez voir, définir une densité ressemble fortement à définir un pigment...

Voici un exemple :
Code : Autre
1
2
3
4
5
6
7
8
media {
    emission rgb 1
    density {
        gradient x
        translate x/2
        scale 2
    }
}

translate et scale sont là pour que le gradient soit bien placé pour s'étaler sur toute la sphère.

Image utilisateur

L'émission est ici concentrée sur la partie droite de la sphère, la partie gauche étant presque transparente.

J'ai ici utilisé gradient, mais n'importe quel autre motif marche aussi.
En plus de ceux que vous connaissez déjà, quatre motifs sont spécifiques aux densités.

Spherical


Très pratique, spherical donne une valeur de 1 au point <0,0,0> et décroît de manière sphérique, jusqu'à atteindre 0 sur la sphère de rayon 1. Il vaut 0 partout ailleurs (c'est la différence avec onion).
Cela permet notamment de ne pas avoir de discontinuité aux bords de la sphère, la densité ne passant plus brutalement de 1 à 0.

Image utilisateur

Le motif spherical se concentre donc dans une sphère de centre 0 et de rayon 1, quel que soit le conteneur ! C'est pour cela que, dans la scène de test, le conteneur est bien une sphère de centre 0 et de rayon 1, que l'on déplace après avec translate.


Cylindrical


Cylindrical est cette fois adaptée à des cylindres centrés en 0, alignés selon l'axe y, de rayon 1.
Le principe est le même que pour spherical : sur toute la droite Oy, le motif vaut 1 ; il diminue progressivement jusqu'à arriver à 0 à une distance de 1. Comme spherical, il vaut 0 partout ailleurs.

Image utilisateur

(J'ai remplacé ici la sphère par un cylindre, pour mieux voir la répartition.)

Ici encore, faites attention à bien choisir votre conteneur, quitte à le modifier après à coups de scale, rotate ou translate.

Planar


Planar est un motif qui vaut 1 sur tout le plan Oxz, vaut 1 - abs(y) entre -y et +y, et 0 partout ailleurs. Évidemment, il est prévu pour entourer un plan.

Cependant, n'utilisez pas de plan comme conteneur !! Les plans sont infinis, ce qui risque de rendre votre calcul trèèès long. Utilisez donc plutôt une boîte qui entoure le plan.


Image utilisateur

J'ai ici utilisé une boîte comme conteneur, cela permet de mieux voir le plan.

Boxed


Enfin, boxed est, lui, prévu pour être utilisé dans une boîte allant de <-1,-1,-1> à <1,1,1> : le motif vaut 1 au centre (en <0,0,0>) et décroît vers le bord de la boîte. Comme toujours, il vaut 0 partout ailleurs.

Image utilisateur

Répartition avancée

Turbulence


Les choses sérieuses commencent maintenant...
Nous venons de voir que la répartition de la densité du média se fait comme avec un motif.
Et bien, comme avec les motifs, on va pouvoir modifier un peu tout ça ! Vous vous souvenez, la turbulence ?

Média : turbulence

Voilà ce que ça donne quand on l'applique au média. Pas mal, n'est-ce pas ? :D

En plus, c'est vraiment très simple à utiliser : comme pour les pigments, pas besoin d'un bloc warp.

Code : Autre
1
2
3
4
5
6
7
media {
    emission 2
    density {
        spherical
        turbulence 1
    }
}


Comme pour les pigments, vous pouvez paramétrer la turbulence, avec octave, lambda, ...

Plusieurs densités


Il est également possible de spécifier plusieurs densités.
Dans ce cas-là, les densités seront multipliées, ce qui correspond à peu près à une intersection. : les régions vides de n'importe quelle densité seront vides au final, ne laissant apparaître que les parties communes.

Si vous voulez ajouter des densités à la place, il suffira de créer un deuxième bloc média, avec une nouvelle densité.
Voici un exemple (c'est un exemple théorique, il ne ressemble à rien une fois rendu) :

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sphere {
  0
  1
  pigment { rgbt <0,0,0,1> }
  hollow
  interior {
    media {
        emission rgb 3
        // Deux densités dans le même média : c'est l'intersection des deux
        density { spherical }
        density { spherical turbulence 1 }
    }
  }
}

sphere {
  0
  1
  pigment { rgbt <0,0,0,1> }
  hollow
  interior {
    // Deux média : c'est une addition de densités
    media {
        emission rgb 1
        density { spherical }
    }
    media {
        emission rgb 1
        density { spherical turbulence 1 }
    }
  }
}


Mettre plusieurs densités diminue en général la densité globale, il faut donc parfois remonter la valeur d'émission (ou d'absorption) ; au contraire, plusieurs médias définis s'ajoutent ; il faut donc parfois diminuer la valeur correspondante.
Vous venez de finir cette première partie concernant les médias.
Vous devez déjà commencer à voir des applications pour ce genre d'effets : des halos, du feu, de la fumée...
Le chapitre suivant vous montrera encore d'autres possibilités !
Chapitre précédent Sommaire Chapitre suivant

Partager

Il n'y a pas encore de commentaire pour ce tuto.