如何在2D opengl中选择?

时间:2013-11-04 17:35:00

标签: c++ opengl 2d picking

我想在opengl中选择2d对象,但不知道如何。我希望它像在带有gluPickMatrix的3d中一样。这就是我的尝试:

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 个答案:

答案 0 :(得分:1)

你不能只检查鼠标光标是否在边界矩形内?

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));
    }
};

(由心写,未经测试=))

答案 1 :(得分:1)

一种简单的方法是使用不同的颜色渲染每个对象。 编写一个返回三维数组(矢量)的函数,如果尚未选中,则选择它作为对象的选择颜色,添加到选择颜色列表中。 所以现在每个对象都有不同的颜色,你可以检查光标位置的像素颜色。为此使用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*/);

这是几何独立的。颜色在R,G和B中从0-255缩放。因此,255 * 255 * 255 = 16581375种不同的颜色,每个对象一个。

您可以为颜色查找创建地图,为对象和颜色编制索引,创建巧妙的颜色选择功能,使查找更容易......等等。

这个方法可以在书中找到:Chris Seddon - OpenGL游戏开发,这是一个非常好的开始。