Programme de lancé de rayon sous Scilab


L'objectif est de construire un "programme" de lancé de rayon dans l'environnement Scilab (un mathlab opensource téléchargeable ici). On commencera par visualiser une scène simple (une sphère par exemple) et tester les modèles d'éclairage.

ETAPE 1 : Une sphère avec un éclairage diffus



Calculez l'image d'une sphère en vue cavalière avec un éclairage diffus. La fonction programmée pourrait avoir la signature suivante :
[image]=RayTracer1(Scene,Window,Viewport);

L'image sera ensuite affichée avec :

ifig=10;
f=scf(ifig); // pour créer un fenêtre
f.color_map =graycolormap(256);
Matplot(image*256);

Le problème revient à calculez une matrice (150x150pixels par exemple) correspondant à l'intersection de droites partant du plan image avec la surface d'une sphère centrée en (0,0) et à calculer le produit scalaire de la normale à la surface avec les vecteurs d'une source lumineuse de direction Light=<1,1,1>.
step 1

ETAPE 2 : réalisme du modèle d'éclairage

Ajoutez une intensité spéculaire et ambiante au modèle d'éclairage.step 2

ETAPE 3 : sources multiples de lumières


Gérez plusieurs éclairages avec atténuation en fonction de la position de la source et prise en compte des propriétés des surfaces. La fonction calculant l'intensité en un point pourrait avoir cette signature :

[intensity]=Eclairages(Vobs,IAmb,Lights,Ps,Ns,Ka,Kd,Ks,ns);

step 3 (source à 30m)step 3 (source à 50m)
step 3 (source à 100m)

ETAPE 4 : Anti-aliasing

Evitez l'effet de marches d'escalier en calculant une image plus précise que celle affichée...

ETAPE 5 : Texture, rugosité...

Perturbez la normale à la surface pour donner à la sphère un aspect rugueux.

ETAPE 6 : Opérations booléennes

Ajouter une deuxième sphère plus petite que vous soustrairez à la première.

ETAPE 7 : Et la couleur fût

Pour prendre en compte les couleurs il faut manipuler 3 matrices (de pixels : RVB) mais il faut une autre procédure d'affichage (que Matplot) et donc un autre format d'image (voir le module SIP pour scilab : SIPtoolbox).