Сцена трансформации координат OpenGL в мир

Я пишу приложение MFC c ++, которое использует OpenGL. Программа позволяет рисовать и манипулировать объектами в 3D. Сейчас я хочу найти координаты в том же координатном пространстве, в котором нарисованы мои объекты, везде, где я щелкаю мышью по экрану.

До сих пор я использовал комбинацию glReadPixels и gluUnProject, и она работала, но только когда я щелкаю мышью где-нибудь, где объект уже нарисован. Если я щелкну где-нибудь за пределами моего объекта, полученные координаты будут полностью отключены.

Поэтому мне было интересно, как изменить свой код, чтобы я мог найти координаты в пространстве координат, в котором мои объекты находятся в любом месте экрана. Вот код, который я использовал:

GLint viewport[4];
GLdouble ox, oy, oz;//the coordinates I need
GLfloat winZ = 0.0;
::glGetIntegerv(GL_VIEWPORT, viewport);
::glGetDoublev(GL_PROJECTION_MATRIX,    projectionMatrix);
::glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
GLfloat winX = (float)point.x;//point.x and point.y are the mouse coordinates
GLfloat winY = (float)viewport[3] - (float)point.y;

::glReadPixels( winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

gluUnProject((GLdouble)winX, (GLdouble)winY, (GLdouble)winZ, modelviewMatrix, projectionMatrix, viewport, &ox, &oy, &oz);

2

Решение

gluUnProject берет координаты пространства окна и распечатывает их с помощью обратных преобразований world-view-projection-viewport. Понятия не имеет, соответствуют ли координаты существующему объекту или нет.

Когда вы очищаете буфер глубины, он везде инициализируется значением, которое читается как 1.0 с glReadPixels,

Когда видимые фрагменты объекта нарисованы, они пройдут тест глубины и переопределят значение глубины меньшим значением для каждого пикселя, пересекающего эти фрагменты.

Это означает, что каждый раз, когда вы читаете пиксель в буфере глубины со значением 1,0, это означает, что ничего видимого не было нарисовано в этом пикселе, и именно здесь полученный вами результат полностью отключен.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector