1

我想在 opengl 中选择 2d 对象,但不知道如何。我希望它像 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();
}

但是当我点击它时它不会选择。

4

2 回答 2

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

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

于 2013-11-04T18:09:26.267 回答
1

一种简单的方法是用不同的颜色渲染每个对象。编写一个函数,返回一个 3 维数组(向量),如果尚未选取,则选择它作为对象的选择颜色,添加到选择颜色列表中。所以现在每个对象都有不同的颜色,你可以检查光标所在位置的像素颜色。为此使用帧缓冲区或 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 Game Development,这是一个非常好的开始。

于 2013-11-05T22:30:11.257 回答