Création réalisée en 2002
La modélisation et le rendu de paysages naturels comprenant des milliers de plantes demandent des ressources informatiques importantes. Avec POV-Ray, les plantes modélisées en Géometrie Constructive Solide (CSG, à base de sphères, de cylindres etc.) se prêtent mal à la réalisation de couverts végétaux de grande taille, de type forestier, car ces modèles consomment trop de mémoire ; il est plus efficace d'utiliser des plantes faites de maillages de polygones (mesh) car elles peuvent être instanciées : contrairement aux objets en CSG, les maillages peuvent être copiés à l'envie sans que l'utilisation de mémoire ne s'en ressente trop. Cette propriété est très pratique pour les paysages, car quelques plantes recopiées des milliers de fois suffisent à créer un couvert végétal important. Cependant, du fait de la rareté de générateurs de maillages de plantes gratuits ou de faible coût (tels qu'Arboretum ou la version graphique de Tomtree par Gena Obukhov), les utilisateurs de POV-Ray réalisent peu d'images de ce type. Il y a cependant des produits commerciaux, et, en mars 2002, Greenworks, les concepteurs de Xfrog, un générateur de structures organiques complexes, m'ont proposé d'utiliser leur logiciel. Dans les mois suivants, j'ai réalisé 6 images présentant des plantes Xfrog (Hiver, In vitro, The prince, Plus à vendre, L'accident et Persistance) qui ont été montrées dans les galeries du site de Greenworks. Je n'avais pourtant fait qu'effleurer les capacités de Xfrog, ayant surtout utilisé les modèles des librairies de plantes fournies avec le logiciel. Il était temps de faire une image vraiment complexe, basée en partie sur des modèles originaux, l'équivalent paysager des grandes images urbaines de ce site. L'idée vint rapidement - un arbre en contre-jour, un étang, le reflet dissonant de l'arbre dans l'eau - et il n'y avait plus qu'à se mettre au travail.
L'arbre principal était un vrai défi. Etant à contre-jour, la lumière devait passer à travers les feuilles et il fallait trouver un moyen de rendre cet effet correctement. POV-Ray autorise la "double illumination" qui permet au côté d'une surface opposé à une source lumineuse d'être aussi éclairé que le côté faisant face à cette source. Cet effet est pratique mais non contrôlable, car les deux côtés sont éclairés de façon identique, ce qui n'est pas réaliste. J'ai fini par utiliser cette méthode pour les plantes de petite taille, mais pour l'arbre ce n'était pas suffisant : c'est donc un méthode plus lourde qui été utilisée, celle du milieu dispersant (scattering media). L'arbre retenu est un érable japonais de la librairie Xfrog, suffisamment grand mais au feuillage pas trop dense (pour limiter la consommation de mémoire). Dans Xfrog, ses feuilles sont des petits carrés texturés avec une image semi-transparente qui en restitue la forme : cela fait de jolies feuilles, mais qui ne peuvent pas disperser la lumière faute d'épaisseur. Il me fallut donc les remplacer par un vrai conteneur de "media", consistant en un composant Xfrog de type "corne", aplati et en forme de feuille, disposant d'un véritable intérieur. Ces feuilles n'étaient pas aussi jolies que les feuilles d'érable originelles (ce qui aurait été trop coûteux en terme de nombre de polygones), mais elles se comportaient maintenant comme de vraies feuilles (ou presque) du point de vue de la lumière.
Feuilles originales (polygones), rendu Xfrog | Feuilles modifiées("cornes" aplaties) | Feuilles rétro-éclairées, rendu POV-Ray |
On peut voir dans la troisième image que la texture des feuilles laisse à désirer et que leur résolution est assez faible, du fait de la nécessité de garder le nombre de polygones à un niveau raisonnable (une feuille modifiée est composée d'une vingtaine de polygones contre un seul pour la feuille carrée originale) . L'arbre complet fait encore 500000 polygones et "pèse" près de 70 Mo... A cause de cela, la mise au point de l'effet de contre-jour a pris beaucoup de temps, et il reste des problèmes non résolus.
L'arbre présent dans le reflet, qui est un modèle imaginaire réalisé directement dans Xfrog, a été bien plus simple à faire. En voici une capture d'écran Xfrog.
Une fois les arbres réalisés, il restait encore à créer les autres plantes. Un arbuste du genre pistacia, un cerisier et des plantes plus ou moins imaginaires furent réutilisées à partir d'images précédentes ou des librairies Xfrog, tant pour l'arrière plan que comme "remplissage". En revanche, les plantes de premier plan furent créées directement à partir d'espèces réelles, sélectionnées dans une vieille flore en couleurs (Les plantes sauvages d'Europe, de Björn Ursing, 1955) sur la base de leur vraisemblance dans le biotope, de leur aspect esthétique et de la facilité que j'aurais à les modéliser. Les captures d'écran Xfrog de ces modèles sont présentées ci-dessous :
Plusieurs modèles de chaque espèce ont été créés, correspondant à des variations de taille, de stade de floraison ou de nombre de feuilles.
Un élément fondamental de la conception de modèles Xfrog est une bonne compréhension de la façon dont les fonctions mathématiques peuvent être utilisées pour contrôler la forme des composants. Ainsi, la cassure des feuilles de roseau a été créée par une fonction provoquant un changement brutal de courbure : cette courbure (en degrés) est calculée comme (1-floor(x+0.44))*floor(x+0.46)*-100, ou x est la longueur relative de la feuille (entre 0 et 1). Cette fonction retourne 100° pour le segment compris entre 54% et 57% de la longueur relative (et 0 pour le reste de la feuille) provoquant la brisure à mi-feuille. Les utilisateurs de POV-Ray ayant une expérience du codage ne seront pas dépaysés ! En fait, c'est assez amusant, voire assez simple si on ne vise pas une exactitude botanique absolue.
La dernière étape concernait les textures : faute de pouvoir récolter ces plantes dans leur milieu naturel, j'ai scanné des feuilles d'allure similaire dans le jardin de mon lieu de travail... D'autres textures ont été simplement empruntées dans les libraires Xfrog ou récupérées sur le Web, avec dans tous les cas un travail d'adaptation sous Picture Publisher.
La conversion de modèles Xfrog au format POV-Ray peut être un peu délicate si on se contente des sorties par défaut des convertisseurs. Un tutorial complet sur ce sujet est disponible ici.
La touche finale fut l'ajout de la double illumination sur les pétales, pour permettre l'effet de diffusion en contre-jour sur ces derniers.
Un problème commun au fichiers contenant un canal alpha (TGA, PNG et TIFF), tels que ceux souvent utilisés pour les feuilles, est qu'une fois l'image importée dans POV-Ray la partie transparente et la partie opaque ont par défaut les mêmes propriétés de finish : les reflets spéculaires se voient sur la partie transparente, comme si elle était en verre. Pour éviter cet effet, il faut utiliser image_pattern comme suit :
Voici un exemple utilisant les deux images précédentes :
texture{
image_pattern{jpeg "leaf_mask"} // used for the transparency
texture_map{
[0 pigment{Clear}finish{ambient 0 diffuse 0}]
[1 pigment{image_map{jpeg "leaf_pigment"}} finish{ambient 0 diffuse 1}]
}
}
La touche finale fut l'ajout de la double illumination sur les pétales, pour permettre l'effet de diffusion en contre-jour sur ces derniers.
Les images réalisées en 2002 utilisent souvent arrière-plans fait sous Terragen, car ce logiciel permet d'obtenir rapidement des ciels et des nuages très acceptables, bien qu'assez reconnaissables. Par ailleurs, il n'y a pas de limite (ou presque) à la taille des images que l'on peut créer avec Terragen, ce qui limite le risque d'avoir des images pixelisées : pour une paysage de taille poster (6400 x 4800), j'utilise simplement un ciel Terragen de même taille ou un peu plus petit. L'idéal serait une photo de ciel réel, mais il est rare de trouver des photos aussi grandes.
Terragen ne peut produire un dôme hémisphérique, si bien que la technique retenue ici consiste à créer un panorama fait de 5 panneaux : avant, arrière, gauche, droite, haut. Pour obtenir un panorama sans jointures visibles, le plus simple est de choisir dans Terragen un angle de vision de 90° (paramètre Zoom/Magnification = 1). Si l'image est carrée, le panorama sera sans aucune jointure. Si le format est différent, seuls les panneaux verticaux seront sans jointure, mais le panneau "haut" sera disjoint (ce qui n'est pas forcément un problème). Pour chaque panneau, les paramètres de caméra sont les suivants :
Ce processus peut être automatisé via un script Terragen, ce qui peut être très pratique si l'on a besoin de panneaux de même résolution (animations par exemple). Pour une image fixe POV-Ray de grand format, seul le panneau visible dans le cadre doit être rendu en résolution maximum : les autres ne font que contribuer à l'illumination globale et aux reflets et peuvent être de petite résolution. On peut aussi accélerer le rendu Terragen en désactivant le rendu du terrain (la partie inférieure de l'image apparaîtra noire).
Un panorama Terragen typique s'écrit ainsi en code POV-Ray :
#declare Panoramic=union{
object{Pane texture{pigment{ image_map{jpeg "sky_front"}}
finish{ambient 1 diffuse 0}}}
object{Pane texture{pigment{image_map{jpeg "sky_right"}}
finish{ambient 1 diffuse 0}} rotate y*90 translate x}
object{Pane texture{pigment{image_map{jpeg "sky_back"}}
finish{ambient 1 diffuse 0}} rotate y*180 translate x-z}
object{Pane texture{pigment{image_map{jpeg "sky_left"}}
finish{ambient 1 diffuse 0}} rotate y*270 translate -z}
object{Pane texture{pigment{image_map{jpeg "sky_top"}}
finish{ambient 1 diffuse 0}} rotate -x*90 translate y}
translate z*0.5-x*0.5-y*0.35 // centers the panorama around
the origin and lowers it at horizon level
scale 1500 // size of the panorama box
no_shadow // so that a light source can be positioned outside
the sky box
}
L'eau est un simple plan et sa seule caractéristique un peu complexe est la présence de vaguelettes de tailles différentes :
#declare colWater=rgb <78,104,48>/255;
#declare matWater = material{
texture {
pigment{rgbt}
normal{
pigment_pattern{
bozo
color_map{
[0.45 Black]
[0.55 White]
}
}
normal_map{
[0 waves frequency 400 bump_size 0.01 turbulence 0.1]
[1
function {
f_noise3d( x*1, y*5, z*5)*0.8
+f_noise3d( x*10, y*50, z*50)*0.2
+f_noise3d( x*100, y*200, z*200)*0.2
}
bump_size 0.004
]
}
}
finish {
ambient 0
diffuse 0.2
specular 1
roughness 1/500
metallic
brilliance 2
reflection {
0.6,1
fresnel on
}
conserve_energy
}
}
interior {
ior 1.33
}
}
Le terrain est un height-field en 1024 x 1024 pixels peint avec Picture Publisher et répliqué par symétrie à travers tout le paysage.
Les collines visibles près de l'horizon font en fait partie du paysage Terragen.
L'éclairage est fait de deux sources lumineuses : l'une est un "vrai" soleil, l'autre est une lumière bleutée venant de la verticale de l'image (afin d'aider un peu la radiosité...).
Il y a pourtant une grosse tricherie ! Si la position "officielle" du soleil donnait de bon résultats sur l'ensemble de la scène, elle ne projetait pas assez de lumière visible sur l'arbre lui-même, lequel, éclairé par la seule radiosité, manquait de relief. Je donnai donc à l'arbre son propre soleil personnel, situé à 25° sur la gauche du soleil principal...
Cette image utilise la radiosité avec une qualité très basse (count 10, error_bound 1) mais suffisante pour ce type d'image (plein de petits objets et de textures différentes) si on ne regarde pas de trop près.
Les libellules (modélisées avec Rhino) et les brindilles (isosurfaces) ont été recyclées des Amants. La grenouille est un modèle Poser classique. Ces animaux sont à peine visibles en résolution écran et sont autant d'oeufs de Pâques pour ceux qui achètent le poster !
Tous les éléments clés de la scène étant prêts, il ne restait plus qu'à "planter" les 27 plantes différentes plusieurs milliers de fois aux bons endroits. Il n'y pas de secret pour faire ça, il faut seulement de la patience car les règlages sont nombreux et les temps de chargements plutôt longs du fait des tailles de fichier importantes. Pour manipuler facilement des quantités aussi massives d'objets (plus de 12000), une méthode consiste à les stocker dans des tableaux, et 5 ont été définis pour cette image :
Le positionnement des plantes se fait avec différentes boucles. La principale place 12000 plantes, les "roseaux" dans ou près de l'eau, les "orties" autour d'un point précis et les "herbes" partout ailleurs. Chaque plante a un "double" simplifié (cylindre) dont l'utilisation permet de gagner du temps durant les tests.
Voici la boucle principale. D'autres boucles plaçent les "flotteurs" et les "arbres".
#declare rd=seed(125);
#while (i
#declare Norm=<0,0,0>;
#declare aPlant=35+145*rand(rd);
#declare Start =
vaxis_rotate(<0,5,-1+rand(rd)*0.7>,y,aPlant)+x;
#declare Pos= trace ( Terrain, Start, -y, Norm ); // uses
trace to put the plant at the right height
#if (vlength(Norm)!=0)
#if (Pos.y<-0.5+rand(rd)*0.4) //
close to the waterline
#declare
Plant=object{Reed[int(nReed*rand(rd))] scale (0.5+rand(rd)*0.5)}
#else // elsewhere
#if
(vlength(<0.2,Pos.y,0.2>-Pos)>0.06) // nettle location
#declare Plant=object{Grass[int(nGrass*rand(rd))] scale
0.3+0.95*abs(cos(5*(aPlant-45)*pi/180))}
#else
#declare
Plant=Nettle[int(3*rand(rd))]
#end
#end
object{
Plant
rotate x*(0.5-rand(rd))*10
rotate 360*rand(rd)*y
scale 0.6+rand(rd)*1.7
scale
translate Pos
}
#declare i=i+1;
#end
Cette scène contient environ 370 millions de polygones. En dépit de la radiosité et des ombres douces, le rendu en 6000 x 8000 s'est effectué rapidement, en moins de deux jours, car les objets à base de maillages sont vraiment efficaces en terme de vitesse de rendu.
Beaucoup de gens ne remarquent pas la discordance entre l'arbre et son reflet, et certains m'ont dit ne l'avoir vu qu'après avoir essayé de comprendre le titre et cherché le "côté obscur" en question. On peut certainement critiquer l'image sur ce point, car cela signifie qu'elle a du mal à atteindre son objectif. Mais l'idée même que quelque chose d'aussi "évident" puisse passer inaperçu me paraît intéressante.
Cette image, ainsi que certaines de mes autres scènes comportant des plantes Xfrog, est présentée dans l'ouvrage d'Oliver Deussen "Computer-generierte Pflanzen" (Springer-Verlag, 2003).