Wie schreiben GLUT Tastatur-Funktionen?
Ich schrieb den code unten, sondern zur Laufzeit, wenn ich drücken Sie die Tasten, das Programm funktioniert nicht.
Ich möchte ein Programm schreiben, das zeichnet ein Dreieck drückt der Benutzer right_key
und alt_key
. Aber das funktioniert überhaupt nicht. Es zeigt immer einen schwarzen Bildschirm.
#include <GL/glut.h>
void init (void)
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,200.0);
}
float red=1,green=1,blue=1;
void processSpecialKeys(int key, int x, int y) {
if(key=='0')
exit(0);
int mod;
if(key== GLUT_KEY_RIGHT) {
mod = glutGetModifiers();
if (mod==GLUT_ACTIVE_ALT) {
red = 1.0; green = 0.0; blue = 0.0;
glColor3f(red,green,blue);
glBegin(GL_TRIANGLES);
glVertex2f(0,0);
glVertex2f(0,100);
glVertex2f(50,100);
glEnd();
}
}
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glFlush();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(50,20);
glutInitWindowSize(400, 300);
glutCreateWindow("A simple example");
init();
glutDisplayFunc(display);
glutSpecialFunc(processSpecialKeys);
glutMainLoop();
}
OpenGL ist nicht keayboard Handhabung. Was Sie wahrscheinlich meinen, ist GLUT, das hat nichts zu tun mit OpenGL.
InformationsquelleAutor Ava Bahari | 2011-12-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK es funktioniert jetzt. Ich habe es modifiziert Ihren code zu aktivieren, ALT-oder UMSCHALT-oder STRG-Taste. Der code gibt die scancodes beinhalten der Schlüssel.
Drucken Sie die ALT -, STRG-ODER SHIFT scancode, drücken Sie einfach die ALT-Taste oder SHIFT-oder STRG-Taste in Kombination mit anderen Tasten.
Otherwse GLUT nicht registrieren.
glutSpecialFunc( process_Normal_Keys );
wirklich?InformationsquelleAutor Software_Designer
Dieser nicht so funktioniert, weil die Anrufe auf Ihrer Tastatur callback wird asynchron ausgeführt.
Das bedeutet, Sie werden nicht sehen, ein Dreieck gezeichnet, es sei denn, der Tastendruck geschieht, verarbeitet werden direkt zwischen
glClear()
undglFlush()
, das passiert eher selten und nur für einen einzigen frame.Was Sie zu tun haben ist Recht einfach:
Bei der Verarbeitung des Tastenanschlags, sparen, status, z.B. eine boolean-variable auf true/false, je nach der key-Eingabe.
Dann prüfen, dass in
display()
und zeichnen Sie das Dreieck, wenn gewünscht.Pseudo-code Beispiel:
Auf weitere Hinweise, wenn Sie möchten, um in OpenGL zu Programmieren, ohne sich sorgen über den Umgang mit anderen Sachen umgehen, würde ich empfehlen die Verwendung einer vorgefertigten Bibliothek der Handhabung von windows, Eingänge, etc. für Sie, z.B. SFML oder SDL. Sie funktionieren ähnlich wie glut, aber Sie sind im Allgemeinen mehr leistungsfähige und wird immer noch erlauben Ihnen die Ausführung von OpenGL-Aufrufe direkt, beim Angebot Vereinfachtes event-handling.
kann ich call glutSpecialFunc(processSpecialKeys) func. in der display-Funktion?
Die Tastatur-callback nicht immer während der display-callback ausgeführt wird. Wenn es so wäre, bräuchte man zur Synchronisation des Zugriffs auf gemeinsam genutzten Zustand.
glutSpecialFunc()
ist das nicht eigentlich Aufruf der Tastatur-Verarbeitung. Es ist nur definiert die callback-Funktion aufgerufen werden, die im wesentlichen sagt, glut", wenn es um die Tastatur Eingabe zu jeder Zeit, rufen Sie x". Ich werde fügen Sie ein kurzes Vereinfachtes Beispiel, was ich versucht habe zu erklären.vielen Dank für dieses Beispiel...
InformationsquelleAutor Mario
Können Sie nicht erzeugen Grafik-Befehle in die Tastatur-callback. Legen Sie einige Stück des globalen Zustand, wenn die Taste, die Sie interessiert sind gedrückt und verwenden Sie die Informationen in der Anzeige code.
Den Weg, um das Debuggen von Problemen wie diesen ist die Verwendung von printf-Anweisungen in den code, den Sie denken, funktioniert nicht. Hier das hinzufügen von ein printf in der Tastatur-handler würde bald sagen Sie, dass der code ausgeführt wird, aber das Dreieck nicht gezeichnet. Das könnte Sie führen, zu denken, wenn ein graphics-Befehl möglich ist und Wann nicht.
InformationsquelleAutor