Как сделать комплектацию в 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));
}
};
(написано наизусть, не проверено =))