OpenGL: Μάθημα 6ο - Αλληλεπίδραση χρήστη (πληκτρολόγιο)
Πηγή: http://www.lighthouse3d.com/tutorials/glut-tutorial/keyboard/
H GLUT μας επιτρέπει να χτίσουμε εφαρμογές που ανιχνεύουν είσοδο από το πληκτρολόγιο. Εφόσον η είσοδος από το πληκτρολόγιο είναι συμβάν (event) προενημερώνουμε την GLUT για το ποια συνάρτηση θα χειριστεί το συμβάν (callback registration). Υπάρχουν δύο συναρτήσεις για την πραγματοποίηση του callback registration για συμβάντα πληκτρολογίου (πάτημα πλήκτρου). Η πρώτη, glutKeyboardFunc, χρησιμοποιείται για να πληροφορήσει το παραθυρικό σύστημα για το ποια συνάρτηση θα χειριστεί ένα "κλασσικό" πάτημα πλήκτρου. Λέγοντας "κλασσικό" πλήκτρο εννοούμε γράμματα, αριθμούς και οτιδήποτε έχει κώδικα ASCII (π.χ. a, B, 2).
Παράδειγμα υλοποίησης: Έξοδος από την εφαρμογή με το πάτημα του πλήκτρου ESC.
void processNormalKeys(unsigned char key, int x, int y) { if (key == 27) exit(0); }
Το όρισμα Key παρέχει τον ASCII κώδικα του πλήκτρου που πατήθηκε.
Τα ορίσματα x, y ορίζουν τη θέση του δείκτη του ποντικιού τη στιγμή που πατήθηκε το πλήκτρο.
Η δεύτερη συνάρτηση για την πραγματοποίηση του callback registration για συμβάντα πληκτρολογίου (πάτημα "ειδικού" πλήκτρου, π.χ. F1, ?) είναι η glutSpecialFunc.
Παράδειγμα υλοποίησης: Αλλαγή χρώματος τριγώνου με το πάτημα ειδικών πλήκτρων. F1 - κόκκινο, F2 - πράσινο, F3 - μπλε
void processSpecialKeys(int key, int x, int y) { switch(key) { case GLUT_KEY_F1 : red = 1.0; green = 0.0; blue = 0.0; break; case GLUT_KEY_F2 : red = 0.0; green = 1.0; blue = 0.0; break; case GLUT_KEY_F3 : red = 0.0; green = 0.0; blue = 1.0; break; } }
Τα GLUT_KEY_* είναι προκαθορισμένες σταθερές στην κεφαλίδα glut.h.
Ακολουθεί ο συνολικός κώδικας:
#include <stdlib.h> #ifdef __APPLE__ #include <GLUT/glut.h> #else #include <GL/glut.h> #endif // all variables initialized to 1.0, meaning // the triangle will initially be white float red=1.0f, blue=1.0f, green=1.0f; // angle for rotating triangle //float angle = 0.0f; void changeSize(int w, int h) { // Prevent a divide by zero, when window is too short // (you cant make a window of zero width). if (h == 0) h = 1; float ratio = w * 1.0 / h; // Use the Projection Matrix glMatrixMode(GL_PROJECTION); // Reset Matrix glLoadIdentity(); // Set the viewport to be the entire window glViewport(0, 0, w, h); // Set the correct perspective. gluPerspective(45.0f, ratio, 0.1f, 100.0f); // Get Back to the Modelview glMatrixMode(GL_MODELVIEW); } void renderScene(void) { // Clear Color and Depth Buffers glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset transformations glLoadIdentity(); // Set the camera gluLookAt( 0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); //glRotatef(angle, 0.0f, 1.0f, 0.0f); glColor3f(red,green,blue); glBegin(GL_TRIANGLES); glVertex3f(-2.0f,-2.0f, 0.0f); glVertex3f( 2.0f, 0.0f, 0.0); glVertex3f( 0.0f, 2.0f, 0.0); glEnd(); //angle+=0.1f; glutSwapBuffers(); } void processNormalKeys(unsigned char key, int x, int y) { if (key == 27) exit(0); } void processSpecialKeys(int key, int x, int y) { switch(key) { case GLUT_KEY_F1 : red = 1.0; green = 0.0; blue = 0.0; break; case GLUT_KEY_F2 : red = 0.0; green = 1.0; blue = 0.0; break; case GLUT_KEY_F3 : red = 0.0; green = 0.0; blue = 1.0; break; } } int main(int argc, char **argv) { // init GLUT and create window glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Keyboard events' handling - GLUT Tutorial"); // register callbacks glutDisplayFunc(renderScene); glutReshapeFunc(changeSize); //glutIdleFunc(renderScene); // here are the new entries glutKeyboardFunc(processNormalKeys); glutSpecialFunc(processSpecialKeys); // enter GLUT event processing cycle glutMainLoop(); return 1; }
Ασκήσεις εμπέδωσης
Πατήστε εδώ για "Ασκήσεις 6ου μαθήματος: Αλληλεπίδραση χρήστη (πληκτρολόγιο)"
Hits: 500