OpenGL:проецирование щелчка мыши на геометрию
Вопрос
У меня есть этот набор представлений:
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
и я получаю положение экрана (sx, sy) по щелчку мыши.
Учитывая значение z, как я могу вычислить x и y в трехмерном пространстве из sx и sy?
Решение
Вы должны использовать gluUnProject
:
Сначала вычислите «непроекцию» на ближнюю плоскость:
GLdouble modelMatrix[16];
GLdouble projMatrix[16];
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
GLdouble x, y, z;
gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z);
а затем в дальний самолет:
// replace the above gluUnProject call with
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);
Теперь у вас есть линия в мировых координатах, которая отображает все возможные точки, которые вы можете найти. мог нажимали.Итак, теперь вам просто нужно интерполировать:предположим, что вам дана координата z:
GLfloat nearv[3], farv[3]; // already computed as above
if(nearv[2] == farv[2]) // this means we have no solutions
return;
GLfloat t = (nearv[2] - z) / (nearv[2] - farv[2]);
// so here are the desired (x, y) coordinates
GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t,
y = nearv[1] + (farv[1] - nearv[1]) * t;
Другие советы
На этот вопрос лучше всего ответит самый авторитетный источник: веб-сайт OpenGL.
На самом деле это зависит от матрицы проекции, а не от матрицы представления модели. http://www.toymaker.info/Games/html/picking.html должен вам помочь — он ориентирован на D3D, но теория та же.
Однако, если вы хотите выбирать с помощью мыши, я предлагаю использовать режим рендеринга выбора.
Редактировать:Имейте в виду, матрица модель-представление действительно играет роль, но, поскольку у вас идентичность, это не проблема.
libqglviewer имеет хорошую систему выбора, если это то, что вы ищете