coucou a tous,
actuellement en 2eme annee en ecole d'infographie^^
Je me suis inscris a un projet pr realiser un "raytracer" en langage C et j ai un probl sur la rotation de la sphere
je vous explik:
dans nos cours on place tt les volumes en 0,0,0 pour faciliter les calculs...
parconsequant on doit deplacer virtuellement la position de l oeil a l aide de translation et rotation...
cela marche chez moi pour le plan et le cylindre... mais la sphere reagit tres mal a la rotation...
je vous montre ma rotation en X:
les rotations y et z sont egalements base sur le calcul matriciel:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int rotatex(double *x, double *y, double *z, double angle){ double cosin, sinus, nvy , nvz; cosin = cos((angle * M_PI) / 180); sinus = sin((angle * M_PI) / 180); *x = *x; nvy = (*y * cosin) - (*z * (sinus)); nvz = (*y * sinus) + (*z * cosin); *y = nvy; *z = nvz; return 0; }
pour y:
pour z:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 nvx = (*x * cosin) + (*z * sinus); *y = *y; nvz = (*x * (-sinus)) + (*z * cosin);
ma formule pour la sphere:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 nvx = (*x * cosin) + (*y * (-sinus)); nvy = (*x * sinus) + (*y * cosin); *z = *z;
j ai verifie pleiiiiiin de fois ma formule et je n y ai pas trouve d erreur...
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
29
30
31 double second(double a, double b, double c) { double delta,r1,r2; delta = pow(b, 2) - (4 * a * c); if (delta >= 0) { r1 = (-b - (sqrt(delta))) / (2 * a); r2 = (-b + (sqrt(delta))) / (2 * a); } else return (-1); // ici on fait un ternaire ^^ pour renvoyer la valeur la plus petite positive, si //ya deux intersections ou -1 si yen a pas r2 = ((r2 < 0) ? -1 : r2); return ((r1 > 0 && r1 < r2) ? r1 : r2); } // ici on calcul les coefficients de l equation du second degre // vx,vy, vz est le vecteur vu... // cam->x,y,z est la position de l oeil // targ->taille est le rayon de la sphere double inter_sphere(t_vect *op, t_ultim *ult, t_obj *targ){ double a, b, c; a = (op->vx * op->vx) + (op->vy * op->vy) + (op->vz * op->vz); b = 2 * ((ult->cam->x * op->vx) + (ult->cam->y * op->vy) + (ult->cam->z * op->vz)); c = (ult->cam->x * ult->cam->x) + (ult->cam->y * ult->cam->y) + (ult->cam->z * ult->cam->z) - (targ->taille * targ->taille); return (second(a, b, c)); }
Quelqu un a t il rencontre un probleme similaire ?
ou... quelqu un a une idee ?
Je vous remercie... Lucie
Edit: j ai edite b, c etait une erreur de copiage... desolee
Partager