Faire défiler un objet openGl

ygoth Messages postés 9 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 30 octobre 2009 - 30 oct. 2009 à 19:06
shorzy Messages postés 90 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 1 juin 2013 - 17 févr. 2010 à 13:31
Bonjour à tous :)

J'ai un petit soucis en openGl j'essaye de refaire un "guitare hero" en C++

J'en suis pour l'instant qu'à la partit graphique.

Et mon problème se pose au moment ou je veux faire défiler une de mes note. je pense que je m'y prend mal car je n'arrive pas a comprendre le fonctionnement des translation... je n'arrive pas à translater qu'un objet à la fois...

Bref du coup je recrée mon pavé à des positions différentes.
Mais au moment ou je veux le faire automatiquement avec un for() sois le for est trop rapide et je voie le pavé sur toute la longueur sois je rajoute un Sleep(5) et la le programme plante au démarrage...

ça seras peux être plus parlant avec le code :
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <cstdlib>
#include <windows.h>

SHORT Mask = 32768;
double TRose 8, TBleu 8, TJaune = 8, TRouge = 8, TVert = 8;
int x =0;
//void Draw();
void Repere();
void Manche();
void defiler();
void Quadz ( double posAX,double posAY,double posAZ,double Largeur,double Longeur,double Hauteur, bool ColorR, bool ColorG, bool ColorB); //couleur = 0||1



int main(int argc, char *argv[])
{
    SDL_Event event;

    SDL_Init(SDL_INIT_VIDEO);
    atexit(SDL_Quit);
    SDL_WM_SetCaption("SDL GL Application", NULL);
    SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(70,(double)800/600,1,1000);
    	glEnable(GL_DEPTH_TEST);



    //Draw();

    for (;;)
    {


    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );

    gluLookAt(0.5,2,-1.2, 0.5,0.2,2.5, 0, 0, 1);
        SDL_PollEvent(&event);



        if (GetKeyState('G') & Mask)// incrémentation en Z de la case verte 
                TVert = TVert -0.01;
        if (GetKeyState('T') & Mask)
                TVert = TVert +0.01;



         Repere();
         Manche();
         defiler();
         Quadz (0, 0.2, TVert, 0.2, 0.0625, 0.0500, 0, 1, 0);// déplacement manuel de la case verte 

      // Draw();

           glFlush();
    SDL_GL_SwapBuffers();
    }

    return 0;
}




void Quadz ( double posAX,double posAY,double posAZ,double Largeur,double Longeur,double Hauteur, bool ColorR, bool ColorG, bool ColorB) //couleur = 0||1
{
    GLubyte RDESSUS=0, RDEVANT=0, RGAUCHE=0, RDROITE=0, RDESSOUS=0, RDERRIERE=0, GDESSUS=0, GDEVANT=0, GGAUCHE=0, GDROITE=0, GDESSOUS=0, GDERRIERE=0, BDESSUS=0, BDEVANT=0, BGAUCHE=0, BDROITE=0, BDESSOUS=0, BDERRIERE=0;


    if (ColorR==1)
    {
        RDESSUS= 255;
        RDEVANT= 190;
        RGAUCHE= 130;
        RDROITE= 130;
        RDESSOUS= 80;
        RDERRIERE= 80;
    }

    if (ColorG==1)
    {
        GDESSUS= 255;
        GDEVANT= 190;
        GGAUCHE= 130;
        GDROITE= 130;
        GDESSOUS= 80;
        GDERRIERE= 80;
    }

    if (ColorB==1)
    {
        BDESSUS= 255;
        BDEVANT= 190;
        BGAUCHE= 130;
        BDROITE= 130;
        BDESSOUS= 80;
        BDERRIERE= 80;
    }







    glBegin(GL_QUADS);

    glColor3ub(RDEVANT,GDEVANT,BDEVANT); //face DEVANT
     glVertex3d(posAX,posAY,posAZ);   //A
     glVertex3d(posAX+Largeur,posAY,posAZ);   //B
     glVertex3d(posAX+Largeur,posAY+Hauteur,posAZ); //C
     glVertex3d(posAX,posAY+Hauteur,posAZ); //D

    glColor3ub(RDROITE,GDROITE,BDROITE); //face DROITE
     glVertex3d(posAX+Largeur,posAY,posAZ);   //B
     glVertex3d(posAX+Largeur,posAY,posAZ+Longeur);   //F
     glVertex3d(posAX+Largeur,posAY+Hauteur,posAZ+Longeur);  //G
     glVertex3d(posAX+Largeur,posAY+Hauteur,posAZ); //C

    glColor3ub(RDESSOUS,GDESSOUS,BDESSOUS); //face DESSOUS
     glVertex3d(posAX,posAY,posAZ);   //A
     glVertex3d(posAX+Largeur,posAY,posAZ);   //B
     glVertex3d(posAX+Largeur,posAY,posAZ+Longeur);   //F
     glVertex3d(posAX,posAY,posAZ+Longeur);    //E

    glColor3ub(RGAUCHE,GGAUCHE,BGAUCHE); //face GAUCHE
     glVertex3d(posAX,posAY,posAZ);   //A
     glVertex3d(posAX,posAY,posAZ+Longeur);    //E
     glVertex3d(posAX,posAY+Hauteur,posAZ+Longeur);   //H
     glVertex3d(posAX,posAY+Hauteur,posAZ); //D

    glColor3ub(RDERRIERE,GDERRIERE,BDERRIERE); //face DERRIERE
     glVertex3d(posAX,posAY,posAZ+Longeur);    //E
     glVertex3d(posAX+Largeur,posAY,posAZ+Longeur);   //F
     glVertex3d(posAX+Largeur,posAY+Hauteur,posAZ+Longeur);  //G
     glVertex3d(posAX,posAY+Hauteur,posAZ+Longeur);   //H

    glColor3ub(RDESSUS, GDESSUS, BDESSUS); //face DESSUS
     glVertex3d(posAX,posAY+Hauteur,posAZ); //D
     glVertex3d(posAX+Largeur,posAY+Hauteur,posAZ); //C
     glVertex3d(posAX+Largeur,posAY+Hauteur,posAZ+Longeur);  //G
     glVertex3d(posAX,posAY+Hauteur,posAZ+Longeur);   //H
      glEnd();

}



void Repere()
{
    glBegin(GL_LINES);

         glColor3ub(0,255,0);
            glVertex3d(0,0,0); //X
            glVertex3d(1,0,0);
             glEnd();

    glBegin(GL_LINES);
         glColor3ub(0,0,255);
            glVertex3d(0,0,0); //Y
            glVertex3d(0,1,0);
             glEnd();

    glBegin(GL_LINES);
        glColor3ub(255,0,0);
            glVertex3d(0,0,0); //Z
            glVertex3d(0,0,1);
             glEnd();
}



void Manche()
{
     glBegin(GL_QUADS);

    glColor3ub(125,60,0); //face DEVANT
     glVertex3d(0,0,0);   //A
     glVertex3d(1,0,0);   //B
     glVertex3d(1,0.2,0); //C
     glVertex3d(0,0.2,0); //D

    glColor3ub(110,60,0); //face DROITE
     glVertex3d(1,0,0);   //B
     glVertex3d(1,0,8);   //F
     glVertex3d(1,0.2,8);  //G
     glVertex3d(1,0.2,0); //C

    glColor3ub(70,30,0); //face DESSOUS
     glVertex3d(0,0,0);   //A
     glVertex3d(1,0,0);   //B
     glVertex3d(1,0,8);   //F
     glVertex3d(0,0,8);    //E

    glColor3ub(110,60,0); //face GAUCHE
     glVertex3d(0,0,0);   //A
     glVertex3d(0,0,8);    //E
     glVertex3d(0,0.2,8);   //H
     glVertex3d(0,0.2,0); //D

    glColor3ub(70,30,0); //face DERIERE
     glVertex3d(0,0,8);    //E
     glVertex3d(1,0,8);   //F
     glVertex3d(1,0.2,8);  //G
     glVertex3d(0,0.2,8);   //H

    glColor3ub(170,80,0); //face DESSUS
     glVertex3d(0,0.2,0); //D
     glVertex3d(1,0.2,0); //C
    glColor3ub(255,180,110);
     glVertex3d(1,0.2,8);  //G
     glVertex3d(0,0.2,8);   //H
      glEnd();


     for (double i = 0; i<1.1; i=i+0.2)
     {
         glBegin(GL_LINES);
        glColor3ub(180,180,180);
         glVertex3d(i,0.201,0);
         glVertex3d(i,0.201,8);
        glEnd();
     }

     for (double i = 0; i<8.1; i=i+0.5)
     {
         glBegin(GL_LINES);
        glColor3ub(180,180,180);
         glVertex3d(0,0.201,i);
         glVertex3d(1,0.201,i);
        glEnd();
     }

}


void defiler()
{

    for (double Tz=8;Tz>0;Tz=Tz-0.01)
    {

      Quadz (0.8, 0.2, Tz, 0.2, 0.0625, 0.0500, 1, 0, 1);

      //Sleep(5);

    }

}




Le problème arrive dans mon void defiler() tout à la fin


Alors voila je suis un peux tout perdu et m'en remet donc a vous :)


Je vous remercient d'avance.

à bientôt.

1 réponse

shorzy Messages postés 90 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 1 juin 2013
17 févr. 2010 à 13:31
Tu as Trouvé depuis le Temps ???

1) Une Translation ne S'Effectue pas n'importe Quand/Comment ...
2) Essaye des Timer.

++
0
Rejoignez-nous