Я пишу приложение 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);
gluUnProject
берет координаты пространства окна и распечатывает их с помощью обратных преобразований world-view-projection-viewport. Понятия не имеет, соответствуют ли координаты существующему объекту или нет.
Когда вы очищаете буфер глубины, он везде инициализируется значением, которое читается как 1.0 с glReadPixels
,
Когда видимые фрагменты объекта нарисованы, они пройдут тест глубины и переопределят значение глубины меньшим значением для каждого пикселя, пересекающего эти фрагменты.
Это означает, что каждый раз, когда вы читаете пиксель в буфере глубины со значением 1,0, это означает, что ничего видимого не было нарисовано в этом пикселе, и именно здесь полученный вами результат полностью отключен.
Других решений пока нет …