我想在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();
}
但是当我点击它时它不会选择。
答案 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游戏开发,这是一个非常好的开始。