vers l'index général de l'aide

perturbation apparente de la normale d'une surface

objectif

Créer des reliefs apparents à la surface des objets.

explication

Par défaut, les surfaces des objets de POV-Ray sont complètement lisses. La normale d'un point d'une surface est un vecteur partant de ce point et perpendiculaire à la surface. L'orientation de ce vecteur détermine (en combinaison avec l'environnement) la valeur d'éclairage de ce point, ainsi que l'angle des rayons réfléchissants et réfringents qui partent du point.

En "perturbant", suivant un motif, la normale d'une surface, on lui donne l'effet d'un léger relief. Attention, il ne s'agit que d'une illusion, la surface n'est pas réellement modifiée comme le montre l'image qui suit :

sphère lisse ...avec la normale ...en coupe

...nous voyons ici une coupe d'une sphère où on utilise une déclaration normal, pourtant la coupe reste bien circulaire, ce qui montre que la sphère reste une sphère.

syntaxe

Isolément, ou à l'intérieur d'une texture...

utilisation d'un motif

normal { 
        Motif                //motif à choisir parmi ceux qui sont disponibles
        bump_size Profondeur //intensité de la perturbation (décimal)
        [modificateurs de normale]
        [modificateurs de motif (turbulence, scale, rotate,...)]
} 

Le motif peut être n'importe quel motif proposé par POV-Ray, mais certain d'entre eux sont plus pertinents pour cet usage-ci : bumps, dents, wrinkles,... Voyez la section sur les motifs pour plus de précisions pour chaque motif.

bump_size détermine la profondeur apparente des reliefs, généralement entre 0 et 1, mais on peut aller au-delà de ces valeurs. Une valeur négative inverse les normales (les creux deviennent des bosses). La valeur par default est de 0.5. On peut, au lieu d'utiliser bump_size, placer cette valeur directement après le choix du motif, cela revient au même.

normal {bumps .1} /*est équivalent à*/ normal {bumps bump_size .1} 
bump_size 0.5bump_size 2bump_size -0.5

utilisation d'une "bump_map"

Permet de "graver" la surface d'un objet à l'aide d'une image bitmap.

normal { 
        bump_map {
                 png | tga | ...  //type du fichier bitmap
                 "nom de fichier" //nom du fichier bitmap
                 map_type Type_Projection  //type de projection de l'image (0,1,2 ou 5)
                 [once]
                 [interpolate]
                 } 
        bump_size Profondeur   //intensité de la perturbation (décimal)
        use_color | use_index  //choix de la façon d'interpréter les couleurs de l'image
        [modificateurs de normale]
        [modificateurs de motif (turbulence, scale, rotate,...)]
} 

bump_map est aux normales ce que image_map est aux pigments, on se reportera donc à la sectionapplication d'images sur les objets pour en connaître le fonctionnement détaillé.

Les valeurs de couleurs de l'image sont transformées en taux de perturbation de la normale. Par défaut, l'image est transformée en niveaux de gris, et POV-Ray utilise les valeurs de gris de 0 à 1 pour déterminer la perturbation à appliquer. En spécifiant use_index, il est possible de forcer POV-Ray à utiliser plutôt les valeurs d'index de la palette (pour les formats d'image qui utilisent une palette), les valeurs de 0 à 255 étant converties en valeurs de 0 à 1. use_color est le mode activé par défaut.

l'image à "graver"le résultat

utilisation d'une "normal_map"

normal { 
        Motif                //motif à employer
        normal_map {
        [Position1 Normale1] //liste de normales (les crochets font partie de la syntaxe)
        [Position2 Normale2]
        ...
        bump_size Profondeur //intensité de la perturbation (décimal)
        [modificateurs de normale]
        [modificateurs de motif (turbulence, scale, rotate,...)]
} 
utilisation d'une

Cette fonctionnalité permet de combiner plusieurs définitions de normal suivant un motif, voyez l'explication détaillée un peu plus loin.

les modificateurs de normale

détermination des normales perturbées

Avant de découvrir certains modificateurs, il est important de comprendre un peu mieux comment est déterminée la perturbation de la normale d'un point d'une surface.

Pour chaque point de la surface perturbée, POV-Ray détermine la "hauteur apparente" de quatre points adjacents. Cette hauteur apparente est fonction de la valeur en ce point du motif choisi (de 0 à 1) multipliée par la valeur de bump_size. Ensuite, par interpolation, la pente du point considéré est déterminée. Le dessin qui suit montre (en 2D mais le principe est le même) comment une valeur de motif devient un vecteur de normale :

processus de détermination de la normale perturbée

slope_map

Dans le processus que nous venons d'expliquer, les valeurs de motif (de 0 à 1) sont converties linéairement en valeurs de hauteur, de 0 à 1 aussi.

slope_map est un modificateur de normale qui donne à l'utilisateur la possibilité de définir exactement comment les valeurs de motif sont converties en hauteurs apparentes.

La syntaxe est la suivante :

normal {...  //motif, bump_size,...
 slope_map {
          [Position1, <Hauteur1,Pente1>]
          [Position2, <Hauteur2,Pente2>]
          ...
          }
}
//note : les crochets sont à utiliser (n'indiquent pas une option).

C'est un peu comme si on établissait une courbe de corrélation entre la valeur (de 0 à 1) retournée par le motif (en abscisse) et la hauteur apparente de ce point. "Position" est une valeur sur l'abscisse, Hauteur étant la position (entre 0 et 1 également) sur l'ordonnée qui lui correspond, et Pente étant la pente de la courbe de corrélation en ce point.
pente 0 = horizontale
pente 1 = 45° vers le haut
pente -1 = 45° vers le bas ...
On peut spécifier entre 2 et 256 points de contrôle.

Note : la valeur de la pente est égale à la tangente de l'angle de son inclinaison.

La courbe linéaire employée par défaut pourrait se définir comme suit :

slope_map {[0, <0,1>] //commence en bas à 45°
           [1, <1,1>] //termine en haut à 45°
          }
gradient x avec la slope_map par défaut

exemple avec un gradient x

On pourrait par exemple en faire une courbe d'allure triangulaire :

      [0   <0, 1>]   // commence en bas et part à 45°
      [0.5 <1, 1>]   // à la moitié, bute sur le maximum avec une pente de 45° intacte
      [0.5 <1,-1>]   // du même point, repart brutalement à -45° vers le bas
      [1   <0,-1>]   // et termine avec le même angle
gradient x avec la slope_map triangulaire

exemple avec le même gradient x

Attention : la "pente" dont il est question ici n'est pas la pente du "relief", mais celle de la courbe de corrélation entre la valeur du motif et la hauteur apparente de la normale ! (quoique, en pratique, cela revienne à peu près au même).

Attention aussi : la courbe de la slope_map est une fonction du 3ème degré (cubique), et ne contiendra donc que rarement des segments de droites.

Voici un exemple qui montre le passage d'une rupture brusque à une pente douce.

box {-1,1
        texture {
                 normal {
                        gradient <.5,.5,.5>
                        slope_map {
                                  [0.00 <0,1>]
                                  [0.25 <1,1>]
                                  [0.25 <1,-1>]
                                  [0.50 <1,0>]
                                  [0.75 <0.5,0.5>]
                                  [1.00 <0,1>]
                                  }
                        }
                pigment {SteelBlue}
                finish {phong 1 reflection .3}
                 }
    }

Remarque : slope_map peut être utilisé avec tous les motifs excepté brick, checker, hexagon, bumps, dents, ripples, waves, wrinkles et bump_map.

normal_map

normal_map est aux normales ce que pigment_map est aux pigments, une façon de combiner plusieurs normales différentes à l'aide du motif choisi. La syntaxe :

normal {...  //motif, bump_size,...
  normal_map{
            [Position1 Normale1]
            [Position2 Normale2]
            ...
            } 
}
//note : les crochets sont à utiliser (n'indiquent pas une option).

Position est une valeur entre 0 et 1, représentant la position dans les valeurs du motif, et est suivi d'une définition de normale (par identificateur prédéfini, ou par définition directe). On peut spécifier entre 2 et 256 éléments. Un exemple :

normal { gradient x       //C'est le motif
         normal_map { 
                     [0.3  bumps scale 2]       
                     [0.3  dents]
                     [0.6  dents]       
                     [0.9  marble turbulence 1]     
                    }   
                    }

Dans cet exemple, quand la fonction gradient de x retourne des valeurs comprises entre 0.0 et 0.3 alors la normale est de type bumps. Quand les valeurs sont comprises entre 0.3 et 0.6 la normale est de type dents, et de 0.6 à 0.9 il y a un mélange de dents et de marble. Au delà de 0.9 seul marble est utilisé. Remarquons qu'entre 0.3 et 0.6 il n'y a pas de mélange entre bumps et dents car on a redéfini la valeur 0.3 (il apparaît deux fois). Si on voulait obtenir un mélange, on devrait supprimer l'entrée [0.3 dents].

cas particuliers

Une normal_map peut être utilisée avec un motif average, voir la section correspondante dans les descriptions de motifs pour plus de détail.

Des définition de normales complètes placées dans une liste peuvent aussi être utilsées dans des motifs "à liste" comme checker, hexagon et brick :

  normal {checker 
           normal {gradient x scale .2}     
           normal {gradient y scale .2}
           }   

Notez que, dans ce cas-ci, la structure "normal {...}" est requise autour de la définition de chaque normale faisant partie de la liste.

Remarque : les normales de la liste ne peuvent comporter ni normal_map, ni bump_map.

remarques

Dans la version officielle de POV-Ray (actuellement 3.1g), il existe un vieux bug qui fait que, quand on applique scale à une normale, la profondeur apparente des reliefs n'est pas réajustée en même temps, et l'aspect général de la normal change. MegaPOV corrige ce bug, et assure un aspect constant d'une taille à l'autre. Si vous ne voulez pas que la profondeur "suive" la valeur de scale, vous pouvez spécifier le mot clé no_bump_scale.

Certains logiciels permettent de modifier réellement la surface des objets, à l'aide d'une technique appellée "displacement mapping". POV-Ray, pour des raisons complexes à exposer, ne dispose pas de cette technique. Cependant, pour tous les types d'objets définissable mathématiquement, il est possible de réaliser une sorte de "displacement mapping" à l'aide des isosurfaces.

rédacteurs : Fabian Brau / Fabien Mosen