Я хочу выбрать 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();
}
Но он не выбирается, когда я нажимаю на него.
Один простой способ — визуализировать каждый объект с другим цветом.
Напишите функцию, которая возвращает трехмерный массив (вектор), и, если он еще не выбран, выберите его в качестве цвета выбора объекта и добавьте в список выбранных цветов.
Теперь у каждого объекта свой цвет, и вы можете проверить цвет пикселя в месте нахождения курсора. Для этого используйте 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));
}
};
(написано наизусть, не проверено =))