CodeS-SourceS
Rechercher un code, un tuto, une réponse

Opengl : gluunproject / comment projeter la souris sur un plan !

Avril 2017

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 ça parce que j'ai failli m'arracher les cheveux à force de chercher et de ne rien trouver sur le NET. j'espère que cela 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 souris (SOURI.X) et (HAUTEUR_ECRAN - SOURI.Y) ici on prend HAUTEUR_ECRAN - SOURI.Y parce que sinon on aura les y inversés! (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 souris sur le plan qui fait face à la camera (que j'appelle le plan de l'écran), mais ce n'est pas ce qu'on veut!
Nous ce qu'on veut c'est le projeté de la souris sur un plan!! Donc il suffit pour cela de trouver l'équation de la droite passant par AB et de calculer l'intersection de cette droite avec le plan que l'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 schéma):
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" étant un réel 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 à 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'équation 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 souris 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; 


on obtient maintenant ceci :


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'à donner les coordonnées (Mx,My,0) à mon objet et il sera exactement sous ma souris!!

A voir également

Publié par popo_joe.
Ce document intitulé «  Opengl : gluunproject / comment projeter la souris sur un plan !  » issu de CodeS-SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Programmer des socket en c++ builder client/server socket
Passer un tableau a 2 dimensions a une fonction