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 :
Et la fonction qui me pose problème est celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;;
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 let Sphere_GetCoord i1 i2 w1 w2 p = ((p -. i1) /. (i2 -. i1)) *. (w2 -. w1) +. w1;;
(c'est le début du code de la fonction de rendu)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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![]()
Partager