INITIALISATION
ET OUVERTURE
FENÊTREAFFICHAGE
TACHE DE FOND
MODIFICATION
FENÊTRE
CLAVIER
SOURIS
DESSIN
D'OBJETS
MENUS
FENÊTRES
MULTIPLES
POLICES DE
CARACTÈRES
RETOUR
Dernière modification
11/07/01 18:14:24 |
|
Programmation presque
identique à celle réalisée au moyen de l'Auxiliary library.
Initialisation et ouverture dune fenêtre d'affichage
Initialise
la bibliothèque GLUT. Traite les options de ligne de commande (celles reçues en entête
de fonction main).
Définit le type de fenêtre:
- GLUT_RGBA ou
GLUT_INDEX (vraies couleurs
ou couleurs indexées);
- GLUT_SINGLE ou GLUT_DOUBLE (simple ou double buffer);
- GLUT_DEPTH, GLUT_STENCIL ou GLUT_ACCUM (utilisation de
tampons profondeur, stencil ou accumulation).
Définit la position de la fenêtre
sur l'écran.
Définit la taille de la fenêtre à
l'écran.
Ouvre
une fenêtre de titre title selon les paramètres définis au moyen des fonctions
précédentes. La fenêtre n'est affichée que lors de l'exécution de glutMainLoop.
Affichage principal
Définit la fonction à exécuter quand la fenêtre d'affichage est
créée, déplacée, agrandie, réduite ou réactivée ou si un autre événement
intervient entraînant un rafraîchissement.
La fonction display passée en
paramètre ne doit assurer l'affichage que d'une seule image.
Fonction assurant la boucle principale
d'affichage. La fonction glutMainLoop est bloquante. Elle gère les événements liés au
fonctionnement du programme et exécute les fonctions associées par le programmeur à ces
événements -> simili programmation événementielle.
Fonction plaçant en file d'attente
d'événement un ordre de rafraîchissement de la fenêtre d'affichage (fréquemment
utilisée dans les fonctions d'animation Idle).
Fonction assurant le swap entre les
deux buffers d'affichage dans le cas du double buffering.
Squelette d'un programme
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
glutMainLoop();
return(0);
}
Exemple
Gestion d'un processus en tâche de fond
Définit
la fonction à exécuter s'il n'y a pas d'événement en attente et donc que l'application
est disponible pour la réalisation d'une tâche
-> exécution d'actions en tâche de fond.
Cette fonction est fréquemment
utilisée pour programmer des animations. Elle est généralement dédiée à la
modification de variables employées dans la fonction display et ne contient donc
habituellement pas d'appel de fonction OpenGL.
Squelette d'une application
avec gestion d'une tâche de fond
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
void idle(void)
{ /* Tâche de fond */
}
int main(int argc,char** argv) {
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
glutIdleFunc(idle);
glutMainLoop();
return(0);
}
Exemple
Gestion des événements fenêtre, clavier et souris
Définit
la fonction exécutée automatiquement avant le rafraîchissement dune fenêtre dont
la taille est modifiée.
Cette fonction
"Reshape" est habituellement employée pour signifier la zone de la fenêtre
dans laquelle l'image est affichée, pour définir le mode de représentation (projection
parallèle ou en perspective) et ses paramètres, et pour amorcer le dessin de la scène.
Elle doit obligatoirement avoir en entête deux paramètres de type entier qui permettront
de récupérer les tailles en x et en y de la fenêtre après changement de dimensions.
Squelette d'une application
avec gestion des modifications du fenêtrage
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
void myReshape(int w, int h)
{ /* opérations de rafraîchissement */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
glutReshapeFunc(myReshape);
glutMainLoop();
return(0);
}
Exemple
Définit la fonction exécutée
automatiquement lorsqu'une touche du clavier ASCII est frappée. Au moment de son
exécution, cette fonction recevra les paramètres key, x et y contenant le code ASCII de
la touche de clavier, les positions instantanées en x et en y de la souris relativement
à la fenêtre.
Squelette d'une application
avec gestion des touches ASCII du clavier
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
void key(unsigned int k,int x,int y)
{ /* opérations exécutées
lors de la frappe d'une touche
de clavier ASCII */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
glutKeyboardFunc(key)
glutMainLoop();
return(0);
}
Exemple
Définit la fonction exécutée
automatiquement lorsqu'une touche de fonction ou une touche de curseur du clavier est
frappée. Au moment de son exécution, cette fonction recevra les paramètres key, x et y
contenant le code de la touche de clavier (GLUT_KEY_F1 à GLUT_KEY_F12, GLUT_KEY_LEFT,
GLUT_KEY_RIGHT, GLUT_KEY_UP, GLUT_KEY_DOWN,
GLUT_KEY_PAGE_DOWN, GLUT_KEY_PAGE_UP, GLUT_KEY_HOME,
GLUT_KEY_END, GLUT_KEY_INSERT), et les positions instantanées en x et en y de la souris
relativement à la fenêtre.
Squelette d'une application
avec gestion des touches de fonction et de curseur du clavier
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
void special(unsigned int k,int x,int y)
{ /* opérations exécutées
lors de la frappe d'une touche
de fonction ou de curseur */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
glutSpecialFunc(special)
glutMainLoop();
return(0);
}
Exemple
- void glutMouseFunc(void
(*fonct)(int bouton,int etat,int x,int y));
Définit
la liaison entre les clics de boutons de la souris et des fonctions -> fonctions à
exécuter quand les boutons de la souris sont utilisés.
bouton: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON ou GLUT_RIGHT_BUTTON
mode: GLUT_UP ou GLUT_DOWN
x,y: position de la souris dans la fenêtre
au moment de l'événement
Squelette d'une application avec
gestion des clics de souris
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
void mouse(int bouton,int etat,
int x,int y)
{ /* opérations exécutées
lors de l'arrivee d'un clic
de souris */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
glutMouseFunc(mouse);
glutMainLoop();
return(0);
}
Exemple
Définit la liaison entre les
déplacements de la souris et des fonctions -> fonctions à exécuter quand la souris
se déplace devant la fenêtre avec un bouton appuyé ou non.
x,y: position de la souris dans la fenêtre
Squelette d'une application avec
gestion des déplacements de la souris
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
void mouseMotion(int x,int y)
{ /* opérations exécutées
lors du deplacement de la souris
bouton appuye */
}
void mousePassMotion(int x,int y)
{ /* opérations exécutées
lors du deplacement de la souris
bouton relache */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
glutMotionFunc(mouseMotion);
glutPassiveMotionFunc(mousePassMotion);
glutMainLoop();
return(0);
}
Exemple
Dessin
dobjets 3D en fil de fer ou en volumique
- void glutWireObjet() ;
void
glutSolidObjet() ;
Objet |
Sphère
Rayon
Nombre sections
Nombre coupes |
glutWireSphere(double r,
int
ns,
int
nc);
glutSolidSphere(double r),
int ns,
int nc); |
Cube
Coté |
glutWireCube(double c);
glutSolidCube(double c); |
Tore
Rayon intérieur
Rayon extérieur
Nombre côtés
Nombre anneaux |
glutWireTorus(double rint,
double
rext,
int ns,
int nr);
glutSolidTorus(double
rint,
double rext,
int
ns,
int
nr)); |
Cône
Rayon
Hauteur
Nombre sections
Nombre coupes |
glutWireCone(double r,
double h,
int ns,
int nc);
glutSolidCone(double
r,
double h,
int ns,
int nc); |
Tétraèdre
4 faces |
glutWireTetrahedron(void);
glutSolidTetrahedron(void); |
Octaèdre
8 faces |
glutWireOctahedron(void);
glutSolidOctahedron(void); |
Icosaèdre
12 faces |
glutWireIcosahedron(void);
glutSolidIcosahedron(void); |
Dodécaèdre
20 faces |
glutWireDodecahedron(void);
glutSolidDodecahedron(void); |
Teapot
Rayon |
glutWireTeapot(double s) ;
glutSolidTeapot(double s) ; |





Programme de visualisation de ces objets
Les objets sont facettetisés.
Fonctionnalités supplémentaires
par rapport à Aux
Gestion des menus
GLUT permet la gestion de menus pop-up
en cascade au sein des fenêtres d'affichage.

Crée un nouveau menu pop-up et rend
un identificateur entier pour ce menu. La fonction passée en paramètre est la fonction
de traitement des items du menu. Le "menu courant" devient le menu créé.
Attache le menu courant à la fenêtre
courante et l'associe à un clic du bouton de souris spécifié (GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON ou GLUT_RIGHT_BUTTON).
Ajoute un item supplémentaire à la
fin du menu courant. Le paramètre name définit la chaîne de caractères d'affichage de
l'item. Le paramètre value définit la valeur passée à la fonction de traitement
exécutée lors de l'activation de l'item.
Ajoute un sous-menu à la fin du menu
courant. Le paramètre name définit la chaîne de caractères d'affichage de l'item. Le
paramètre menu est l'identificateur du sous-menu ajouté.
Squelette d'une application avec un
menu et un sous-menu
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ /* dessin de la scène */
}
void myinit(void)
{ /* initialisation du programme */
}
void select(int selection)
{ /* opérations réalisées en fonction
de l'item sélectionné */
}
void select2(int selection)
{ /* opérations réalisées en fonction
de l'item sélectionné */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
myinit();
int sousMenu = glutCreateMenu(select2);
glutAddMenuEntry("Sous-Option 1",0);
glutAddMenuEntry("Sous-Option 2",1);
int mainMenu = glutCreateMenu(select);
glutAddMenuEntry("Option 1",0);
glutAddMenuEntry("Option 2",1);
glutAddMenuEntry("Sous-menu",sousMenu);
glutAddMenuEntry("Quitter",2);
glutAttachMenu(GLUT_LEFT_BUTTON);
glutMainLoop();
return(0);
}
Exemple
Gestion des
environnements multi-fenêtrés
GLUT permet la gestion de plusieurs
fenêtres d'affichage 3D au sein d'un même programme.

La fonction glutCreateWindow peut
être appelée plusieurs fois pour créer plusieurs fenêtres munies individuellement d'un
environnement d'affichage paramètrable au moyen des fonctions classiques glutIdleFunc,
glutReshapeFunc, glutDisplayFunc, glutMouseFunc, glutMotionFunc, glutKeyboardFunc, ...
Autres fonctions de gestion
des fenêtres
Détruit la fenêtre spécifiée.
Déplace la fenêtre courante aux
coordonnées (x,y).
Dimensionne la fenêtre courante avec
pour nouvelle taille (larg,haut).
Dimensionne la fenêtre courante en
plein écran.
Change la place de la fenêtre
courante dans l'ordre d'empilement des fenêtres.
Activation, désactivation et
icônification de la fenêtre courante.
Squelette d'une application avec
deux fenêtres d'affichage 3D
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void displayMain(void)
{ /* dessin de la scène
de la fenêtre principale */
}
void displayFille(void)
{ /* dessin de la scène
de la fenêtre fille */
}
void myinit(void)
{ /* initialisation du programme */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
int f1 = glutCreateWindow("Main");
glutDisplayFunc(displayMain);
int f2 = glutCreateWindow("Fille");
glutDisplayFunc(displayFille);
myinit();
glutMainLoop();
return(0);
}
Exemple
Polices de
caractères bitmap et vectorielle
GLUT gère les polices de caractères
bitmap et vectorielle. L'avantage des polices bitmap est une grande rapidité d'affichage,
tandis que les polices vectorielles supportent les fonctions GL classiques telles que
glTranslatef, glScalef, glRotatef, glLineWidth, ...
Affiche un caractère en bitmap. c est
le caractère à afficher. font est la police de caractères bitmap utilisée:
GLUT_BITMAP_9_BY_15,
GLUT_BITMAP_8_BY_13,
GLUT_BITMAP_TIMES_ROMAN_10,
GLUT_BITMAP_TIMES_ROMAN_24,
GLUT_BITMAP_HELVETICA_10,
GLUT_BITMAP_HELVETICA_12,
GLUT_BITMAP_HELVETICA_18.
Retourne la largeur du caractère c
dans la police de caractères bitmap font.
Affiche un caractère en vectoriel
(par segments de droites). c est le caractère à afficher. font est la police de
caractères vectorielle utilisée:
GLUT_STROKE_ROMAN,
GLUT_STROKE_MONO_ROMAN.
Retourne la largeur du caractère c
dans la police de caractères vectorielle font.
Squelette d'une application avec
deux fenêtres d'affichage 3D
- #include
<GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <GL/glut.h>
void display(void)
{ glLineWidth(3.0);
glStrokeCharacter(GLUT_STROKE_ROMAN,'a');
glTranslatef(1.0F,0.0F,0.0F);
glBitmapCharacter(GLUT_BITMAP_8_BY_13,
'b');
}
void myinit(void)
{ /* initialisation du programme */
}
int main(int argc,char** argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|
GLUT_RGB);
glutInitWindowPosition(10,10)
glutInitWindowSize(500,500);
glutCreateWindow("Polices");
glutDisplayFunc(display);
myinit();
glutMainLoop();
return(0);
}
Exemple
Autres
exemples
Le fichier Glut.h |