// get line of sight through mouse cursor
GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
GLint realy; /* OpenGL y coordinate position */
GLdouble wx, wy, wz; /* returned world x, y, z coords */
GLdouble wx2, wy2, wz2; /* returned world x, y, z coords */
glGetIntegerv (GL_VIEWPORT, viewport);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
/* note viewport[3] is height of window in pixels */
realy = viewport[3] - (GLint) point.y - 1;
gluUnProject ((GLdouble) point.x, (GLdouble) realy, 0.0,
mvmatrix, projmatrix, viewport, &wx, &wy, &wz);
//printf ("World coords at z=0.0 are (%f, %f, %f)\n",
// wx, wy, wz);
gluUnProject ((GLdouble) point.x, (GLdouble) realy, 1.0,
mvmatrix, projmatrix, viewport, &wx2, &wy2, &wz2);
//printf ("World coords at z=1.0 are (%f, %f, %f)\n",
// wx, wy, wz);
// line of sight intersection with y = 0 plane
double f = wy / ( wy2 - wy );
double x2d = wx - f * (wx2 - wx );
double z2d = wz - f * (wz2 - wz );
point.x, point.y - это координаты экрана мыши, 0.0 - вверху слева.
Код предполагает, что плоскость y = 0 заполняет область просмотра.(Вы смотрите на мир из узкого воздушного порта и не видите неба.) Если плоскость y = 0 НЕ заполняет порт обзора, вы должны проверить, находится ли местоположение x, y в небе.'(wy2 - wy