Lancer de rayon - que fait cette fonction ? Comment faire un effet ?
Bonjour,
J'ai un code de lancer de rayon sur des sphères opaques, en CAMl, et j'ai un problème pour déterminer ce que fait une des fonction. On a, au préalable, définit quelques types :
Code:
1 2 3 4 5
| type point == float * float * float;;
type vector == float * float * float;;
type rayon == point * vector;;
type couleur == int * int * int;;
type sphere == point * float * couleur;; |
Et la fonction qui me pose problème est celle-ci :
Code:
1 2
| let Sphere_GetCoord i1 i2 w1 w2 p =
((p -. i1) /. (i2 -. i1)) *. (w2 -. w1) +. w1;; |
qui se retrouve un peu après dans la fonction de rendu (sur un pixel - sachant qu'après on boucle sur tous les pixels) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| let rendu_pixel rect_Left rect_Top rect_Right rect_Bottom i j eye lp lv objects =
let zoom = 200.0 in
let x = Sphere_GetCoord rect_Left rect_Right (0. -. zoom) zoom (float_of_int i) in
let y = Sphere_GetCoord rect_Top rect_Bottom zoom (0. -. zoom) (float_of_int j)
in
let t = ref 1.0E10 in
let (px,py,pz) = eye in
let vx = ref (x -. px) in
let vy = ref (y -. py) in
let vz = ref (0. -. pz) in
let mod_v = modv (!vx,!vy,!vz) in
vx := !vx /. mod_v;
vy := !vy /. mod_v;
vz := !vz /. mod_v;
let bShadow = ref false in
let spherehit = ref ((0.,0.,0.),0.,(0,0,0)) in
let ref_objects = ref objects in
while !ref_objects <> [] do
let a = (hd !ref_objects) in
ref_objects := tl !ref_objects;
let taux = GetSphereIntersec a (eye,(!vx,!vy,!vz)) in
if (taux > 0.) && (taux < !t) then begin
t := taux;
spherehit := a;
end;
done; |
(c'est le début du code de la fonction de rendu)
J'avais pensé que pour chaque ligne et colonne de l'image finale la fonction Sphere_GetCoord permettait d'obtenir l'abscisse ou l'ordonnée d'un point de la sphère. Mais bon j'ai vraiment du mal à voir ce que la fonction fait.
Par ailleurs, je savoir comment insérer d'autres effets, par exemple des effets miroir et/ou transparence. Je pense qu'il faudrait insérer dans le type "sphere", des coefficients de transparence et de réflexion compris entre 0 et 1. Puis le principe resterait le même jusqu'au calcul de l'intersection du rayon avec la sphère, mais que pour le rendu on prendrait en compte ces coefficients pour donner la couleur finale au pixel. Enfin, je n'ai qu'une vague idée de ce qu'il faudrait faire, et j'aimerais un peu d'aide.
Merci d'avance :)