gpt4 book ai didi

c++ - 如何在 2D opengl 中进行拾取?

转载 作者:行者123 更新时间:2023-11-30 04:12:36 27 4
gpt4 key购买 nike

我想在 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();
}

但是当我点击它时它没有选择。

最佳答案

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

您可以为颜色查找创建 map ,为对象和颜色建立索引,创建巧妙的颜色选择功能,使查找变得容易......等等。

这个方法可以在书中找到:Chris Seddon - OpenGL Game Development,这是一个很好的开始。

关于c++ - 如何在 2D opengl 中进行拾取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com