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 {
<2, 10, -3>
color White }
light_source {
<Location>, COLOR
[LIGHT_MODIFIERS...]
}
Les sources lumineuses
• Ponctuelle
• Spot
• Cylindrique
• Surfacique
• Ambiante
• Spéciale
Falloff location
Center line Radius
Point_at
light_source {
<0, 10, -3>
color White spotlight 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 6 spots
radius 10 falloff 10 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
angle
direction
Plan image Haut
+0.5
droite
+0.5 -0.5
-0.5
Point visé
Position de la caméra
exemples
camera {
location <-4, 3, -5>
look_at <0, 0, 0>
}
camera {
location <-4, 3, -9>
look_at <0, -5, 0>
}
camera {
location <-4, 3, -9>
look_at <0, 0, 0>
}
camera {
location <-4, 3, -9>
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}
finish {
ambient 0 diffuse 0 }
finish {
ambient .2 diffuse .6 }
ambient de 0.1 à 0.2 diffuse de 0.5 à 0.7
finish {
ambient 1 diffuse 0 }
Le cône a finish { ambient 1 diffuse 0 }
Et la sphère finish {
ambient 0 diffuse 0 }
Les 2 primitives ont comme attributs:
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 > //centre 1 //rayon pigment {color < 0 , 0 , 1 >} //couleur }
• Le parallélépipède
• Syntaxe box {
<Sommet 1>, <Sommet 2>
[paramètres...]
}
Sommet 2
Sommet 1
box{
< -1 , -1 , -1 > //premier coin
< 1 , 1 , 1 > //deuxième coin pigment {
color < 1.5 , 0 , 0 >} //couleur }
• Le cylindre
• Syntaxe :
cylinder{
<centre de la base>
< centre de la surface supérieure >
Rayon [ open ]
[paramètres...]
}
centre de la surface supérieure
rayon
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 }
}
• Le cône
• Syntaxe cone {
<centre de la base>
rayon de la base
<centre de la surface supérieure>
rayon de la surface supérieure [ open ]
[paramètres...]
}
Base point Cap point
Base radius Cap radius
• exemples
cone{
< -1 , 0 , 0 > //centre du premier disque 2 //son rayon
< 0 , 1 , 0 > //centre du deuxième disque 1 //son rayon
open
pigment {Yellow } //couleur : jaune }
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 > } }
• Le tore
• Syntaxe
torus {
Grand rayon
Petit rayon [paramètres...]
}
X
Grand rayon
Petit rayon
Z
Ligne médiane
torus{
5 , 0.2 //rayons extérieur et intérieur pigment {Pink }
} torus{
1, 0.2 //rayons extérieur et intérieur pigment {Orange }
}
• 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
#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
Les mots réservés
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
?:
Expression conditionnelle
& | Logiques
< ; <= ; = ; != ; >= ; >
Relationnels
* / + - binaire
+ - ! Unaire
Arithmétiques
Exemple
#declare Count=0;
#while (Count < 5)
object { MyObject translate x*3*Count }
#declare Count=Count+1;
#end
• text { ttf
"NomDelaPolice.ttf/ttc"
"Chaîne de caractères"
Epaisseur,
<Offset>
[paramètres...]
}
Les textes
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) }