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) }