Как сделать комплектацию в 2D opengl?

Я хочу выбрать 2d объект в opengl, но не знаю как. Я хочу это как в 3D с gluPickMatrix. Вот что я попробовал:

void initDraw2D(){
    GLuint buff[BUFSIZE];                
    GLint hits, view[4];
    glSelectBuffer(BUFSIZE, buff);
    glGetIntegerv(GL_VIEWPORT, view);
    glRenderMode(GL_SELECT);
    glInitNames();
    glPushName(0);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
        glLoadIdentity();
        gluPickMatrix(mouseX, view[3] - mouseY, 1.0, 1.0, view);
        glMatrixMode(GL_MODELVIEW);
        Draw();
        glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    hits = glRenderMode(GL_RENDER);
    if (onSelect){
    processHits(hits, buff);
    onSelect = false;
    }
    Draw();
    glutPostRedisplay();
}

Но он не выбирается, когда я нажимаю на него.

2 ответа

Решение

Один простой способ - визуализировать каждый объект с другим цветом. Напишите функцию, которая возвращает трехмерный массив (вектор), и, если он еще не выбран, выберите его в качестве цвета выделения объекта и добавьте в список выбранных цветов. Так что теперь у каждого объекта есть свой цвет, и вы можете проверить цвет пикселя в месте расположения курсора. Для этого используйте framebuffers или pbo-s. Затем выполните поиск в списке выбора и верните указатель на объект (или сделайте с ним все, что захотите).

Конечно, это не должно быть отображено на экране.

это выглядит так:(псевдокод)

object* object1 = new object();
object1->createSelectColor();
object1->addColorToList();
...


objectRenderer->renderColoredObjects(/*to the fbo or texture for example*/);
objectRenderer->pickColorAtCursorPos();
objectRenderer->lookUpColorInList(/*objectRenderer->selectedcolor*/);
objectRenderer->setTarget(/*objectRenderer->selectedobject*/);

Это не зависит от геометрии. Цвета варьируются от 0 до 255 в R, G и B. Таким образом, это 255*255*255=16581375 разных цветов, по одному для каждого объекта.

Вы можете создавать карты для поиска цветов, индексировать объекты и цвета, создавать умную функцию выбора цвета, которая облегчает поиск... и т. Д.

Этот метод можно найти в книге: Крис Седдон - Разработка игр OpenGL, которую довольно приятно начать.

Разве вы не можете просто проверить, находится ли курсор мыши внутри ограничительного прямоугольника?

class Rectangle
{
    int x, y, w, h;

    bool IsPicked(Point mousePos)
    {
       return ((mousePos.x >= x) && (mousePos.x <= x + w)) 
              && 
              ((mousePos.y >= y) && (mousePos.y <= y + h));
    }
};

(написано наизусть, не проверено =))

Другие вопросы по тегам