2015-11-11 3 views
0

Я просто пытаюсь преобразовать координаты окна в координаты объекта в OpenGL, используя gluUnproject().Почему glUnProject (...) возвращает -1.0?

Я ловлю X и координаты Y (Winx и винным) окна GLUT правильно используя:

glutPassiveMotionFunc(mouseMove); 

, а затем я установил Winz используя

glReadPixels(int (winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ) 

Затем я установил PosX, Posy и posZ (координаты объекта) с использованием

gluUnProject(winX, winY, winZ, modelviewM, projectionM, viewportA, &posX, &posY, &posZ); 

от:

glGetDoublev(GL_MODELVIEW_MATRIX, modelviewM); 
glGetDoublev(GL_PROJECTION_MATRIX, projectionM); 
glGetIntegerv(GL_VIEWPORT, viewportA); 

Я никоим образом не изменяю значение матрицы. Проблема заключается в том, что возвращаемые значения gluUnProject для posX, posY и posZ равны всем -1,0

В заключение я должен сказать, что значения modelviewM и projectionM являются идентификационной матрицей, а значение viewportA равно (0, 0, 1440, 720)

Любые идеи?

+0

Добро пожаловать в SO! Ваша проекцияM должна отображать усечку (левый, правый, верхний, нижний, ближний, дальний) на [-1,1] x [-1,1] x [-1,1]. Теперь посмотрим на область значений проекцииM * world_vector, если projectM = diag (1,1,1,1). Вы также можете найти статью [SongHo Projection Matrix article] (http://www.songho.ca/opengl/gl_projectionmatrix.html). –

+0

Спасибо за ответ. Отладка программы, я вижу, что мое матричное значение projectionM 4x4 - это единичная матрица. То же, что и матрица modelviewM 4x4. Я использую glOrtho() вместо glFrustum(). – FranSto

+0

Дело не в том, что это усечка или куб; Дело в том, что вы не сопоставляете его с [-1,1] x [-1,1] x [-1,1] с матрицей тождественного проектирования. Просто прочитайте статью, на которую я указал. –

ответ

0

Оффлайн, я считаю, что функция gluUnProject принимает значения в диапазоне -1 .. + 1, а не 0..width и 0..height. Так,

gluUnProject(
    ((double) winX + 0.5)/(double) width * 2.0 - 1.0, 
    ((double) winY + 0.5)/(double) height * 2.0 - 1.0, 
    winZ, 
    modelviewM, 
    projectionM, 
    viewportA, 
    &posX, &posY, &posZ); 
+0

Спасибо за ответ. Я пробовал ваш код, и он все еще не работает. Теперь значения для posX, posY и posZ равны -1.001386 ..., -1.002770 ... и -1.0 соответственно. На самом деле я не совсем понимаю ваше объяснение. В соответствии с [документацией] (https://www.opengl.org/sdk/docs/man2/xhtml/gluUnProject.xml) функция _gluUnProject_ принимает значения между (0'0 .. window_width) для winX и (0 ' 0 .. window_height) для winY. В любом случае, не могли бы вы объяснить, почему вы выполняете эти операции с первыми двумя параметрами _gluUnProject_? – FranSto

-1

проблема решена: моя глупая ошибка, что я звоню gluUnProject() в главной функции().
Я заменил его сразу после присвоения winZ в функции mouseMove().
Он работает!
Единственное сомнение, которое у меня есть сейчас, это то, почему значение posZ не изменяется. Я использую
glReadPixels(int (winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
для получения значения winZ.

Смежные вопросы