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;
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