Ich verstehe vollkommen, dass GLUT begrenzt ist und das folgende Problem wahrscheinlich nicht mit OpenGL / GLUT gelöst werden kann, aber da ich nicht genau weiß, ob es kann oder nicht, frage ich besser einfach. Vielleicht mache ich etwas falsch oder vergesse etwas Wichtiges. Oder wahrscheinlich auch nicht und GLUT wird nicht besser.
Mein Problem ist, dass ich die Maus nicht im Fenster einfangen kann. Nun, eigentlich kann ich, der folgende Code macht genau das. Ich fange die Maus im Fenster ein und kann die Welt mit der Maus frei drehen. Das Problem? Wenn ich die Maus zu schnell bewege, komme ich aus dem Fenstergefängnis.
Gibt es einen Weg, dies mit OpenGL / GLUT zu umgehen, oder ist die einzige Option eine andere Bibliothek oder ein direkter Aufruf der Windows-API? Genug Worte, hier ist mein aktueller Code:
void processPassiveMouseMotion(int x, int y) {
static int centerX = glutGet(GLUT_WINDOW_WIDTH) / 2;
static int centerY = glutGet(GLUT_WINDOW_HEIGHT) / 2;
CameraAngle.x = -1.0f * (y - centerY);
CameraAngle.y = -1.0f * (x - centerX);
if(CameraAngle.x != 0.0f || CameraAngle.y != 0.0f) {
SceneCamera.Rotate(CameraAngle);
glutPostRedisplay();
glutWarpPointer(centerX, centerY);
}
}
glutPassiveMotionFunc(processPassiveMouseMotion);
Bei einer schnellen Suche durch die GLUT-Spezifikation scheint GLUT keine Mauserfassungsfunktionen zu haben. Das Beste, was Sie tun können (wie Sie es anscheinend tun), ist, den Cursor in die Mitte zu bewegen und zu hoffen, dass der Benutzer nicht schnell genug ist (oder kein Tablet verwendet) =)
Sie können auch zu SDL oder SFML wechseln , da GLUT nur zum Testen und nicht für "echte" Software entwickelt wurde.
quelle
Probieren Sie eine neuere Version von Freeglut aus. Mein v2.6 fängt den Cursor mit glutWarpPointer ab, ohne dass die Möglichkeit besteht, mit der Maus zu entkommen.
quelle
In meinem Fall ändern
zu so etwas wie
perfekt gelöst das Problem.
Das Problem wird dadurch verursacht, dass glutWarpPointer ein anderes passives Bewegungsereignis auf (centerX, centerY) auslöst, was zu einer Schleife führt und / oder die Ereigniswarteschlange überflutet. Um dies zu vermeiden, überprüfen Sie einfach, ob sich die Maus auf (centerX, centerY) befindet. Wenn ja, verziehen Sie sich nicht.
quelle