Застрял в реализации выбора OpenGL - PullRequest
5 голосов
/ 11 августа 2011

Я уже могу найти мировые координаты места, где я щелкнул, и он также проверяет это с помощью буфера глубины.Для этого используется следующий код:

GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);

// obtain the Z position (not world coordinates but in range 0 - 1)
GLfloat z_cursor;
winX = (float)x_cursor;
winY = (float)viewport[3]-(float)y_cursor;
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z_cursor);

// obtain the world coordinates
GLdouble x, y, z;
gluUnProject(winX, winY, z_cursor, modelview, projection, viewport, &x, &y, &z);

, где x_cursor и y_cursor являются моими координатами курсора.

Пока все хорошо, и при печати x, y, z они кажутся хорошими!

Но сейчас ... После анализа моих файлов, содержащих все многоугольники / треугольники.Я положил все в списки отображения openGL.Так что моя программа в основном просто вызывает списки и переводит / поворачивает их.Каждый объект имеет уникальное имя.Так что все, что я держу, это списки, я не храню точки / треугольники каждого объекта

Мой вопрос:

Итак, у меня есть мои мировые координаты того, где я щелкнул, но как я могувыяснить, какой объект соответствует этой позиции!?

Ответы [ 4 ]

4 голосов
/ 11 августа 2011

Если вы просто хотите получить идентификатор объекта и готовы допустить 2-кратное перерисовывание:

1) Очистите буферы цвета и глубины

2) Нарисуйте все объекты разными сплошными цветами (отключитетекстурирование), поддержание цвета -> карта идентификатора объекта.

3) Считывание цветового буфера в позиции мыши, отметка цвета и поиск на карте цветов.

4) Очистка буферов цвета и глубины иперерисовать сцену как обычно.

1 голос
/ 11 августа 2011

Думаю, вас заинтересуют: http://www.gpwiki.org/index.php/OpenGL:Tutorials:Picking

0 голосов
/ 27 ноября 2012

Внесите луч в сцену с точки зрения глаза.

Вычисление местоположения xyz в мировом пространстве щелчка мыши в ближней плоскости с использованием векторной арифметики.

Вот схема того, что вам нужно сделать:

enter image description here

Это более эффективно, чем непроектирование, потому что не проектирование включает обратную матрицу (что довольно дорого)

Это именно тот процесс, который вы бы использовали для преобразования луча в сцену для трассировщика лучей для пикселя, по которому щелкнули. (В трассировщике лучей вы получаете цвет, здесь вы получаете идентификатор объекта).

0 голосов
/ 11 августа 2011

См. Руководство по комплектованию OpenGL . Он содержит полностью рабочий пример. Однако кажется, что код все еще можно улучшить, если вы хотите выбрать только объект, ближайший к камере (например, нарисованный сверху). Однако вы можете изменить код, чтобы получить этот результат.

void list_hits(GLint hits, GLuint *names)
{
    int i; int bestmatch; GLuint bestdistance;
    if (hits < 1) {
      return;
    }
    bestmatch = 0;
    bestdistance = names[bestmatch*4+1]; // min distance to object.
    for (i = 1; i < hits; i++)
    {
        distance = names[i*4+1];
        if (distance < bestdistance) {
           bestmatch = i; bestdistance = distance;
        }
    }
    printf("Hit: %d.\n", bestmatch);
 }

Предостережение : я делал это раньше, но этот конкретный код не тестировался.

...