Partage
  • Partager sur Facebook
  • Partager sur Twitter

[OPENGL] exercice de Kayl : la grue

problème de senes de rotation

    18 juillet 2006 à 22:00:12

    Bonsoir,
    j'ai voulu refaire l'exo sur la grue pour me défouler un peu et lorsque je compile : :colere: BAM! :colere: il faut rechanger toutes les valeurs d'angle pour les rotations car je suis dans le sens inverse des aiguilles d'une montre...
    Pourtant, dans la solution de l'exo, toutes les valeurs d'angle sont faites pour le sens des aiguilles d'une montre.
    Et en comparant avec la soluce , je vois pas où est le problème... :-°

    Quelqu'un peut-il m'aider?
    Merci pour vos réponses ;)

    /*
    grue.c
    ******
    */


    #include <SDL/SDL.h>
    #include <GL/GL.h>
    #include <GL/GLU.h>

    #define LARGEUR_BASE 50
    #define HAUTEUR_BASE 20

    #define LARGEUR_BRAS_1 15
    #define HAUTEUR_BRAS_1 150

    #define LARGEUR_BRAS_2 10
    #define HAUTEUR_BRAS_2 50

    #define TAILLE_CAISSE 10

    #define LARGEUR_FENETRE (LARGEUR_BASE + HAUTEUR_BRAS_1 + HAUTEUR_BRAS_2 + 50)
    #define HAUTEUR_FENETRE (HAUTEUR_BASE + HAUTEUR_BRAS_1 + HAUTEUR_BRAS_2 + 50)

    #define LONGUEUR 50              // *******************************************
    #define ANGLE_DEPART_BRAS_1 -45  //LA JE SUIS OBLIGE DE CHANGER en mettant un -
    #define ANGLE_DEPART_BRAS_2 -20  // *******************************************

    void dessiner(int angle1, int angle2, int longueur);
    void dessinerRectangle(double largeur, double hauteur);
    void dessinerRepere(unsigned int echelle);

    int main(int argc, char *argv[])
    {
        bool continuer=false;
        SDL_Event event;
       
        int angle1=ANGLE_DEPART_BRAS_1;
        int angle2=ANGLE_DEPART_BRAS_2;
        int longueur=LONGUEUR;
       
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Exercice : une grue", NULL);
        SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_OPENGL);
       
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, LARGEUR_FENETRE, 0, HAUTEUR_FENETRE);
       
        SDL_EnableKeyRepeat(10, 10);
       
        while(!continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                     continuer = true;
                     break;
                case SDL_KEYDOWN:
                     switch(event.key.keysym.sym)
                     {
                         case SDLK_UP:
                              longueur--;
                              if(longueur < 10)
                                  longueur = 10;
                              break;
                         case SDLK_DOWN:
                              longueur++;
                              if(longueur > 150)
                                  longueur = 150;
                              break;
                         case SDLK_LEFT:
                              if((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                              {
                                  angle1++;          // ****************************************
                                  if(angle1 > 0)     //TOUTES LES VALEURS LIMITES POUR LES TESTS
                                      angle1 = 0;    //DOIVENT AUSSI ETRE CHANGEES
                              }                      // ****************************************
                              else
                              {
                                   angle2++;
                                   if(angle2 > 90)
                                       angle2 = 90;
                              }
                              break;
                         case SDLK_RIGHT:
                              if((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                              {
                                  angle1--;
                                  if(angle1 < -90)
                                      angle1 = -90;
                              }
                              else
                              {
                                  angle2--;
                                  if(angle2 < -90)
                                      angle2 = -90;
                              }
                              break;
                     }
            }
           
            dessiner(angle1, angle2, longueur);
        }
       
        SDL_EnableKeyRepeat(0, 0);
           
        SDL_Quit();
       
        return 0;
    }

    void dessiner(int angle1, int angle2, int longueur)
    {     
        glClear(GL_COLOR_BUFFER_BIT);
         
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
       
        glTranslated(LARGEUR_BASE, HAUTEUR_BASE/2, 0);
             dessinerRepere(100);
       
        glColor3ub(254,128,1);
        dessinerRectangle(LARGEUR_BASE, HAUTEUR_BASE);
       
        glTranslated(0, HAUTEUR_BASE, 0);
       
        glRotated(angle1, 0, 0, 1);
        glColor3ub(248,230,7);
        dessinerRectangle(LARGEUR_BRAS_1, HAUTEUR_BRAS_1);
       
        glTranslated(0, HAUTEUR_BRAS_1, 0);
       
        glRotated(angle2, 0, 0, 1);
        glColor3ub(186,234,21);
        dessinerRectangle(LARGEUR_BRAS_2, HAUTEUR_BRAS_2);
       
        glTranslated(0, HAUTEUR_BRAS_2, 0);
       
        glRotated(-angle1-angle2+180, 0, 0, 1);
        glColor3ub(255,255,255);
        glBegin(GL_LINES);
            glVertex2d(0, 0);
            glVertex2d(0, longueur);
        glEnd();
       
        glTranslated(0, longueur, 0);
       
        glColor3ub(175,175,85);
        dessinerRectangle(TAILLE_CAISSE, TAILLE_CAISSE);
       
        glFlush();
        SDL_GL_SwapBuffers();
    }
       
    void dessinerRectangle(double largeur, double hauteur)
    {
        glBegin(GL_QUADS);
            glVertex2d(-largeur/2, hauteur);
            glVertex2d(-largeur/2, 0);
            glVertex2d(largeur/2, 0);
            glVertex2d(largeur/2, hauteur);
        glEnd();
    }

    void dessinerRepere(unsigned int echelle)
    {
        glPushMatrix();
        glScalef(echelle,echelle,echelle);
        glBegin(GL_LINES);
        glColor3ub(0,0,255);
        glVertex2i(0,0);
        glVertex2i(1,0);
        glColor3ub(0,255,0);
        glVertex2i(0,0);
        glVertex2i(0,1);
        glEnd();
        glPopMatrix();
    }
    • Partager sur Facebook
    • Partager sur Twitter

    [OPENGL] exercice de Kayl : la grue

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown