Notre deuxième programme fenetre2.py ouvre une fenêtre graphique comme dans le tp1, mais attend que l'utilisateur appuie sur la touche q pour quitter :
from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import sys def clavier(*args): if args[0] == 'q': sys.exit() def main(): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGB) glutInitWindowPosition(200,200) glutInitWindowSize(250,250) glutCreateWindow("Deuxieme Programme") glutKeyboardFunc(clavier) glutMainLoop() main()
On a vu dans le tp précédent que la fonction glutMainLoop() lance la boucle d'attente des événements. On doit associer des fonctions à ces différents types d'événements.
Par exemple, on veut que la touche q arrête le programme, c'est-à-dire qu'un événement provenant du clavier interrompe la boucle principale.
On précise donc à OpenGL que la fonction détaillant ce qu'il faut faire lorqu'un événement clavier est signalé s'appelle clavier :
glutKeyboardFunc(clavier)
Cette fonction clavier (peu importe son nom) est forcément de ce type :
def clavier(*args):
Vous pouvez remarquer, dans notre programme, qu'à aucun moment on ne s'est occupé de la variable args. Pourtant, dans la fonction clavier, on trouve uniquement
if args[0] == 'q': sys.exit()
C'est qu'openGL attend (sans qu'on ait besoin de lui dire) qu'une touche soit appuyée, relève la valeur de la touche, et lance la fonction clavier avec en argument tout ce qui faut. Vous n'avez rien à faire...
En fait, args est une liste de trois éléments :
Vous pouvez remplacer la précédente fonction par
def keyboard(*args): if args[0] == 'q': sys.exit() print args[0], args[1], args[2]
pour vous en rendre compte.
Pour les touches "spéciales", on utilise glutSpecialFunc() au lieu de glutKeyboardFunc().
C'est ainsi que l'on peut gérer les F1 à F12, les touches de direction et de défilement, comme le prouve le programme suivant :
from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import sys def special(*args): if args[0] == GLUT_KEY_F1:
et souris_x et souris_y sont les coordonnées de la souris par rapport à la fenêtre.
def main(): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGB) glutInitWindowPosition(200,200) glutInitWindowSize(250,250) glutCreateWindow("Touches Speciales") glutSpecialFunc(special) glutMainLoop() main()
Les autres touches spéciales sont : GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_RIGHT, GLUT_KEY_DOWN, GLUT_KEY_INSERT, GLUT_KEY_PAGE_DOWN, GLUT_KEY_HOME, GLUT_KEY_END.
On procédera de même pour gérer les événements liés à la souris :
On procédera encore de même pour gérer les événements liés à l'affichage, à l'aide de la fonction glutDisplayFunc() que l'on utilisera dans le prochain TP.
Signalons aussi que glutReshapeFunc() sert à préciser à OpenGL ce qu'il doit faire si la fenêtre est redimentionnée. C'est aussi dans cette fonction que l'on détaille la manière de projeter notre scène 3d à l'écran.
Signalons encore que glutIdleFunc() est une fonction très utile pour les animations : elle définit ce qui doit être fait quand il n'y a pas d'événement particulier.
Par exemple, si vous voulez qu'un petit bonhomme se déplace aléatoirement sur l'écran, indépendamment de votre propre déplacement...
Enfin, il y a glutCreateMenu(), dont la signification est évidente, et quelques autres fonctions que vous découvrirez forcément en pratiquant OpenGL.