Advertisement
Guest User

Untitled

a guest
Apr 21st, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. /*********************************************************/
  3. /*        TP1: primitives 2D et transformations          */
  4. /*********************************************************/
  5. /*                                                       */
  6. /*       ESGI: Algorithmiques pour l'infographies        */
  7. /*                                                       */
  8. /*********************************************************/
  9. /*                                                       */
  10. /*  Objectif: afficher des formes 2D et les transformer  */
  11. /*                                                       */
  12. /*********************************************************/
  13.  
  14.  
  15.  
  16. #include<windows.h>
  17.  
  18. #ifdef __APPLE__
  19. #include <GLUT/glut.h>
  20. #else
  21. #include <GL/glut.h>
  22. #endif
  23.  
  24.  
  25. #include<stdlib.h>
  26. #include<stdio.h>
  27. #include<math.h>
  28.  
  29.  
  30.  
  31.  
  32. float angle = 0.0;
  33. float cameraAngle = 10.0;
  34. float X = 0;
  35. float Y = 0;
  36. float Z = 10;
  37. float P = 0;
  38. float L = 0;
  39. float R = 10;
  40.  
  41. /* prototypes de fonctions */
  42. void initRendering();                           // Initialisation du rendu
  43. void display();                             // modélisation
  44. void reshape(int w,int h);                      // visualisation
  45. void update(int value);                         // mise à jour: appelle Timer pour l'animation de la scène
  46. void keyboard(unsigned char key, int x, int y); // fonction clavier
  47.  
  48.  
  49. /* Programme principal */
  50. int main(int argc,       // argc: nombre d'arguments, argc vaut au moins 1
  51.           char **argv){  // argv: tableau de chaines de caractères, argv[0] contient le nom du programme lancé (plus un éventuel chemin)
  52.  
  53.  
  54.     /* Initialisation de glut et creation de la fenetre */
  55.     glutInit(&argc, argv);                       // Initialisation
  56.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); // mode d'affichage RGB, et test prafondeur
  57.     glutInitWindowSize(800, 800);                // dimension fenêtre
  58.     glutInitWindowPosition (100, 100);           // position coin haut gauche
  59.     glutCreateWindow("TP1: formes 2D et transformation");  // nom
  60.  
  61.     /* Initialisation d'OpenGL */
  62.     initRendering();
  63.  
  64.     /* Enregistrement des fonctions de rappel
  65.      => initialisation des fonctions callback appelées par glut */
  66.     glutDisplayFunc(display);
  67.     glutReshapeFunc(reshape);
  68.     glutKeyboardFunc(keyboard);
  69.     glutTimerFunc(20,update, 0);
  70.  
  71.     /* rq: le callback de fonction (fonction de rappel) est une fonction qui est passée en argument à une
  72.     autre fonction. Ici, le main fait usage des deux fonctions de rappel (qui fonctionnent en même temps)
  73.     alors qu'il ne les connaît pas par avance.*/
  74.  
  75.  
  76.     /* Entrée dans la boucle principale de glut, traitement des évènements */
  77.     glutMainLoop();         // lancement de la boucle de réception des évènements
  78.     return 0;               // pour finir
  79. }
  80.  
  81.  
  82. /* Initialisation d'OpenGL pour le rendu de la scène */
  83. void initRendering() {
  84.  
  85.     /* Active le z-buffer */
  86.     glEnable(GL_DEPTH_TEST);
  87.  
  88.     /* Activation des couleurs */
  89.     glEnable(GL_COLOR_MATERIAL);
  90.  
  91.     /* définit la couleur d'effacement et la couleur de fond */
  92.     glClearColor(0.0, 0.0, 0.0, 0.0);
  93.  
  94.     /*  définit la taille d'un pixel*/
  95.     glPointSize(2.0);
  96.  
  97. }
  98.  
  99. /* Création de la scène */
  100. void display(){
  101.  
  102.     /* Efface les tampons de couleur et de profondeur de l'image avec la couleur de fond.
  103.     rq: buffer: mémoire tampon, c'est donc une surface en memoire utilisée pour stocker une image*/
  104.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  105.  
  106.     /* la mat de visualisation-modélisation est modifiable par défaut */
  107.     glMatrixMode(GL_MODELVIEW);
  108.  
  109.     /* on charge l'identité dans la matrice de modélisation-visualisation*/
  110.     glLoadIdentity();
  111.  
  112.  
  113.     /* Permet de créer un point de vue. Définit une matrice de modélisation-visualisation et la multiplie
  114.     à droite de lma matrice active, ici l'identité*/
  115.     gluLookAt(X, Y, Z,      // position caméra
  116.               0.0, 0.0, 0.0,      // point de mire
  117.               0.0, 1.0, 0.0);     // vecteur d'orientation caméra
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.     /* A vous de jouer */
  125.     glPushMatrix();
  126.         glPushMatrix();
  127.             glColor3f(1, 1, 1);
  128.             glScalef(2, 5, 2);
  129.             glutSolidCube(1.0);
  130.         glPopMatrix();
  131.  
  132.         glTranslatef(1.5, 2.2, 0);
  133.         glRotatef(-angle, 1, 0, 0);
  134.         glTranslatef(0, -0.8, 0);
  135.  
  136.         glPushMatrix();
  137.             glColor3f(1, 0, 0);
  138.             glScalef(1, 2, 1);
  139.             glutSolidCube(1.0);
  140.         glPopMatrix();
  141.  
  142.         glTranslatef(0, -1, 0);
  143.         glRotatef(-angle, 1, 0, 0);
  144.         glTranslatef(0, -1, 0);
  145.  
  146.         glPushMatrix();
  147.             glColor3f(0, 1, 0);
  148.             glScalef(1, 2, 1);
  149.             glutSolidCube(1.0);
  150.         glPopMatrix();
  151.  
  152.     glPopMatrix();
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.     /* On swap (échange) les buffers, càd, on fait passer l'image calculée et dessinée
  165.     dans le back buffer au buffer qui va l'afficher: le front buffer (en général), c'est le bouble buffering
  166.     Cela évite une image animée sacadée, si elle était directement tracée dans le front buffer*/
  167.     glutSwapBuffers();
  168.  
  169.     /* On force l'affichage */
  170.     glFlush(); // nettoie les fenêtres précédentes
  171. }
  172.  
  173.  
  174.  
  175. /*  Mise en forme de la scène pour l'affichage */
  176. void reshape(int w,  // w: largeur fenêtre
  177.              int h)  // h: hauteur fenêtre
  178. {
  179.     /* Viewport: cadrage. Spécifie la région (position et taille en px) que l'image observée de la scène occupe
  180.     à l'écran => réduction et agrandissement de l'image possible*/
  181.     glViewport(0, 0,(GLsizei) w, (GLsizei) h);
  182.  
  183.     /* Spécifie que la matrice de projection va être modifiée  */
  184.     glMatrixMode(GL_PROJECTION);
  185.     glLoadIdentity();             // matrice courante: l'identité
  186.     //glOrtho(-2.0, 2.0, -2.0, 2.0, 1.5, 20.0);
  187.     //glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
  188.  
  189.     /* Perspective avec point de fuite */
  190.     gluPerspective(60.0,                       // angle d'ouverture vertical caméra
  191.                    (GLfloat) w / (GLfloat) h,  // ratio largeur-hauteur
  192.                    1.0,                        // plan proche z=1
  193.                    200.0);                     // plan éloigné z=200
  194.  
  195.  
  196. }
  197.  
  198. /* Fonction de gestion du clavier */
  199. void keyboard(unsigned char key,       // Touche qui a été pressée
  200.                     int x, int y) {    // Coordonnées courante de la souris
  201.  
  202.         switch (key){
  203.  
  204.             case 'p':   /* affichage du carré plein*/
  205.                 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  206.                 glutPostRedisplay();
  207.                 break;
  208.  
  209.             case 'f':   /* affichage en mode fil de fer*/
  210.                 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  211.                 glutPostRedisplay();
  212.                 break;
  213.  
  214.             case 'l':   /* affichage en mode sommets seuls*/
  215.                 glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
  216.                 glutPostRedisplay();
  217.                 break;
  218.  
  219.             case 'z':   /* affichage en mode sommets seuls*/
  220.                 L += 0.1;
  221.                 if(L < 88.5){
  222.                     X = R * cos(L) * sin(P);
  223.                     Y = R * sin(L);
  224.                     Z = R * cos(L) * cos(P);
  225.                 }
  226.                 glutPostRedisplay();
  227.                 break;
  228.  
  229.             case 's':   /* affichage en mode sommets seuls*/
  230.                 L -= 0.1;
  231.                 if(L > -88.5){
  232.                     X = R * cos(L) * sin(P);
  233.                     Y = R * sin(L);
  234.                     Z = R * cos(L) * cos(P);
  235.                 }
  236.                 glutPostRedisplay();
  237.                 break;
  238.  
  239.             case 'd':   /* affichage en mode sommets seuls*/
  240.                 if(P <= 180){
  241.                     P += 0.1;
  242.                 }
  243.                 X = R * cos(L) * sin(P);
  244.                 Y = R * sin(L);
  245.                 Z = R * cos(L) * cos(P);
  246.                 glutPostRedisplay();
  247.                 break;
  248.  
  249.             case 'q':   /* affichage en mode sommets seuls*/
  250.                 if(P >= -180){
  251.                     P -= 0.1;
  252.                 }
  253.                 X = R * cos(L) * sin(P);
  254.                 Y = R * sin(L);
  255.                 Z = R * cos(L) * cos(P);
  256.                 glutPostRedisplay();
  257.                 break;
  258.  
  259.             case 'g':   /* affichage en mode sommets seuls*/
  260.                 R += 0.1;
  261.                 X = R * cos(L) * sin(P);
  262.                 Y = R * sin(L);
  263.                 Z = R * cos(L) * cos(P);
  264.                 glutPostRedisplay();
  265.                 break;
  266.  
  267.             case 't':   /* affichage en mode sommets seuls*/
  268.                 R -= 0.1;
  269.                 X = R * cos(L) * sin(P);
  270.                 Y = R * sin(L);
  271.                 Z = R * cos(L) * cos(P);
  272.                 glutPostRedisplay();
  273.                 break;
  274.  
  275.             case 'm':   /* Quitter le programme */
  276.                 exit(0);
  277.         }
  278. }
  279.  
  280. void update(int value){
  281.     angle += 0.1;
  282.     if(angle > 360){
  283.         angle = 0;
  284.     }
  285.     /*glRotatef(-cameraAngle, 0.1, -0.1, 1.0);
  286.     gluLookAt(0.0, 0.0, 5.0,      // position caméra
  287.               0.0, 0.0, 0.0,      // point de mire
  288.               0.0, 1.0, 0.0);*/
  289.     glutPostRedisplay();
  290.     glutTimerFunc(1,update, 0);
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement