2010-12-23 9 views
1

Ich rotiere meine Kamera abhängig von der Mausposition. Aber ich möchte das nur aktiv, wenn entweder die linke oder die rechte Maustaste gedrückt ist. Das Problem mit diesem Code ist, dass ich loslassen und erneut drücken muss, damit das Programm bemerkt, dass ich die Maus bewegt habe.GLUT Mausposition wird nicht aktualisiert

Bei der Verwendung der Tastaturtasten und Bewegen der Maus hat es funktioniert.

Ich versuche, PostRedisplay zu gluten, aber ich bin mir nicht sicher, ob es das ist, was ich brauche oder wie ich es benutze.

void processMouse(int button, int state, int x, int y) { 


if (state == GLUT_DOWN) { 

    if (button == GLUT_LEFT_BUTTON) {mouseM=true;} if (button == GLUT_RIGHT_BUTTON) {mouseN=true;} 
    } if (state == GLUT_UP){ if (button == GLUT_LEFT_BUTTON){mouseM=false;} if (button == GLUT_RIGHT_BUTTON) {mouseN=false;} } 

} 


void mouseMove(int x, int y){ 
    if (x < 0) angleX = 0.0; else if (x > w) angleX = 180.0; else //angleX = 5.0 * ((float) x)/w; angleX = (x-320)/50; angleZ = angleX; angleY= (y-240)/50; 
} 

Antwort

0

Ich glaube, Sie Ihre glutMouseFunc mit einem glutMotionFunc kombinieren müssen. Setzen Sie Ihren Mausknopfzustand in den ehemaligen und aktualisieren Sie Ihre Rotation in glutMotionFunc abhängig vom Knopfzustand.

+0

Ich bin nicht ganz sicher, was Sie jede Chance meinen Sie mir ein paar schnellen Pseudo-Code zeigen können, zeigen, es? – snackbar

+0

Plough bedeutet, dass es zwei separate Callback-Funktionen für die Maus gibt: eine für die Mausposition und eine für die Aktionen (d. H. Schaltfläche geklickt), und Sie müssen diese beiden Aspekte getrennt behandeln – dm76

1

Sie können glutMouseFunc, glutMotionFunc und glutPassiveMotionFunc kombinieren, um dies zu erreichen.

(1) glutMotionFunc teilt Ihnen (x, y) Ihres Mauszeigers jeden Moment nur dann mit, wenn die Taste (n) der Maus gedrückt ist/sind. Auf der anderen Seite sagt Ihnen glutPassiveMotionFunc (x, y), wenn keine Taste (n) gedrückt wird. (Weitere Informationen finden Sie in der Spezifikation für das Überladen).

(2) zu kombinieren, diese Funktionen

Zuerst bereiten onLeftButton (int x, int y) und onRightButton (int x, int y) zu handhaben linken Taste-gedrückt und mit der rechten Taste-gedrückt Ereignisse jeweils dies, wie:

void onLeftButton(int x, int y){ 
    //change variables for your glRotatef function for example 
    //(x, y) is the current coordinate and 
    //(preMouseX, preMouseY) is the previous coordinate of your cursor. 
    //and axisX is the degree for rotation along x axis. Similar as axisY. 
    axisX += (y - preMouseY); 
    axisY += (x - preMouseX); 
    ... 
} 

void onRightButton(int x, int y){ 
    //do something you want... 
} 

Zweitens bereitet eine Funktion zum glutMouseFunc, sagen OnMouse, zum Beispiel:

glutMouseFunc(onMouse); 

Und innerhalb der OnMouse Funktion, es so sein werde:

void onMouse(int button, int state, int x, int y) 
{ 
    if(state == GLUT_DOWN){ 
     if(button == GLUT_RIGHT_BUTTON) 
     glutMotionFunc(onRightButton); 
     else if(button == GLUT_LEFT_BUTTON) 
     glutMotionFunc(onLeftButton); 
    } 
} 

Nachdem Sie diese Dinge getan haben, können Sie (x, y) von Ihrem Cursor in jedem Moment nur erhalten, wenn die linke/rechte Taste gedrückt und gehalten wird.

Weitere Informationen darüber, wie diese Funktionen zu kombinieren, können Sie den 3,030 Teil an dieser Stelle überprüfen: https://www.opengl.org/archives/resources/faq/technical/glut.htm