J'avais besoin d'opération sur les vecteurs pour mon application, j'ai donc créer cette structure :
ainsi que des fonctions pour les manipuler. Je vous fais grâce des fonctions add, mult et norme (aux noms suffisament explicites...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct _VEC { float x,y,z; } vec;
J'ai aussi créer deux fonctions de transfert de ma structure vec à la structure classique float[4] :
J'ai aussi créer deux fonctions sur les matrices d'OpenGL, une pour transposer et l'autre pour avoir l'image d'un vecteur :
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 vec utov (float *tab) { vec resultat; resultat.x=*tab; resultat.y=*(tab+1); resultat.z=*(tab+2); return resultat; } float* vtou (vec vecteur) { float *result; result=(float *) malloc(4*sizeof(float)); *(result)=vecteur.x; *(result+1)=vecteur.y; *(result+2)=vecteur.z; *(result+3)=1; return(result); }
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 float * mmult(float *matrice, float *vecteur) { float *result; float somme; int i,j; result=(float*) malloc(4*sizeof(float)); for(i=0;i<4;i++) { somme=0; for (j=0;j<4;j++) { somme+=(*(matrice+4*i+j)) * (*(vecteur+j)); } *(result+i)=somme; } return(result); } float* mtranspose(float *matrice) { float *result; int i,j; result=(float*) malloc(sizeof(float)*16); for (i=0;i<4;i++) { for(j=0;j<4;j++) { *(result+4*i+j)=*(matrice+4*j+i); } } return(result); }
Puis, enfin, une fonction de rotation d'un vecteur autour d'un axe qui se sert un peu de tout ça et qui constitue le fondement de mon problème
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 vec rotation (vec u,vec axe, float angle) { GLfloat matrice[16]; vec result; if (norme(axe)!=0) { glPushMatrix(); glLoadIdentity(); glRotatef(angle,axe.x/norme(axe),axe.y/norme(axe),axe.z/norme(axe)); glGetFloatv(GL_MODELVIEW_MATRIX,matrice); result=utov(mmult((mtranspose(matrice)),vtou(u))); glPopMatrix(); return(result); } else { return(u); } }
En effet, ce code semble 'bon' puisque je l'utilise dans une fonction camera qui me place gentiment me caméra pour qu'elle tourne autour d'un objet (deux rotations combinées à partir des vecteurs de reference), via gluLookAt.
La caméra se comporte tout à fait bien.
Seulement, j'aimerai utiliser cette fonction rotation dans d'autres fonctions appelées lors du dessin des objets, qui est donc postérieur au placement de la caméra dans le code.
Et la, la fonction rotation me renvoie n'importe quoi, c'est à dire un vecteur plus ou moins constant, meme quand on change les arguments (vecteur de départ, d'axe ou angle).
Je pense que le problème vient du fait que la matrice courante n'est plus l'identité après la transformation appliquée par le gluLookAt, mais je croyais que le glPushMatrix() suivi de glLoadIdentity() eliminerait ce défaut. Il n'en est rien !!
Ca fait plusieurs jours que je suis sur ce défaut et je ne vois toujours pas, merci de votre aide !
Partager