Usando a roda de rolagem do mouse no GLUT
-
08-06-2019 - |
Pergunta
Quero usar a roda de rolagem do mouse no meu programa OpenGL GLUT para aumentar e diminuir o zoom de uma cena?Como faço isso?
Solução 2
Observe que o venerável GLUT de Nate Robin biblioteca não suporta a roda de rolagem.Mas, implementações posteriores de GLUT como GrátisGLUT fazer.
Usar a roda de rolagem no FreeGLUT é extremamente simples.Aqui está como:
Declare uma função de retorno de chamada que será chamada sempre que a roda de rolagem for rolada.Este é o protótipo:
void mouseWheel(int, int, int, int);
Registre o retorno de chamada com a função (Free)GLUT glutMouseWheelFunc().
glutMouseWheelFunc(mouseWheel);
Defina a função de retorno de chamada.O segundo parâmetro fornece a direção da rolagem.Valores de +1 são para frente, -1 são para trás.
void mouseWheel(int button, int dir, int x, int y)
{
if (dir > 0)
{
// Zoom in
}
else
{
// Zoom out
}
return;
}
É isso!
Outras dicas
O retorno de chamada glutMouseWheelFunc do Freeglut depende da versão e não é confiável no X.Use a função padrão do mouse e teste os botões 3 e 4.
As notas do OpenGlut sobre o estado glutMouseWheelFunc:
Devido à falta de informações sobre o mouse, é impossível implemente isso corretamente no X neste momento.Uso desta função limita a portabilidade do seu aplicativo.(Este recurso funciona em X, apenas não de forma confiável.) Você é encorajado a usar o padrão, relatórios confiáveis com botão do mouse, em vez de eventos de roda.
Usando relatórios de mouse GLUT padrão:
#include <GL/glut.h>
<snip...>
void mouse(int button, int state, int x, int y)
{
// Wheel reports as button 3(scroll up) and button 4(scroll down)
if ((button == 3) || (button == 4)) // It's a wheel event
{
// Each wheel event reports like a button click, GLUT_DOWN then GLUT_UP
if (state == GLUT_UP) return; // Disregard redundant GLUT_UP events
printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y);
}else{ // normal button event
printf("Button %s At %d %d\n", (state == GLUT_DOWN) ? "Down" : "Up", x, y);
}
}
<snip...>
glutMouseFunc(mouse);
Como afirmou o OP, é "muito simples".Ele estava simplesmente errado.
observe os casos 3 e 4 na instrução switch abaixo no retorno de chamada mouseClick
glutMouseFunc(mouseClick);
...
void mouseClick(int btn, int state, int x, int y) {
if (state == GLUT_DOWN) {
switch(btn) {
case GLUT_LEFT_BUTTON:
std::cout << "left click at: (" << x << ", " << y << ")\n";
break;
case GLUT_RIGHT_BUTTON:
std::cout << "right click at: (" << x << ", " << y << ")\n";
break;
case GLUT_MIDDLE_BUTTON:
std::cout << "middle click at: (" << x << ", " << y << ")\n";
break;
case 3: //mouse wheel scrolls
std::cout << "mouse wheel scroll up\n";
break;
case 4:
std::cout << "mouse wheel scroll down\n";
break;
default:
break;
}
}
glutPostRedisplay();
}