Un peu de PovRay
Transcription
Un peu de PovRay
Un peu de PovRay http://www.povray.org • Le système de coordonnées Les sources lumineuses • • • • • • Ponctuelle Spot Cylindrique Surfacique Ambiante Spéciale light_source { <Location>, COLOR [LIGHT_MODIFIERS...] } light_source { <2, 10, -3> color White } Les sources lumineuses • • • • • • Ponctuelle Spot Cylindrique Surfacique Ambiante Spéciale location Center line light_source { Radius <0, 10, -3> Falloff color White spotlight Point_at radius 15 falloff 20 tightness 10 point_at <0, 0, 0> } Sans spot à gauche – avec à droite Variation des paramètres light_source { <0, 10, -3> color White spotlight radius 15 falloff 20 tightness 10 point_at <0, 0, 0> } light_source { <0, 10, -3> color White spotlight radius 10 falloff 10 tightness 10 point_at <0, 0, 0> } radius 20 falloff 15 radius 10 falloff 10 6 spots 6 spots Les sources lumineuses • • • • • • Ponctuelle Spot Cylindrique Surfacique Ambiante Spéciale light_source { <0, 10, -3> color White cylinder radius 10 falloff 20 tightness 0 point_at <0, 0, 0> } 6 spots à gauche – 6 cylindres à droite La caméra Haut Point visé +0.5 Plan image -0.5 angle +0.5 -0.5 Position de la caméra direction droite exemples camera { camera { location <-4, 3, -9> location <-4, 3, -5> look_at <0, -5, 0> look_at <0, 0, 0> } } camera { camera { location <-4, 3, -9> location <-4, 3, -9> look_at <0, 0, 0> look_at <0, 0, 0> } angle 48 } Un programme "complet" #include "colors.inc" #include "textures.inc" camera { location <-4, 3, -9> look_at <0, 0, 0> right <-1.33,0,0> angle 48 } light_source { <2, 10, -3> color White } /* Puis viennent les descriptions des primitives et donc de la scène */ Remarque : lumière ambiante, lumière diffuse et lumière spéculaire • Ambiante : pour simuler la lumière ambiante. Elle diffuse dans toutes les directions • Diffuse : diffuse dans toutes les directions, de la même manière, la lumière sur des surfaces mates. • Spéculaire : pour simuler l'effet de miroir • Syntaxe: – Soit • global_settings { ambient_light COLOR } • finish {ambient x diffuse y specular z} dans la description de la primitive ou • finish {ambient <r,g,b> diffuse y specular z} Les 2 primitives ont comme attributs: finish { ambient 0 diffuse 0 } finish { ambient 1 diffuse 0 } Le cône a finish { ambient 1 diffuse 0 } Et la sphère finish { ambient 0 diffuse 0 } finish { ambient .2 diffuse .6 } ambient de 0.1 à 0.2 diffuse de 0.5 à 0.7 Cône : finish { ambient <0.1,0.1,0.1> diffuse 0.3 specular 0.5 } Sphère: finish { ambient <0.4,0.4,0.4> diffuse 0.3 specular 0.5 } Et le sol : finish { reflection {1.0} ambient 0.6 diffuse 0 } finish { reflection {1.0} ambient 0.6 diffuse 0.5 } finish { reflection {1.0} ambient 0 diffuse 0.5 } Couleurs • #include "colors.inc" • color rgb < 0.2 , 0.3 , 0.4 > • color red 1.0 green 1.0 blue 1.0 • color White • Ou encore pigment { color rgb<1, 0, 0.3> } Pour le cône pigment { color rgbf<1, 0, 0,1> } Pigments • Syntaxe – object { MonObjet texture { pigment { color Red } } } ou – object { MonObjet pigment {color Red } } • Autres arguments : checker, hexagon, brick plane { y, -1 texture { pigment { checker color rgb<0.5, 0, 0> color rgb<0, 0.5, 0.5> } finish { diffuse 0.4 ambient 0.2 phong 1 phong_size 100 reflection 0.25 } } pigment { hexagon color rgb<0.5, 0, 0> color rgb<0, 0.5, 0.5> } pigment { brick color rgb<0.5, 0, 0> color rgb<0, 0.5, 0.5> } Les primitives en Povray Les primitives • Sphère sphere { <Centre> Rayon [Paramètres] } • Exemple sphere{ < 0, 0, 0 > //centre 1 //rayon pigment {Cyan} //couleur } ou sphere{ <0,0,0> 1 pigment {color < 0 , 0 , 1 >} } //centre //rayon //couleur Sommet 2 • Le parallélépipède • Syntaxe box { <Sommet 1>, <Sommet 2> [paramètres...] } box{ < -1 , -1 , -1 > <1,1,1> //premier coin //deuxième coin pigment { color < 1.5 , 0 , 0 >} //couleur } Sommet 1 • Le cylindre • Syntaxe : cylinder{ <centre de la base> centre de la surface supérieure rayon < centre de la surface supérieure > Rayon [ open ] [paramètres...] } centre de la base • exemples cylinder{ < 0, -1, 0 > //centre du premier disque < 0, 1, 0 > //centre du deuxième disque 1 //rayon du cylindre pigment {color < 2 , 1 , 1 > } } cylinder{ <1,0,0> < -1 , 0 , 0 > 1 open //cylindre ouvert pigment {Yellow } } Cap radius Cap point • Le cône • Syntaxe cone { <centre de la base> Base radius rayon de la base <centre de la surface supérieure> rayon de la surface supérieure [ open ] [paramètres...] } Base point • exemples cone{ < -1, 0, 0> //centre du premier disque 2 //son rayon < 0, 1, 0 > //centre du deuxième disque 1 //son rayon pigment {color < 0 , 0.3 , 3 > } } cone{ < -1 , 0 , 0 > 2 <0,1,0> 1 open pigment {Yellow } } //centre du premier disque //son rayon //centre du deuxième disque //son rayon //couleur : jaune • Le tore • Syntaxe torus { Grand rayon Petit rayon [paramètres...] } Z Ligne médiane Grand rayon X Petit rayon torus{ torus{ 1, 0.2 //rayons extérieur et intérieur pigment {Orange } } 5 , 0.2 //rayons extérieur et intérieur pigment {Pink } } • Le plan – plane { <A, B, C>, D } = Ax+By+Cz+D • Syntaxe plane { <Normal> Distance [paramètres...] } • Exemple camera { location <10,1,10> look_at <0,0,0> } plane { <0, 1, 0> 0 texture { CloudArea } } plane { y, -1.5 pigment { checker Green, White } } Le polygone polygon { Nombre de points, <Point_1> <Point_2>... <Point_n> [paramètres...] } polygon{ 4 <0,0,0> <1,0,0> <1,1,0> <0,1,0> pigment{ color <0,0,5> } } Les transformations géométriques •Les translations. box { <-1, -1, -1> < 1, 1, 1> pigment {Blue} } box { < -1, -1, -1> < 1, 1, 1> pigment {Blue} translate <2,0,0> } box { < -1, -1, -1> < 1, 1, 1> pigment {Blue} translate <0,-2,-1> } Les mises à l'échelle box { < -1 , -1 , -1 > <1,1,1> pigment {Blue} scale <1,2,0> } box { < -1 , -1 , -1 > <1,1,1> pigment {Blue} scale <2,0.5,0.3> } Les rotations Les rotations box { < -1 , -1 , -1 > <1,1,1> rotate <0,45,0> } box { < -1 , -1 , -1 > <1,1,1> texture {Pine_Wood } rotate <0,45,60> } box { < -1 , -1 , -1 > <1,1,1> texture {Chrome_Metal } rotate <-20,-45,60> } Remarques • rotate <45,0,0> = rotate x*45 • rotate <45,-30,20> = rotate x*45 rotate y*30 rotate z*20 • rotate z*20 = rotate 20*z • rotate y*45 x*45 = rotate <0,45,0> rotate <45,0,0> • rotate y*45 x*45 ≠rotate <45,45,0> CSG En PovRay union { objets... [ paramètres... ] } intersection { objets... [ paramètres... ] } difference { objets... [ paramètres... ] } union{ sphere{<0,1,0>,0.35} cone{<0,0,0>,0.45, <0,1.2,0>,0 } texture{Glass3} translate <0.5, 0, 0> } merge{ sphere{<0,1,0>,0.35} cone{<0,0,0>,0.45, <0,1.2,0>,0} texture{Glass3} translate < 0.5, 0, 0> } difference{ box { <0,0,0>,<1,1,1> texture{ My_Wood } } sphere{ <0,0,0>,0.5 texture{ My_Wood } translate<1,1,0> } } difference{ box { <0,0,0>,<1,1,1> } sphere{ <0,0,0>,0.5 translate<1,1,0> } texture{ My_Wood } } Quelques éléments du langage • Les commentaires – Comme en C ou en C++ – Exemples : /* Ceci est un commentaire sur plusieurs lignes */ // ceci est un autre commentaire • Déclaration des constantes ou des variables – #declare IDENTIFICATEUR=Valeur; – le point-virgule obligatoire après les expressions utilisant des réels, vecteurs et déclarations de couleur – Exemples : • • • • • • • • • #declare Rows = 5; #declare Count = Count+1; #declare White = rgb <1,1,1>; #declare Cyan = color blue 1.0 green 1.0; #declare Font_Name = "ariel.ttf" #declare Rod = cylinder {-5*x,5*x,1} #declare Ring = torus {5,1} #declare Europe = Blue; #declare camera_face = camera { location <0,0,-6> look_at <0,0,0> } Puis camera {camera_face} #declare Ma_Transformation = transform{ Liste des transformations } object{ Mon_Object transform Ma_Transformation } Exemple : #declare transfo = transform {rotate <0,45,60> scale <0.5,1,1> translate <0,0,3>} ; box { < -1, -1, -1> < 1, 1, 1> pigment {Blue} transform transfo } #declare OrangeYellow = color rgb<1,0.85,0>; #declare Ball1 = sphere{ <0,0,0>,1 texture{pigment{color OrangeYellow} finish {ambient 0.25 diffuse 0.75} } } object{Ball1 translate< 4, 0,-4>} Les "include" • Permet d'inclure jusqu'à 10 fichiers • \Program Files\PovRay\POV-Ray for Windows v3.6\include #include "colors.inc" //Couleurs Standard #include "textures.inc" //Textures Standard #include "math.inc" //fonctions de math #include "rad_def.inc" //radiosité #include "rand.inc" //tirages aléatoires #include "shapes.inc" //générations de formes variées #include "strings.inc" //textes // --- textures --#include "finish.inc" //finitions de base #include "glass.inc" //verres #include "golds.inc" //Ors #include "metals.inc" //Metaux #include "stones.inc" //include-file pour STONES1 et STONES2 #include "stones1.inc" //pierres #include "stones2.inc" //pierres #include "woodmaps.inc" //bois #include "woods.inc" //bois Les macro #macro Identificateur (paramètres... ) instructions... #end #macro boite (bas_gauche,haut_droit, translat, rotation, echelle, couleur ) object { box{ bas_gauche, haut_droit } pigment { color couleur } scale echelle rotate rotation translate translat } #end boite (<0,0,0>,<largeur,hauteur,profondeur>,0,0,3,Blue ) Quelques éléments du langage Les mots réservés #break #case #debug exemple #debug Chaine1 : message à la console #declare #default #else #end #error Envoie le message vers la console correspondante, et stoppe l'interprétation du script. #fclose #fopen #if #ifdef #ifndef Exemple #ifdef (Ma_Sphere) // Si Ma_Sphere existe object {Ma_Sphere pigment {Red} translate <2,5,0> } #else #declare Ma_Sphere = sphere {0,1 pigment {Green} translate <2,5,0>} #end #include #local #macro #range #read #render exemple #render "message" même effet que #debug, #statistics exemple #statistics "message" même effet que #debug #switch #undef Permet de 'vider' une variable, comme si elle n'avait jamais été déclarée. #undef (Ma_Sphere) #version #warning comme #debug sauf que le mot Warning est ajouté au message #while #write Les opérateurs Arithmétiques Unaire +-! binaire */+- Relationnels < ; <= ; = ; != ; >= ; > Logiques & | Expression conditionnelle ?: Exemple #declare Count=0; #while (Count < 5) object { MyObject translate x*3*Count } #declare Count=Count+1; #end Les textes • text { ttf "NomDelaPolice.ttf/ttc" "Chaîne de caractères" Epaisseur, <Offset> [paramètres...] } text{ttf Font "X",1,0.5 translate <3,0.5,0> } text{ttf Font "Y",0.01,0 translate <0.5,3,0> } text{ttf Font "ZZZZZ",0.01,0.5 translate <0,0.5,-3> rotate <0,180,0>} Les fichiers #fopen MonFichier "mydata.txt" read ( write ou append ) #while (defined(MonFichier )) #read (MonFichier ,Var1,Var2,Var3) ... #end Exemple #while (defined(MyFile1)) #read (MyFile1,Var1,Var2,Var3,Var4) #write (MyFile2,Var1," ",Var2," ",Var3," ",Var4) #end #fclose MonFichier Les tableaux • • • • • • #declare V1 = <1,8.5,0.0> #declare X1 = V1.x; sphere {0,1} //= sphere {<0,0,0>,1} #declare MonTableau = array[10] #declare MonTableau [5] = pigment{White} #declare MonTableau = array[4][5] – maximum de 5 dimensions • Tous les éléments sont de même type, celui de la première initialisation • #declare couleur = array[5] = {Blue, Yellow,Black, Green, Red} • #declare Chiffres = array[4][10] { {7,6,7,0,2,1,6,5,5,0}, {1,2,3,4,5,6,7,8,9,0}, {0,9,8,7,6,5,4,3,2,1}, {1,1,2,2,3,3,4,4,5,5} } • dimensions(couleur) donne 1 • dimensions(Chiffres) donne 2 Quelques fonctions abs(A) acos(A) acosh(A) asin(A) asinh(A) atan2(A,B) (angle en radians) atan(A) tanh(A) sin(A) cos(A) A en radians cosh(A) sqrt(A) degrees(A) Convertit de radians en degrés... ceil(A) plus petit entier > A. floor(A) entier le plus grand < A. div(A,B) division entière de A par B. exp(A). int(A) log(A) max(A,B,...) min(A,B,...) mod(A, B) A modulo B. pow(A,B) rand(I) nombre aléatoire entre 0.0 et 1.0 inclus. seed(I) Initialise le tirage aléatoire #declare R1 = seed(0); #declare R2 = seed(12345); sphere { <rand(R1), rand(R1), rand(R1)>, rand(R2) }