Почему glUnProject() возвращает -1.0?

Я просто пытаюсь преобразовать координаты окна в координаты объекта в OpenGL, используя gluUnproject().

Я правильно улавливаю координаты X и Y (winX и winY) окна переполнения, используя:

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 и projectM являются идентификационной матрицей, а значение viewportA равно (0, 0, 1440, 720)

Есть идеи?


person FranSto    schedule 11.11.2015    source источник
comment
Добро пожаловать в СО! Ваша проекцияM должна отображать усеченную пирамиду (слева, справа, сверху, снизу, рядом, далеко) в [-1,1]x[-1,1]x[-1,1]. Теперь посмотрите на область значений проекции M*world_vector, если проекция M = diag(1,1,1,1). Вам также может быть полезна статья SongHo о матрице проекций.   -  person decltype_auto    schedule 12.11.2015
comment
Спасибо за ответ. При отладке программы я вижу, что значение моей матрицы projectM 4x4 является единичной матрицей. То же, что и матрица modelviewM 4x4. Я использую glOrtho() вместо glFrustum().   -  person FranSto    schedule 12.11.2015
comment
Дело не в том, усеченный это или куб; дело в том, что вы не сопоставляете его с [-1,1]x[-1,1]x[-1,1] с матрицей проекции тождества. Просто прочитайте статью, на которую я вам указал.   -  person decltype_auto    schedule 12.11.2015


Ответы (2)


Навскидку, я считаю, что функция 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);
person Dietrich Epp    schedule 11.11.2015
comment
Спасибо за ответ. Я попробовал ваш код, и он все еще не работает. Теперь значения для posX, posY и posZ равны -1,001386..., -1,002770... и -1,0 соответственно. На самом деле я не совсем понимаю ваше объяснение. Согласно документации, gluUnProject Функция принимает значения между (0'0 .. window_width) для winX и (0'0 .. window_height) для winY. В любом случае, не могли бы вы объяснить, почему вы выполняете эти операции с первыми двумя параметрами gluUnProject? - person FranSto; 12.11.2015

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

person FranSto    schedule 12.11.2015