Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TUTORIAL OPENGL ET GLUT EN C


Information sur la source

Catégorie :OpenGL Classé sous : opengl, tutorial, 3d, glut Niveau : Débutant Date de création : 18/06/2006 Date de mise à jour : 28/04/2008 12:13:56 Vu / téléchargé: 13 286 / 3 390

Note :
7 / 10 - par 6 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

Description

c'est un petit code commenté au maximum faisant tourner un carré blanc lors du clic gauche de la souris.
J'espère qu'il permettra a des gens de débuter dans OpenGL.
 

Source

  • /*
  • Name: tutorialAnimation
  • Author: Algex
  • Date: 18/06/06 13:24
  • Description: un petit tuto pour l'apprentissage d'OpenGL avec GLUT
  • */
  • /////////////////////////// LES INCLUDES ////////////////////////////////////////////////////////
  • //
  • //
  • #include <stdio.h> //
  • #include <stdlib.h> //
  • //
  • #include <windows.h>/*Microsoft Windows requiert l'insertion de windows.h juste avant gl.h et glu.h //
  • car certaines macros utilisées en internes dans la version Microsoft Windows de gl.h et glu.h sont //
  • définies dans windows.h*/ //
  • //
  • #include <GL/glut.h>//GL/glut.h contient déjà gl.h et glu.h mais bon c'est juste pour vous montrer //
  • //
  • ///////////////////////////////////////////////////////////////////////////////////////////////////////
  • //on crée une variable globale qui va nous servir pour la rotation
  • static GLfloat spin = 0.0;
  • ///////////////////////////// LES FONCIONS /////////////////////////////////////////////////////////
  • //--Fonction d'initialisation d'OpenGL--//
  • void init(void)
  • {
  • /*routine permettant de définir la couleur de vidage qui prend comme paramètre les composants
  • rouge, vert, bleu de la couleur plus la valeur alpha. En l'occurence, nous mettons un fond noir non transparent*/
  • glClearColor(0.0, 0.0, 0.0, 0.0);
  • /*routine qui définit le modèle de degradé (lissé ou pas), le paramètre peut prendre la valeur GL_SMOOTH(valeur par défaut)
  • ou GL_FLAT*/
  • glShadeModel(GL_FLAT);
  • }
  • //--fonction d'affichage--//
  • void display(void)
  • {
  • /*on attribut aux tampons spécifiés leur valeur de vidage en cours*/
  • glClear(GL_COLOR_BUFFER_BIT);
  • /*On fait descendre d'un niveau les matrices de tranformation*/
  • glPushMatrix();
  • /*on fait une rotation pour tout ce qui suit en utilisant le spin avec la fonction glRotate*(). la lettre f
  • veut dire que le nombre sera un float*/
  • glRotatef(spin, 0.0, 0.0, 1.0);
  • /*on fait une couleur pour tout ce qui suit avec la fonction glColor*(). la nombre 3 veut dire
  • que la fonction prendra 3 paramètre et la lettre f veut dire que ce sont des nombres float (les trois paramètres sont
  • les composants rouge, vert et bleu de la couleur)*/
  • glColor3f(1.0, 1.0, 1.0);
  • /*on crée un rectangle*/
  • glRectf(-25.0, -25.0, 25.0, 25.0);
  • /*on rejette la matrice de la pile, ce qui en détruit le contenu (toutes les modifications apportées précédemment sont annulées)*/
  • glPopMatrix();
  • /*on échange les tampons grâce à GLUT (un tampons est affiché pendant que l'autre se forme ce qui permet
  • d'avoir des images entièrement dessinées à l'affichage)*/
  • glutSwapBuffers();
  • }
  • //--fonction pour le redimensionnement--//
  • void reshape(int w, int h)
  • {
  • /*Definit un rectangle de pixels dans laquelle l'image finale sera placée.
  • Les 2 premiers paramètres sont les coordonnées de l'angle inférieur gauche du cadrage
  • et les 2 derniers spécifient sa longueur et sa largeur*/
  • glViewport(0, 0, (GLsizei) w, (GLsizei) h);
  • //on se met en mode projection (matrice projection)
  • glMatrixMode(GL_PROJECTION);
  • //on positionne la matrice actuellement modifiable sur la matrice d'identité
  • glLoadIdentity();
  • /*on crée une matrice pour un volume visionné parallèle en perspective cavalière
  • et on multiplie la matrice active par celle-ci.*/
  • glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
  • /* On se place sur la matrice de visualisation de modèles
  • */
  • glMatrixMode(GL_MODELVIEW);
  • //on positionne la matrice actuellement modifiable (matrice de visualisation) sur la matrice d'identité
  • glLoadIdentity();
  • }
  • //--la fonction de rotation--//
  • void spinDisplay(void)
  • {
  • //on tourne vers la droite
  • spin += 2;
  • //si le spin est plus grand que 360 degrés...
  • if (spin > 360)
  • //...on enlève 360 pour que se soit un angle normal
  • spin-=360.0;
  • //fonction permettant de raffraichir l'image avec les changements
  • glutPostRedisplay();
  • }
  • //--fonction de gestion de la souris--//
  • void mouse(int button, int state, int x, int y)
  • {
  • /*on regarde quel bouton est appuyé*/
  • switch(button)
  • {
  • //si il y a un evenement concernant le bouton gauche...
  • case GLUT_LEFT_BUTTON:
  • //..et si cet evenement est un clic...
  • if (state == GLUT_DOWN)
  • //on fait tourner le carré vers la droite grace a la fonction spinDisplay()
  • glutIdleFunc(spinDisplay);
  • break;
  • //si il y a un evenement concernant le bouton du centre...
  • case GLUT_RIGHT_BUTTON:
  • //..et si cet evenement est un clic...
  • if (state == GLUT_DOWN)
  • //on arrete de faire touner le carré, c'est à dire que la fonction de callback (de rappel)
  • // spinDisplay est annulée (on arrete de la rappeler)
  • glutIdleFunc(NULL);
  • break;
  • }
  • }
  • //////////////////////////// LA MAIN ///////////////////////////////////////
  • int main(int argc, char **argv)
  • {
  • //on initialise glut
  • glutInit(&argc, argv);
  • //on spécifie l'emploi du modèle chromatique et du double tampon
  • glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  • //on spécifie la taille de la fenêtre
  • glutInitWindowSize(250, 250);
  • //on spécifie la position de la fenêtre
  • glutInitWindowPosition(100, 100);
  • //on crée une fenêtre
  • glutCreateWindow(argv[0]);
  • //on initialise
  • init();
  • ////////////// FONCTIONS DE CALLBACKS ////////////////////////
  • //
  • // Les fonctions de callbacks sont des fonctions que le programmeur va spécifier pour
  • // la lier à un événement (clic, touche appuyée, redimensionnement, etc).
  • //
  • //on fait une fonction d'affichage de la scène
  • glutDisplayFunc(display);
  • //on fait une fonction de redimensionnement
  • glutReshapeFunc(reshape);
  • //on fait une fonction pour la souris
  • glutMouseFunc(mouse);
  • // boucle infinie d'affichage
  • glutMainLoop();
  • return 0;
  • }
/*
  Name: tutorialAnimation
  Author: Algex
  Date: 18/06/06 13:24
  Description: un petit tuto pour l'apprentissage d'OpenGL avec GLUT
*/


///////////////////////////    LES INCLUDES    ////////////////////////////////////////////////////////
                                                                                                     //  
                                                                                                     //
#include <stdio.h>                                                                                   //
#include <stdlib.h>                                                                                  //
                                                                                                     //
#include <windows.h>/*Microsoft Windows requiert l'insertion de windows.h juste avant gl.h et glu.h  //
car certaines macros utilisées en internes dans la version Microsoft Windows de gl.h et glu.h sont   //
définies dans windows.h*/                                                                            //
                                                                                                     //
#include <GL/glut.h>//GL/glut.h contient déjà gl.h et glu.h mais bon c'est juste pour vous montrer   //
                                                                                                     //
///////////////////////////////////////////////////////////////////////////////////////////////////////


//on crée une variable globale qui va nous servir pour la rotation 
static GLfloat spin = 0.0;


/////////////////////////////   LES FONCIONS   /////////////////////////////////////////////////////////


//--Fonction d'initialisation d'OpenGL--//
void init(void)
{
     /*routine permettant de définir la couleur de vidage qui prend comme paramètre les composants
     rouge, vert, bleu de la couleur plus la valeur alpha. En l'occurence, nous mettons un fond noir non transparent*/
     glClearColor(0.0, 0.0, 0.0, 0.0); 
     
     /*routine qui définit le modèle de degradé (lissé ou pas), le paramètre peut prendre la valeur GL_SMOOTH(valeur par défaut)
     ou GL_FLAT*/
     glShadeModel(GL_FLAT);

}

//--fonction d'affichage--//
void display(void)
{
     /*on attribut aux tampons spécifiés leur valeur de vidage en cours*/
     glClear(GL_COLOR_BUFFER_BIT);
     
     /*On fait descendre d'un niveau les matrices de tranformation*/
     glPushMatrix();
     
     /*on fait une rotation pour tout ce qui suit en utilisant le spin avec la fonction glRotate*(). la lettre f
     veut dire que le nombre sera un float*/
     glRotatef(spin, 0.0, 0.0, 1.0);
     
     /*on fait une couleur pour tout ce qui suit avec la fonction glColor*(). la nombre 3 veut dire
     que la fonction prendra 3 paramètre et la lettre f veut dire que ce sont des nombres float (les trois paramètres sont 
     les composants rouge, vert et bleu de la couleur)*/
     glColor3f(1.0, 1.0, 1.0);
     
     /*on crée un rectangle*/
     glRectf(-25.0, -25.0, 25.0, 25.0);
     
     /*on rejette la matrice de la pile, ce qui en détruit le contenu (toutes les modifications apportées précédemment sont annulées)*/
     glPopMatrix();
     
     /*on échange les tampons grâce à GLUT (un tampons est affiché pendant que l'autre se forme ce qui permet 
     d'avoir des images entièrement dessinées à l'affichage)*/
     glutSwapBuffers();
     
}

//--fonction pour le redimensionnement--//
void reshape(int w, int h)
{
     /*Definit un rectangle de pixels dans laquelle l'image finale sera placée.
     Les 2 premiers paramètres sont les coordonnées de l'angle inférieur gauche du cadrage
     et les 2 derniers spécifient sa longueur et sa largeur*/ 
     glViewport(0, 0, (GLsizei) w, (GLsizei) h);
     
     //on se met en mode projection (matrice projection)
     glMatrixMode(GL_PROJECTION);
     
     //on positionne la matrice actuellement modifiable sur la matrice d'identité
     glLoadIdentity();
     
     /*on crée une matrice pour un volume visionné parallèle en perspective cavalière
     et on multiplie la matrice active par celle-ci.*/
     glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
     
     /* On se place sur la matrice de visualisation de modèles
     */
     glMatrixMode(GL_MODELVIEW);
     
     //on positionne la matrice actuellement modifiable (matrice de visualisation) sur la matrice d'identité
     glLoadIdentity();
}

//--la fonction de rotation--//
void spinDisplay(void)
{
     //on tourne vers la droite
     spin += 2;
                         
     //si le spin est plus grand que 360 degrés...
     if (spin > 360)           
          
          //...on enlève 360 pour que se soit un angle normal
          spin-=360.0;
    
    //fonction permettant de raffraichir l'image avec les changements 
    glutPostRedisplay();      
}


//--fonction de gestion de la souris--//
void mouse(int button, int state, int x, int y)     
{
     /*on regarde quel bouton est appuyé*/
     switch(button)
     {     
           //si il y a un evenement concernant le bouton gauche...
           case GLUT_LEFT_BUTTON:
                
                //..et si cet evenement est un clic...
                if (state == GLUT_DOWN)
                
                //on fait tourner le carré vers la droite grace a la fonction spinDisplay()
                glutIdleFunc(spinDisplay);
           break;
                
                
           //si il y a un evenement concernant le bouton du centre...
           case GLUT_RIGHT_BUTTON:
                
                //..et si cet evenement est un clic...
                if (state == GLUT_DOWN)
                
                //on arrete de faire touner le carré, c'est à dire que la fonction de callback (de rappel)
                // spinDisplay est annulée (on arrete de la rappeler)
                glutIdleFunc(NULL);
           break;
                
     }
}
                


//////////////////////////// LA MAIN ///////////////////////////////////////

int main(int argc, char **argv)
{
    //on initialise glut
    glutInit(&argc, argv);   
    
    //on spécifie l'emploi du modèle chromatique et du double tampon
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    
    //on spécifie la taille de la fenêtre
    glutInitWindowSize(250, 250);
    
    //on spécifie la position de la fenêtre
    glutInitWindowPosition(100, 100);
    
    //on crée une fenêtre
    glutCreateWindow(argv[0]);
    
    //on initialise
    init();
    
    ////////////// FONCTIONS DE CALLBACKS ////////////////////////
    
    //
    // Les fonctions de callbacks sont des fonctions que le programmeur va spécifier pour
    // la lier à un événement (clic, touche appuyée, redimensionnement, etc).
    //
    
    //on fait une fonction d'affichage de la scène
    glutDisplayFunc(display);
    
    //on fait une fonction de redimensionnement
    glutReshapeFunc(reshape);
    
    //on fait une fonction pour la souris
    glutMouseFunc(mouse);
    
    // boucle infinie d'affichage
    glutMainLoop();
    
    return 0;
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   tuto
    • main.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier7 292 octets
    • tutoAnimation.devTélécharger ce fichier [Réservé aux membres club]936 octets
    • tutoAnimation.ex_Télécharger ce fichier [Réservé aux membres club]246 388 octets

Télécharger le zip

Historique

28 avril 2008 12:13:56 :
28/04/08 - Rajout de commentaires et changement de glViewport et glutCreateWindow

Commentaires et avis

signaler à un administrateur
Commentaire de wxccxw le 21/06/2006 14:10:07

un vrai tuto aurait explique ce qu'est une matrice etc..., parceque avec les nom des fonction on peut deviner a quoi elle servent ^^.

glutInit()   //on initialise glut
on se doute bien !

signaler à un administrateur
Commentaire de wxccxw le 21/06/2006 14:11:33

sinon 9/10

signaler à un administrateur
Commentaire de SAKingdom le 24/06/2006 05:53:22

#include <stdio.h> et #include <stdlib.h> sont inutiles.
Bien expliqué. Assé simpliste mais donne les bases. 9/10

signaler à un administrateur
Commentaire de PascalCmoa le 13/04/2007 16:50:08

Franchement, je n'appel pas cela unt tutorial sur OpenGL car le code présenté vient du guide officiel OpenGL 1.X de l'éditeur CampusPress. Cela ressemble à du plagia. Il a peut-être documenté le code, mais bon cela reste un code pompé sur un livre. Tout le monde est capable de faire pareil.

signaler à un administrateur
Commentaire de xenan le 26/04/2008 12:02:51

Moi je connais pas ce livre, donc c'est très bien merci, par contre j'ai une erreur de link: glViewPort et glutCreateWindow ..??

signaler à un administrateur
Commentaire de algeros le 27/04/2008 23:37:42

Xenan >> De rien ;) A mon avis, tu a oublié de mettre opengl et glut (surement aussi glu du coup) dans tes dépendances. En effet, le compilo a besoin de ça pour créer l'executable.

Pascal >> En effet, j'ai copié ce code (il y a deux ans, ça date quand même :) ) du guide officiel, mais je pense que pour ceux qui n'avaient pas le livre, ça pouvait aider quand même. Voila, et puis tout le monde est capable de faire pareil c'est sur, mais personne ne l'a fait que je sache et ce n'est pas comme si c'était un truc qu'on a vu mille fois sur cppfrance et que tout le monde à fait et refait qui n'a plus aucun interêt ;)

signaler à un administrateur
Commentaire de xenan le 28/04/2008 11:17:24

voila ce que j'ai rajouter :
-lglut32 -lglu32 -lopengl32 -lwinmm -lgdi32
mais apparement j'ai du en oublier un ?

j'utilise DevC++

signaler à un administrateur
Commentaire de algeros le 28/04/2008 12:10:15

En fait non c'est pas une erreur de linkage, c'est tout simplement que mes fonctions étaient mal tapées : remplace glViewPort par glViewport et glutCreatewindow par glutCreateWindow et recompile.

signaler à un administrateur
Commentaire de smasher81 le 28/04/2008 22:04:08

Je me demandais si s'était possible d'utiliser autres choses qu'une variable globale.. Car il me semble que c'est à proscrire ..non? Je debute en C..

signaler à un administrateur
Commentaire de algeros le 28/04/2008 22:54:40

oui tu as raison en général, les variables globales ne sont pas recommandées mais en l'occurence c'est un (très) petit programme et donc je peux me le permettre ^^. En plus vu que glut utilise des fonctions de callbacks, on utilise souvent des variables globales dans la main afin de faciliter les choses et c'est très utile.

signaler à un administrateur
Commentaire de xenan le 29/04/2008 07:56:27

Bonjour,
je comprend pas très bien comment marche les reperes ?
comment ca se fait que le point en bas a gauche est sensé être (0,0) (d'apres le glviewport) et quand tu dessine le carre il y a du -25.0 ???

j'ai chercher j'ai pas trouver une commande qui dessine un point de coordnnes (x,y)... ?

merci par avance.

signaler à un administrateur
Commentaire de algeros le 29/04/2008 13:31:51

En fait le glViewport definit des dimensions pour l'affichage. C'est glOrtho qui donne le repère de visualisation : de -50 à 50 en X, de -50 à 50 en Y et de -1 à 1 en Z. Donc en fait les points de valeurs X=0 et Y=0 se situent au centre de l'écran. Si tu veux faire de la 2D, utilise plutôt une autre lib genre SDL ou Allegro ou SFML parce que OpenGL est utilisé pour des rendus 3D.

signaler à un administrateur
Commentaire de algeros le 29/04/2008 13:33:37

En fait le glViewport definit des dimensions pour l'affichage. C'est glOrtho qui donne le repère de visualisation : de -50 à 50 en X, de -50 à 50 en Y et de -1 à 1 en Z. Donc en fait les points de valeurs X=0 et Y=0 se situent au centre de l'écran. Si tu veux faire de la 2D, utilise plutôt une autre lib genre SDL ou Allegro ou SFML parce que OpenGL est utilisé pour des rendus 3D.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Gestion de la souris OpenGL SANS GLUT [ par Xentor ] Comment faire pour connaitre le déplacement de la souris sans utiliser Glut ? (Savoir si on la déplace en haut, à gauche, etc...) J'ai fait plusieurs URGENT : Cherche tutorial OpenGL [ par dominiquox ] Salut à tous les programmeurs en herbe ...Est-ce qu'il faut connaitre impérativement le C++ sous Win32 pour Faire de l'OpenGL ?Si oui, Est ce que qq p tutorial ou code GLUT [ par francky ] SALUT,je débute avec dev c, et j'aimerais créer une interface portable aussi bien sous window que sous linux;mon probleme: j'ai bien trouver glui, mai glut - openGL [ par loss ] Quels sont les fichiers necessaires pour utiliser glut(je compile avec VC++)?Ou est ce que je peux les telecharger?Merci d avance. Objects 3D Opengl [ par mastave ] Comment inclure dans un fenêtre OpenGl un fichier 3D DXF ou3DS??? Moteur 3d OpenGL [ par Stormy ] Salut. Je recherche des personnes motives pour travailler sur un moteur 3d sous OpenGL. Les bases sont deja etablies (Detection de collisions, sons, m glut et opengl [ par MiTcH37 ] voila ce que j'ai lorsque je compile un prog avec du glut.h...C:\DOCUME~2\Mitch1\LOCALS~1\Temp\cc6Pbaaa.o(.text+0xcc):souris2.cpp: undefined reference opengl [ par MiTcH37 ] J'aimerais bien faire de l'opengl, mais ça marche pas... voila ce que j'ai lorsque je compile un prog avec du glut.h...C:\DOCUME~2\Mitch1\LOCALS~1\Tem devc++ [ par MiTcH37 ] qqun se sert de devc++ ?J'aimerais bien faire de l'opengl, mais ça marche pas... &gt; &gt; &gt; &gt; voila ce que j'ai lorsque je compile un prog avec


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.