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
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.
Les primitives
Ce sont les briques de base qui permettent de construire des objets plus complexes.
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
. Par conséquent, le
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é à
.
. 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 qui n'est pas le coté plein.
Il existe plusieurs autres types de primitives que nous aborderons ultérieurement car elles sont
moins évidentes.
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 peut dé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 difference et
calculez l'image à chaque fois.
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 comme translate, mais il est, en
général, plus simple de l'écrire comme un 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) */
}
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) */
}
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 si on 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.