Domanda

Voglio utilizzare la rotella del mouse nel mio programma OpenGL GLUT per ingrandire e rimpicciolire una scena?Come lo faccio?

È stato utile?

Soluzione 2

Nota che la venerabile la libreria GLUT di Nate Robin non supporta la rotellina di scorrimento. Tuttavia, le successive implementazioni di GLUT come FreeGLUT lo fanno.

L'uso della rotella di scorrimento in FreeGLUT è semplicissimo. Ecco come:

Dichiara una funzione di callback che deve essere chiamata ogni volta che si fa scorrere la rotella di scorrimento. Questo è il prototipo:

void mouseWheel(int, int, int, int);

Registra il callback con la funzione (Free) GLUT glutMouseWheelFunc () .

glutMouseWheelFunc(mouseWheel);

Definisce la funzione di richiamata. Il secondo parametro fornisce la direzione dello scorrimento. I valori di +1 sono avanti, -1 è indietro.

void mouseWheel(int button, int dir, int x, int y)
{
    if (dir > 0)
    {
        // Zoom in
    }
    else
    {
        // Zoom out
    }

    return;
}

Questo è tutto!

Altri suggerimenti

Il callback glutMouseWheelFunc di Freeglut dipende dalla versione e non è affidabile in X. Utilizzare la funzione mouse standard e testare i pulsanti 3 e 4.

Le note di OpenGlut sullo stato glutMouseWheelFunc:

  

A causa della mancanza di informazioni sul mouse, è impossibile   implementarlo correttamente su X in questo momento. Uso di questa funzione   limita la portabilità della tua applicazione. (Questa funzione funziona su   X, ma non in modo affidabile.) Sei incoraggiato a utilizzare lo standard,   reportistica affidabile tramite pulsante del mouse, anziché eventi su ruote.

Uso del report GLUT standard sul mouse:

#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);

Come affermato dal PO, è "morto semplice". Aveva solo torto.

osserva i casi 3 e 4 nella seguente istruzione switch nel callback 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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top