TP 1 : Introduction à l`utilisation de POV

Transcription

TP 1 : Introduction à l`utilisation de POV
TP 1 : Introduction à l'utilisation de POV-Ray
Option Géométrie et Infographie
L2 Math-Info 2008-2009
1.Opérateurs de transformation
Allez sur la page web : http://lumimath.univ-mrs.fr/~broglio/ dans la rubrique
Enseignement - L2. Téléchargez sur votre compte le fichier exemple.pov (dans un nouveau
répertoire de travail que vous nommerez pov).Ce fichier comporte un texte qui décrit la scène dont
on cherche à calculer une vue. Procédez au calcul en tapant dans un terminal, et dans le bon
répertoire où se trouve le fichier, la ligne suivante :
povray +Iexemple.pov +L/usr/local/povray31/include/ +D +P
Editez le fichier et comparez le langage de description de scène avec le résultat obtenu.
2.Premiers éléments du langage de PovRay
Un fichier de scène comporte toujours un certain nombre d'éléments, dans un ordre précis : une
seule caméra active, puis au moins une lumière et enfin une série d'objets. Toutes les descriptions se
font par rapport à un repère orthonormé indirect. Tapez le listing depart.pov suivant, puis
calculez l'image. Les parties entre /* et */ sont des commentaires pour vous aider :vous n'êtes pas
obligés de les recopier ! Remarquez la structure suivante qui est obligatoire : en premier,
l'observateur, puis les lampes et seulement après les objets.
/* depart.pov : Scene de base pour la suite... */
#include "colors.inc"
/* incorpore les definitions des couleurs */
#include "textures.inc" /* incorpore les definitions des textures */
/****************** D'abord une camera : *******************/
camera {
location <0,3,-5> /* Position de la camera */
look_at <0,1,0> /* Point qu'elle vise */
}
/****************** Puis au moins une lumiere : *******************/
light_source { <-3,5,-5>
/* Position de la lumiere : */
/* un peu au dessus et a gauche de la camera */
color White /* Lumiere blanche */
}
/****************** Maintenant les objets : *******************/
/* Un plan pour materialiser un sol vert : */
plane { <0,1,0>,0 /* vecteur normal au plan (vers l'exterieur), */
/* distance a laquelle commence le plan dans cette direction */
texture { pigment { color Green } }}
/* Une boule blanche posee sur le sol : */
sphere { <0,1,0>,1 /* coordonnees du centre et rayon de la sphere */
texture { pigment { color White } }}
Modifiez des paramètres dans la scène et effectuez le rendu pour voir si l'effet prévu est bien celui
produit.
3.Les primitives
a.Syntaxe des objets de base
•
sphere { <x,y,z>,r }
Une sphère de rayon dont le centre est à la coordonnée
.
box { <xmin,ymin,zmin>,<xmax,ymax,zmax> }
Un boite définie par un coin min et un coin max, les arêtes sont parallèles aux axes.
cylinder { <x1,y1,z1>,<x2,y2,z2>,r }
Un cylindre de rayon dont l'axe est le segment
.
cone { <x1,y1,z1>,r1,<x2,y2,z2>,r2 }
Même signification que pour le cylindre, mais avec un rayon pour chaque extrémité du segment.
torus { grand,petit }
Un tore centré en
et dont le grand rayon est
rayon du trou intérieur est égal à
et le petit
et le rayon extérieur est égal à
plane { <normx,normy,normz>,distance}
Un plan (en fait un demi-espace) dont la normale est le vecteur
situé à
. Par conséquent, le
.
. Ce plan est
unités de l'origine.
En fait, tous ces objets sont pleins. La notion de leur intérieur et extérieur est bien définie. Ce ne
sont pas juste des surfaces. Le coté plein est toujours celui qui est à l'intérieur. Pour le plan c'est un
peu plus subtil, le vecteur normal de la définition indique le demi-espace quin'est pas le coté plein.
Il existe plusieurs autres types de primitives que nous aborderons ultérieurement car elles sont
moinsévidentes.
b. Opérateurs booléens : Constructive Solid Geometry
Puisqu'on peut toujours savoir par le calcul si un point est à l'intérieur d'un objet, on peutdéfinir les
opérateurs suivants.
Soient deux objets A et B, les commandes
union { A B }
intersection { A B }
difference { A B }
désignent respectivement l'union logique de A et B,leur intersection et leur différence (A-B).Par
exemple, pour qu'un point soit à l'intérieur de difference { A B }, il doit être à l'intérieur de
A mais pas de B. Tapez la scène csg.pov suivante, puis effectuez le rendu.
/* csg.pov: Demo des Constructive Solid Geometry */
#include "colors.inc"
#include "textures.inc"
/****************** D'abord une camera : *******************/
camera {
location <2,3,-3> /* Position de la camera */
look_at <0,0,0> /* Point qu'elle vise */
}
/****************** Puis au moins une lumiere : **************/
light_source { <-6,5,-5> color White }
light_source { < 6,5,-5> color White }
/****************** Maintenant les objets : *******************/
plane { <0,1,0>,-1 texture { pigment { color Green } }}
union {
sphere { <-.5,0,0>,1 texture { pigment { Red } } }
sphere { < .5,0,0>,1 texture { pigment { Blue } } }
}
Changez le mot clé union successivement en intersection puis en differenceet calculez
l'image à chaque fois.
4.Opérateurs de transformation
Il existe plusieurs opérateurs permettant de transformer un objet : translate, scale, rotate
et matrix.Ils s'insèrent tous à la fin d'un objet (juste avant le "}" final).
Pour déplacer un objet, on dispose de la commande translate qui est suivie d'un vecteur< , ,
> qui indique le vecteur de translation souhaité.
La commande rotate est normalement suivie d'un vecteur commetranslate, mais il est, en
général, plus simple de l'écrire commeun produit. Par exemple, la commande rotate 60*z
provoquera une rotation de l'objet de 60 degrés dans le sens positif, autour de l'axe .
La commande scale < , , > effectue une affinité sur chaque axe de rapport respectifs ,
et
. Un rapport égal à -1 donne une symétrie.
La commande matrix <
de coefficients
,
,...,
> effectue une transformation suivant la matrice
.
Attention, l'ordre est important, ces opérations ne sont pas commutatives : elles opérent dans l'ordre
où elles apparaissent dans le fichier.
sphere { <0,1,0>,1
/* centre et rayon de la sphere */
scale <1,1,2>
/* affinité de rapport 2 suivant 0z */
translate <1,1,1> /* puis translation en (1,1,1) */
}
5.Les textures
Chaque objet doit comporter une texture (son aspect), sous peine d'apparaîtretotalement noir. Cela
se fait simplement en mettant dans chaque objet destiné à être calculé un bloc texture. Une bille
chromée se fait en tapant les lignes suivantes :
sphere { <0,0,0>,1 texture { Chrome_Metal }}
Cependant, afin de disposer du nom de texture Chrome_Metal,il est nécessaire de placer en tête
du fichier ceci :
#include "colors.inc"
#include "textures.inc"
Ce qui donne l'ordre à PovRay de lire les fichiers colors.inc ettextures.inc et d'incorporer
dans le texte actuel les définitionsqu'ils contiennent, respectivement des couleurs et des matières.
On a alors quelques identificateurs de textures facilement utilisables(attention aux majuscules)
dont :
texture { Copper_Metal } texture { Chrome_Metal } texture { DMFWood6 }
texture { pigment { color White } } texture { pigment { color Red } }
Les deux dernières commandes permettent de "peindre" l'objet dans une couleur uniforme.
Choisissez une couleur (en anglais, évidement) et essayez-la.
6.L'instruction #declare
On peut donner un nom à une construction pour y faire référence plus tard.Cela se fait grâce à
#declare :
#declare rayon
= 10 ;
/* une valeur */
#declare position = <1,2,3> ;
/* un vecteur */
#declare boule
= sphere { position,rayon }
/* un objet
*/
#declare truc = union { boule
/* objet declare au dessus */
torus { rayon+rayon2 , rayon2 /* les deux rayons du tore */
translate position } /* on deplace le tore pour qu'il entoure la boule */}
Puis pour que l'objet déclaré boule apparaisse dans le résultat, il faut en plus placer une (ou
plusieurs) référence(s) à cet objet par :
object { boule }
De manière générale, un #declare "apprend" au logiciel quelque chose, mais cela ne le fait pas
pour autant apparaître dans la scène. On se sert de cette méthode pour factoriser certains éléments
constituant une scène qui apparaissent plusieurs fois : ça évite de les taper inutilement.
C'est aussi très utile pour paramétrer une construction : dans l'exemple truc utilise les mêmes
paramètres que boule, ainsi sion veut changer rayon ou position, cela modifiera d'un coup
boule et truc. Tapez la scène complexe.pov suivante, effectuez en le rendu.
/* complexe.pov: Mise en scene complexe avec references d'objets. */
#include "colors.inc"
#include "textures.inc"
/****************** D'abord une camera : *******************/
camera {
location <0,3,-5> /* Position de la camera */
look_at <0,1,0> /* Point qu'elle vise */
}
/****************** Puis au moins une lumiere : *******************/
light_source { <-3,5,-5>
/* Position de la lumiere : */
/* un peu au dessus et a gauche de la camera */
color White /* Lumiere blanche */}
/****************** Maintenant les objets : *******************/
/* Un plan pour materialiser un sol vert : */
plane { <0,1,0>, /* vecteur normal au plan (vers l'exterieur), */
0 /* distance a laquelle se trouve le plan dans cette direction */
texture { pigment { color Green } }}
#declare longueur_cote
= 4 ;
#declare hauteur_cendrier = 1 ;
#declare cendrier = difference {
box { <-longueur_cote/2, 0,-longueur_cote/2>, < longueur_cote/2,
hauteur_cendrier, longueur_cote/2> }
sphere { <0,hauteur_cendrier,0>,1 scale
<longueur_cote/2.1,hauteur_cendrier*0.8,longueur_cote/2.1> }}
object { cendrier texture { pigment { color Grey } } rotate <0,30,0>}
#declare intervalle
= 1 ;
#declare rayon
= 0.2 ;
#declare hauteur_tube = 4 ;
#declare tube = cylinder { <0,0,0>,<0,hauteur_tube,0>,rayon}
#declare rangee = union {
object {tube translate -4*intervale*<1,0,0> }
object {tube translate -3*intervale*<1,0,0> }
object {tube translate -2*intervale*<1,0,0> }
object {tube translate -1*intervale*<1,0,0> }
object {tube}
object {tube translate 1*intervale*<1,0,0> }
object {tube translate 2*intervale*<1,0,0> }
object {tube translate 3*intervale*<1,0,0> }
object {tube translate 4*intervale*<1,0,0> }
}
object { rangee texture { pigment { color Blue } } translate <0,0,5>}
Exercice 1 : modélisation d'une table
Le but est de modéliser une table à partir de certains paramètres :
1. longueur, largeur et épaisseur de la planche,
2. hauteur et épaisseur des pieds (forme à choisir)
3. distance entre les pieds et le bord de la planche.
Une fois que vous avez une table acceptable, placez la sur un sol (plane)que vous aurez créé (à
l'altitude 0).Faites varier les paramètres, si vous vous êtes bien débrouillés, vous ne devriez pas
avoir de table volante ou autres bizarreries...
Exercice 2 : rotations d'un dé à jouer
Modélisez un dé à jouer, cube sur les faces duquel sont posés des symboles en nombre égal à 1, 2,
3, 4, 5, 6.
Faites d'abord 6 copies de ce cube, orientées pour présenter chacune des 6 faces, puis présentez le
cube posé sur un coin, c'est-à-dire présentant à l'observateur 3 faces contigües.