OpenGL: проецирование щелчка мышью на геометрию - PullRequest
8 голосов
/ 22 сентября 2008

У меня есть этот набор просмотра:

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective

и я получаю позицию экрана (sx, sy) от щелчка мыши.

Учитывая значение z, как я могу вычислить x и y в 3d-пространстве из sx и sy?

Ответы [ 4 ]

11 голосов
/ 23 сентября 2008

Вы должны использовать 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;
3 голосов
/ 22 сентября 2008

Лучше всего ответит самый авторитетный источник, Сайт OpenGL .

2 голосов
/ 22 сентября 2008

Это на самом деле зависит от матрицы проекции, а не от матрицы вида модели. http://www.toymaker.info/Games/html/picking.html должен вам помочь - это D3D-ориентированный, но теория та же самая.

Тем не менее, если вы хотите сделать выбор с помощью мыши, я предлагаю использовать режим рендеринга выделения.

Редактировать: Имейте в виду, матрица вида модели вступает в игру, но, так как ваша личность, это не вопрос.

0 голосов
/ 22 сентября 2008

libqglviewer имеет хорошую структуру выбора, если вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...