Question

J'ai cette vue définie:

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective

et j'obtiens une position d'écran (sx, sy) d'un clic de souris.

Étant donné la valeur de z, comment puis-je calculer x et y dans un espace 3D à partir de sx et de sy?

Était-ce utile?

La solution

Vous devez utiliser gluUnProject :

Tout d'abord, calculez le "non-projection" " vers le plan proche:

GLdouble modelMatrix[16];
GLdouble projMatrix[16];
GLint viewport[4];

glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);

GLdouble x, y, z;
gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z);

puis vers le plan éloigné:

// replace the above gluUnProject call with
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);

Vous avez maintenant une ligne dans les coordonnées mondiales qui trace tous les points possibles sur lesquels vous auriez pu cliquer. Alors maintenant, vous avez juste besoin d'interpoler: supposons qu'on vous donne la coordonnée z:

GLfloat nearv[3], farv[3];  // already computed as above

if(nearv[2] == farv[2])     // this means we have no solutions
   return;

GLfloat t = (nearv[2] - z) / (nearv[2] - farv[2]);

// so here are the desired (x, y) coordinates
GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t,
        y = nearv[1] + (farv[1] - nearv[1]) * t;

Autres conseils

Cela dépend en fait de la matrice de projection et non de la matrice de vue modèle. http://www.toymaker.info/Games/html/picking.html devrait vous aider - il est centré sur D3D mais la théorie est la même.

Si vous souhaitez effectuer une sélection à l'aide de la souris, je vous suggère toutefois d'utiliser le mode de rendu de la sélection.

Éditer: Remarquez que la matrice de vue modèle entre en jeu, mais puisque votre identité est une identité, elle n'est pas un problème.

libqglviewer dispose d'un bon cadre de sélection si c'est ce que vous recherchez

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top