Partage
  • Partager sur Facebook
  • Partager sur Twitter

[OpenGl] Grapheur 3D

Améliorations ?

    15 juin 2006 à 11:52:06

    Bonjour, ce matin, je viens de finir mon grapheur 3D en openGl et je vous presente ma création :)
    Voici le code :
    #include <SDL/sdl.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <math.h>

    #define Z 4
    #define GRILLEX 40
    #define GRILLEY 40

    #define XMIN -4
    #define XMAX 4
    #define YMIN -4
    #define YMAX 4

    void repere(void);

    int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Grapheur 3D par Cedric", 0);
        SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
        SDL_EnableKeyRepeat(10, 10);
        glEnable(GL_DEPTH_TEST);

            SDL_Event event;
        int fin=0, x=0, y=0, zoom=70,
            angleX=-45, angleZ=0, debut=0;
        double hauteur[GRILLEX][GRILLEY]={0},
               i=0, j=0;

        for ( i=XMIN, x=0; i<XMAX; i+=(XMAX-XMIN)/(float)GRILLEX, x++ )
            for ( j=YMIN, y=0; j<YMAX; j+=(YMAX-YMIN)/(float)GRILLEY, y++ )
                /*FONCTION*/ hauteur[x][y]=sin(i*j); /*FONCTION*/
                /*Modifiez la fonction ici*/

            while (!fin)
        {
            if ( SDL_GetTicks()-debut>=10 )
            {
                SDL_PollEvent(&event);
                switch (event.type)
                {
                    case SDL_QUIT:
                        fin=1;
                        break;
                    case SDL_KEYDOWN:
                    {
                        switch (event.key.keysym.sym)
                        {
                            case SDLK_ESCAPE:
                                fin=1;
                                break;
                            case SDLK_LEFT:
                                angleX--;
                                break;
                            case SDLK_RIGHT:
                                angleX++;
                                break;
                            case SDLK_UP:
                                angleZ--;
                                break;
                            case SDLK_DOWN:
                                angleZ++;
                                break;
                            case SDLK_PAGEUP:
                                if ( zoom-1>=1 )
                                    zoom-=1;
                                break;
                            case SDLK_PAGEDOWN:
                                if ( zoom+1<=130 )
                                    zoom+=1;
                                break;
                        }
                        break;
                    }
                }

                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                gluPerspective(zoom, 640/480, 1, 1000);

                glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
                glMatrixMode(GL_MODELVIEW);
                glLoadIdentity();
                gluLookAt(-4, -4, 24, 8, 8, 8, 0, 0, 1);

                glTranslated(20, 20, -20);
                glRotated(angleX, 0, 0, 1);
                glRotated(angleZ, 1, 0, 0);
                glColor3ub(255, 255, 255);

                repere();
                glColor3ub(255, 255, 255);

                glBegin(GL_LINES);
                for ( x=1; x<GRILLEX-1; x++ )
                {
                    for ( y=1; y<GRILLEY-1; y++ )
                    {
                        glVertex3d(x-(GRILLEX/2), y-(GRILLEY/2), hauteur[x][y]*Z);
                        glVertex3d(x-(GRILLEX/2), y-(GRILLEY/2)+1, hauteur[x][y+1]*Z);

                        glVertex3d(x-(GRILLEX/2), y-(GRILLEY/2), hauteur[x][y]*Z);
                        glVertex3d(x-(GRILLEX/2)+1, y-(GRILLEY/2), hauteur[x+1][y]*Z);

                        glVertex3d(x-(GRILLEX/2), y-(GRILLEY/2), hauteur[x][y]*Z);
                        glVertex3d(x-(GRILLEX/2), y-(GRILLEY/2)-1, hauteur[x][y-1]*Z);

                        glVertex3d(x-(GRILLEX/2), y-(GRILLEY/2), hauteur[x][y]*Z);
                        glVertex3d(x-(GRILLEX/2)-1, y-(GRILLEY/2), hauteur[x-1][y]*Z);
                    }
                }
                glEnd();

                glFlush();
                SDL_GL_SwapBuffers();
                debut=SDL_GetTicks();
            }
            else
                SDL_Delay(10-(SDL_GetTicks()-debut));
            }
            SDL_Quit();
        return 0;
    }

    void repere(void)
    {
        int i=0;

        glBegin(GL_LINES);
            glColor3ub(0, 255, 0);
                glVertex3d(0, 0 ,0);
                glVertex3d(GRILLEX/2, 0 ,0);
                for ( i=0; i<GRILLEX/2; i++ )
                {
                    glVertex3d(i, -0.5, 0);
                    glVertex3d(i, 0.5, 0);
                }
            glColor3ub(0, 0, 255);
                glVertex3d(0, 0, 0);
                glVertex3d(0, GRILLEY/2, 0);
                for ( i=0; i<GRILLEY/2; i++ )
                {
                    glVertex3d(-0.5, i, 0);
                    glVertex3d(0.5, i, 0);
                }
            glColor3ub(255, 0, 0);
                glVertex3d(0, 0, 0);
                glVertex3d(0, 0, Z*10);
                for ( i=0; i<Z*10; i++ )
                {
                    glVertex3d(-0.5, 0, i);
                    glVertex3d(0.5, 0, i);
                }
        glEnd();

        return;
    }


    Vous avez juste a compiler et a fournir la SDL.dll...
    Ah oui, pour compiler, vous devez tappez "opengl32" et "glu32" dans les options du linker pour pourvoir lancer la compilation.

    L'axe VERT represente l'axe des abxcisses X, le bleu Y, et Le Rouge Z.
    Si vous souhaitez voir une autre fonction, modifiez le code et tappez votre fonction (avec les variables i pour x et j pour y),
    pour ceux qui ne sont pas tres a l'aise avec les fonctions 3D, un petit exemple : la fonction z=i*j, ou z=sin(cos(i*i/j*j)) :p

    Comme vous pouvez le voir, je ne sait pas comment on peut demander une saisie dans la fenetre alors tout aide ne sera pas de refus, merci d'avance !

    EDIT: fleches directionnelles pour bouger et pageup/down pour le zoom
    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2006 à 19:39:25

      Wooowwww.... vraiment impressionnant, on croirait un veritable logiciel mathématique je dit bravo ^^ .
      Si je puis sugérer une idée qui pourrait te parraitre débile, peut être que tu devrais voir si ton système ne peu pas servir de base pour les mouvements de matières liquides dans un jeu ou autre tu vois ce qe je veux dire? Car cela rendrais vraiment bien !
      Mais vraiment exellent sinon bravo ^^ .
      • Partager sur Facebook
      • Partager sur Twitter

      [OpenGl] Grapheur 3D

      × 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