35
glMatrixMode(GL_MODELVIEW); // Делаем ее единичной
glLoadIdentity();
…
12 ОБРАТНЫЕ ПРЕОБРАЗОВАНИЯ
ОКОННЫХ КООРДИНАТ В ОБЪЕКТНЫЕ
Часто требуется пользователю, используя мышь или другой указатель, выбрать точку в трехмерном
пространстве, оперируя лишь ее проекцией на экране. Решая данную задачу, необходимо вспомнить,
что оконные координаты объекта получаются из его мировых путем трех матричных преобразований:
модельно-видовых, проекционных и преобразований к области вывода. И для определения мировых ко-
ординат точки объекта по его оконным координатам требуется проделать обратные, вышеприведенные,
преобразования. Но тут возникает другая проблема, множество точек из мировых координат, располо-
женных вдоль луча-проектора, дадут одну и ту же проекцию на экране. Для разрешения этой неодно-
значности в OpenGL обратные преобразования решены командами gluUnProject() при диапазоне глу-
бин в вашем приложении [0, 1], либо gluUnProject4(), если диапазон глубин отличается от [0, 1]. Рас-
смотрим параметры и функциональные возможности этих команд:
int gluUnProject (GLdouble winx, GLdouble winy, GLdouble winz,
const GLdouble modelMatrix[16],const GLdouble projMatrix[16],
const GLint viewport[4],
GLdouble *objx, GLdouble *objy, GLdouble *objz);
Данная команда преобразует заданные оконные координаты (winx, winy, winz) в объектные коорди-
наты (objx, objy, objz), используя преобразования, заданные модельно-видовой матрицей (modelMatrix),
проекционной матрицей (projMatrix) и портом просмотра (viewport). Если функция выполнилась удач-
но, то она возвращает значение GL_TRUE, в противном случае GL_FALSE.
Для получения однозначного результата от обратного преобразования, команда gluUnProject() тре-
бует в качестве одного из своих параметров значение глубины в оконных координатах (winz). Если winz
= 0.0, то вызов gluUnProject() вернет координаты точки (objx, objy и objz), расположенной на ближней
плоскости отсечения объема видимости, а при winz = 1.0 будет вычислена точка на дальней плоскости
отсечения.
Изъятие текущих значений матриц преобразований осуществляется командой:
void glGetDoublev( GLenum pname, GLdouble *params)
Параметр pname определяет вид матрицы (см. документацию):
модельно-видовой – GL_MODELVIEW_MATRIX;
проецирования – GL_PROJECTION_MATRIX. Параметр params указывает на массив размеще-
ния.
Значения параметров окна можно выбрать командой:
void glGetIntegerv (GLenum pname
, GLdouble *params)
Назначение параметров такое же, как и в команде glGetDoublev. Значение параметра pname для ок-
на должно быть GL_VIEWPORT.
Рассмотрим фрагмент программы, где по экранным координатам точки(x и y), например, взятых от
мыши, вычисляем значение координат точки объекта, обеспечивших эту проекцию. В качестве winz
возьмем значение 0.0.
…
GLint viewport[4]; //для окна
GLdouble mv_matrix[16]; // для модельно-видовой матрицы
GLdouble proj_matrix[16]; // для матрицы прецирования
GLdouble obx,oby,obz; // Возвращаемые объектные x, y, z координаты
GLint x,y;
…
// Обрабатываем событие от "мышки" (формируем значение x и y)
…
glGetIntegerv(GL_VIEWPORT,viewport);
glGetDoublev(GL_MODELVIEW_MATRIX,mv_matrix);