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?

Foi útil?

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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top