Salut!
COMMENT PROJETER LA SOURIS SUR PLAN?? AHH!!!
Voila dans quel état j'étais hier!
Heureusement j'ai fini par trouver! Et je vais expliquer comment j'ai fait! ( je posterai meme mon projet en cours pour vous montrer le résultat!
(je fais ca parce que j'ai failli m'arracher les cheveux a force de chercher et de ne rien trouver sur le NET. j'espere que ca va aider quelques uns!)
D'abord on utilise gluUnProject!
on lui passe les arguments dont elle a besoin, c'est a dire la matrice MODELVIEW, la matrice de PROJECTION, le VIEWPORT, les coordonnées de ma souri(SOURI.X)et (HAUTEUR_ECRAN - SOURI.Y) ici on prend HAUTEUR_ECRAN - SOURI.Y parce que sinon on aura les y inversé!( car le 0,0 d'opengl n'est pas le même 0,0 de l'écran )
GLdouble Bx,By,Bz;
GLdouble Mx,My, Mz,t;
GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix );
glGetDoublev(GL_PROJECTION_MATRIX,projmatrix );
glGetIntegerv(GL_VIEWPORT,viewport );
gluUnProject(SOURI.X,viewport[3]-SOURI.Y,0, mvmatrix, projmatrix,viewport,&Bx,&By,&Bz ); // ici SOURI.X et SOURI.Y sont les coordonnées de ma souri capturées avec SDL
une fois que c'est fait! on obtient ceci :

on obtient le projeté de la souri, sur le plan qui fait face a la camera ( que j'appel le plan de l'ecan)
mais ce n'est pas ce qu'on veut!
Nous ce qu'(on veut c'est le projeté de la souri sur un plan!!
donc suffit pour cela, de trouver l'équation de la droite passant par AB et de calculer l'intersection de cette droite avec le plan qu'on VEUT!
(dans ce tuto je veux projeter les coordonnées de ma souris sur le plan XY)
equation de droite passant par AB :
soit les points :
VOIR SCHEMA
A(Ax,Ay,Az) //position de ma caméra
B(Bx,By,Bz) //obtenu avec glUnproject
AB= ((Bx-Ax),(By-Ay),(Bz-Az))
soit un point M de coordonnée M(Mx,My,Mz)
AM = t * AB // AM est colinéaire a AB et "t" etant un reel quelconque
| Mx-Ax | | Bx-Ax |
| My-Ay | = t* | By-Ay |
| Mz-Az | | Bz-Az |
on en déduit :
Mx= t *(Bx-Ax) + Ax
My= t *(By-Ay) + Ay
Mz= t *(Bz-Az) + Az
le point M est un point de la droite passant par AB.
Maintenant je veux que ce point M soit le point a la fois sur la droite AB et sur le plan XY.
donc il faut que je calcul "t" pour que mon M soit sur mon plan XY!
or l'equation de mon plan XY est : z=0
donc pour que mon point M soit sur mon plan il faut que sa coordonnées en z soit nulle, sachant cela je peux calculer "t" avec l'expression :
Mz = t *(Bz-Az) + Az = 0
d'ou
t = -Az / (Bz-Az)
on remplace alors t dans les expressions de Mx et My. ET VOILA!!!
code final :
GLdouble Bx,By,Bz;
GLdouble Mx,My, Mz,t;
GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);
glGetIntegerv(GL_VIEWPORT,viewport);
gluUnProject( SOURI.X,viewport[3]-SOURI.Y,0,mvmatrix,projmatrix,viewport,&Bx,&By,&Bz); // ici SOURI.X et SOURI.Y sont les coordonnées de ma souri capturées avec SDL
t = -Az/(Bz-Az); // on calcule t en fonction de la position de la camera(Az) et de (Bz)
Mx = t*(Bx-Ax)+Ax; //on calcule les positions de M avec t
My = t *(By-Ay)+Ay ;
Mz = 0;
et VOILA!!!
maintenant mon POINT M est le point d'intersection de ma droite AB avec le plan XY!!!
et donc je n'ai plus qu'a donner les coordonnées (Mx,My,0) a mon objet et il sera exactement sous ma souris!!
voici un petit executable illustrant la situation:
(vous pouvez bouger avec les fleches, clicker et bouger la souri pour tourner autour, zoomer avec la molette)
http://dl.free.fr/qcPx9Xt1b