Каков наилучший способ определения местоположения мыши / щелчков на объекте в OpenGL? - PullRequest
4 голосов
/ 12 октября 2010

Я создаю простую 2D-игру OpenGL, и мне нужно знать, когда игрок щелкает мышью по примитиву OpenGL.(Например, для GL_QUADS, который служит одной из плиток ...) Кажется, не существует простого способа сделать это, кроме грубой силы или предложения opengl.org об использовании уникального цвета для каждого из моих примитивов., который кажется немного взломанным.Я что-то пропустил?Спасибо ...

Ответы [ 3 ]

6 голосов
/ 12 октября 2010

Мой совет, не используйте режим выбора OpenGL или рендеринг OpenGL (метод грубой силы, о котором вы говорите), используйте алгоритм выбора луча на основе процессора, если 3D.Для 2D, как в вашем случае, это должно быть просто, это всего лишь тест, чтобы узнать, находится ли 2D точка в 2D-прямоугольнике.

2 голосов
/ 13 октября 2010

Я бы предложил использовать хакерский метод, если вы хотите быстрой реализации (я имею в виду время написания кода).Особенно, если вы не хотите реализовывать квадродерево с движущимися объектами.Если вы используете немедленный режим opengl, это должно быть просто:

// Rendering part
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
for(unsigned i=0; i<tileCout; ++i){
    unsigned tileId = i+1; // we inc the tile ID in order not to pick up the black
    glColor3ub(tileId &0xFF, (tileId >>8)&0xFF, (tileId >>16)&0xFF);
    renderTileWithoutColorNorTextures(i);
}

// Let's retrieve the tile ID
unsigned tileId = 0;
glReadPixels(mouseX, mouseY, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
             (unsigned char *)&tileId);
if(tileId!=0){  // if we didn't picked the black 
    tileId--;
    // we picked the tile number tileId
}

// We don't want to show that to the user, so we clean the screen
glClearColor(...); // the color you want
glClear(GL_COLOR_BUFFER_BIT);

// Now, render your real scene
// ...
// And we swap
whateverSwapBuffers(); // might be glutSwapBuffers, glx, ...
1 голос
/ 13 октября 2010

Вы можете использовать режим OpenGL glRenderMode(GL_SELECT). Вот некоторый код , который его использует, и за ним должно быть легко следовать (ищите метод _pick)

(а вот тот же код с использованием GL_SELECT в C)

(в прошлом были случаи, когда GL_SELECT сознательно замедлялся на картах «не рабочей станции», чтобы не поощрять пользователей САПР и моделированияот покупки потребительских 3D-карт, это должно быть плохой привычкой прошлого, из которого выросли ATI и NVidia;))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...