2008-09-22 4 views
8

J'ai ce point de vue jeu:OpenGL: clic de souris projection sur la géométrie

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

et je reçois une position d'écran (sx, sy) à partir d'un clic de souris.

Étant donné une valeur de z, comment puis-je calculer x et y dans l'espace 3d à partir de sx et sy?

Répondre

11

Vous devez utiliser gluUnProject:

D'abord, calculer la "unprojection" au plan près de:

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 au plan loin:

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

Maintenant, vous avez a obtenu une ligne dans les coordonnées du monde qui trace tous les points possibles a pu cliqué sur. 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; 
+0

Désolé pour le commentaire noob. Le troisième paramètre des appels gluUnproject est-il toujours identique (0 et 1) ou dépend-il des valeurs zNear et zFar lorsque nous définissons la matrice de projection avec gluPerspective? – rgngl

2

Ceci est en fait fonction de la matrice de projection, et non la matrice modèle-vue. http://www.toymaker.info/Games/html/picking.html devrait vous aider - c'est D3D-centric mais la théorie est la même.

Si vous cherchez à faire des sélections à base de souris, cependant, je suggère d'utiliser le mode de rendu de sélection. Edit: Attention, la matrice de vue de modèle entre en jeu, mais comme la vôtre est une identité, c'est un non-sens.

3

La réponse la plus fiable est OpenGL's web site.

+0

Mettre le nom de la source dans votre réponse serait utile plutôt que d'avoir à cliquer sur le lien pour le savoir. – danio

Questions connexes