Category: Γ' Εξάμηνο: OpenGL Published: Friday, 12 February 2016 Written by Γεώργιος Παπαλουκάς

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