Avec le
height_field, on commence à entrer vers les trucs amusants - et utiles !
Un
height_field transforme une image
bitmap (c'est-à-dire pixelisée, et non vectorielle) en une surface, dont la hauteur de chaque point dépend de l'image de la couleur d'un pixel de l'image.
En fait, cette forme est composée de triangles, dont les hauteurs dépendent directement des pixels de l'image.
Si l'image est assez grande, beaucoup de triangles seront utilisés, et le résultat sera plus précis.
La taille de l'image (en pixels) donne donc la précision du
height_field, tandis que le nombre de couleurs donne sa précision pour les hauteurs.
Il vaut mieux n'utiliser que des couleurs en noir et blanc. Les pixels blancs ont la plus haute valeur, donc la plus grande hauteur ; les pixels noirs la plus basse, donc la plus faible hauteur. Voilà comment ça marche :
Un
height_field a donc besoin d'une image pour créer la surface. De nombreux formats d'images sont reconnus :
gif, tga, pot, png, pgm, ppm, jpg, tiff et
sys. Je vous conseille le format
png, mais c'est à vous de choisir.
Pour créer un
height_field, il faut écrire...
height_field ! Le premier paramètre est le type d'image (gif, png, etc.). Le second est le nom de l'image, entre guillemets.
Il est ensuite possible d'ajouter
smooth, qui permettra de lisser le
height_field, pour de meilleurs rendus. Mais attention !
smooth fonctionne comme les pseudo-normales, c'est-à-dire qu'il donne l'impression de lisser le
height_field, en n'agissant que sur les effets de lumière (ombre, etc.). De plus, il n'améliore pas véritablement la qualité, et ne donne de bons rendus qu'à bonne distance.
Mais alors, smooth, c'est nul ?
Pas du tout ! Il permet d'effacer l'effet angulaire des paysages. Mais il n'est pas si utile qu'il en a l'air, c'est tout.
Il est également possible de mettre
water_level, suivi d'une valeur entre 0 et 1. Ceci permettra de ne prendre, dans le
height_field, que ce qui se trouve au-dessus de cette valeur. Cela permet de donner le niveau de l'eau lors de la création de paysages, par exemple...
Voici un exemple assez simple :
D'abord, l'image de base :

Et le code :
Code : C1
2
3
4
5
6
7 | height_field {
png
"height_field.png"
pigment { rgb <1,0,0> }
translate <-0.5,0,-0.5>
scale <10,3,10>
}
|
Qu'est-ce que ça fait ? Ça crée le
height_field (qui est situé dans le cube qui va de <0,0,0> à <1,1,1>), puis un
translate le place au centre, et
scale lui donne les bonnes dimensions. Ici, vu que l'image est assez précise (400 * 400 pixels), et qu'on est trop loin pour voir la différence, on n'a pas besoin de
smooth.
Voilà le résultat :

Pas mal, hein ?
