IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

affichage d'un cube avec opengl


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Points : 38
    Points
    38
    Par défaut affichage d'un cube avec opengl
    Bonjour a tous ...
    Je suis debutant mais vraiment debutante avec les outils de c++
    J'aimerais avoir de l'aide avec le code opengl pour afficher un cube car
    je ne maitrice pas vraiment opengl c'est nouveau pour moi...

    le programme compile mais rien ne s'affiche ...et je ne sais pas pourquoi
    Si une personne peut m'aide j'apprecirais énormement...Merci pour l'aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    #include <GL/openglut.h>
     
    #include <stdarg.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    /*
     * This macro is only intended to be used on arrays, of course.
     */
    #define NUMBEROF(x) ((sizeof(x))/(sizeof(x[0])))
     
    /*
     * These global variables control which object is drawn,
     * and how it is drawn.  No object uses all of these
     * variables.
     */
    static int function_index;
    static int slices = 16;
    static int stacks = 16;
    static double irad = .25;
    static double orad = 1.0;
    static int depth = 4;
    static const double offset[ 3 ] = { 0, 0, 0 };
     
    typedef struct
    {
        const char * const name;
        void (*solid) (void);
        void (*wire)  (void);
    } entry;
     
    #define ENTRY(e) {#e, drawSolid##e, drawWire##e}
     
    static void shapesPrintf (int row, int col, const char *fmt, ...)
    {
        static char buf[256];
        int viewport[4];
     
        va_list args;
     
        va_start(args, fmt);
        (void) vsprintf (buf, fmt, args);
        va_end(args);
     
        glGetIntegerv(GL_VIEWPORT,viewport);
     
        glPushMatrix();
        glLoadIdentity();
     
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        glOrtho(0,viewport[2],0,viewport[3],-1,1);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();
    }
     
    static void
    resize(int width, int height)
    {
        const float ar = (float) width / (float) height;
     
        glViewport(0, 0, width, height);
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        if( ar > .5 )
            glFrustum( -ar, ar, -1.0, 1.0, 2.0, 100.0 );
        else
            glFrustum( -1.0, 1.0, -1/ar, 1/ar, 2.0, 100.0 );
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity() ;
    }
     
    static void
    display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_LIGHTING);
        glColor3d(1,0,0);
        glPushMatrix();
        glTranslated(0,1.2,-6);
        glPopMatrix();
     
        glPushMatrix();
        glTranslated(0,-1.2,-6);
     
        glPopMatrix();
     
        glDisable(GL_LIGHTING);
        glColor3d(0.1,0.1,0.4);
     
        shapesPrintf (1, 3, "Shape PgUp PgDn: %s");
        shapesPrintf (2, 3, " Slices +-: %d   Stacks <>: %d", slices, stacks);
        shapesPrintf (3, 3, " nSides +-: %d   nRings <>: %d", slices, stacks);
        shapesPrintf (4, 3, " Depth  (): %d", depth);
        shapesPrintf (5, 3, " Outer radius  Up  Down : %f", orad);
        shapesPrintf (6, 3, " Inner radius Left Right: %f", irad);
    }
     
     
    const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
     
    const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat high_shininess[] = { 100.0f };
     
    /* Program entry point */
     
    int
    main(int argc, char *argv[])
    {
     
        glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
        glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
        glLightfv(GL_LIGHT0, GL_POSITION, light_position);
     
        glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
     
     
        return EXIT_SUCCESS;
    }

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est pourtant précisément ce que tu as codé. Regarde ton main().

    Tu définis la lumière et le matériau actuel.
    Puis tu retournes, sans jamais avoir dessiné.

    le main opengl classique ressemblera à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int main() {
        //ouverture de la fenetre ou du plein écran (glut?)
     
        //configuration initiale
     
        //une boucle infinie ou presque
        while(!pas_fini) {
            //traiter événements souris/clavier/réseau?
            //dessiner
        }
     
        //à la place, de la boucle, si tu utilise glut, tu auras
        //glut_mainloop(fonction_a_utiliser_a_chaque_pas_de_la_boucle);
     
        return 0;
    }
    La logique est toujours la même dans une appli 3D (ou graphique en général):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    initialisation données
    initialisation graphique
    tant que pas fini {
        traiter les événements (mise à jour des données de jeu...)
        mettre à jour les données d'affichage
        échanger les buffers (si double/triple buffering)
    }
    Dans le temps, j'avais codé une application dont tu peux un peu t'inspirer.
    autoscene (sur sourceforge) permet de visualiser des modeles 3D au format obj et de tourner autour.

    Le code est vieux, mais devrait encore fonctionner.

    PS: vieux ... dans le temps ... vieillirai-je?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Points : 38
    Points
    38
    Par défaut Pour le triangle et le carre ca fonctionne exemple donner
    Gros Merci pour ton temps

    mais Le temps passe vite ...

    voici le code pour le triangle et du carre
    je ne comprend pas tout mais je me debrouille un peu mais pour le cube je suis bloque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
    void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
    void DisableOpenGL(HWND, HDC, HGLRC);
    
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
        WNDCLASSEX wcex;
        HWND hwnd;
        HDC hDC;
        HGLRC hRC;
        MSG msg;
        BOOL bQuit = FALSE;
        float theta = 0.0f;
    
        /* register window class */
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style = CS_OWNDC;
        wcex.lpfnWndProc = WindowProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInstance;
        wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wcex.lpszMenuName = NULL;
        wcex.lpszClassName = "GLSample";
        wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);;
    
    
        if (!RegisterClassEx(&wcex))
            return 0;
    
        /* create main window */
        hwnd = CreateWindowEx(0,
                              "GLSample",
                              "OpenGL Sample",
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              256,
                              256,
                              NULL,
                              NULL,
                              hInstance,
                              NULL);
    
        ShowWindow(hwnd, nCmdShow);
    
        /* enable OpenGL for the window */
        EnableOpenGL(hwnd, &hDC, &hRC);
    
        /* program main loop */
        while (!bQuit)
        {
            /* check for messages */
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                /* handle or dispatch messages */
                if (msg.message == WM_QUIT)
                {
                    bQuit = TRUE;
                }
                else
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }
            else
            {
                /* OpenGL animation code goes here */
    
                glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
                glClear(GL_COLOR_BUFFER_BIT);
                glPushMatrix();
    
                
     glBegin(GL_QUADS);
                   glNormal3f( 0.0f, 0.0f,-1.0f);
                   glTexCoord2f(0, 0); glVertex3f(-0.5f,-0.5f,-0.5f);
                   glTexCoord2f(1, 0); glVertex3f(-0.5f, 0.5f,-0.5f);
                   glTexCoord2f(1, 1); glVertex3f( 0.5f, 0.5f,-0.5f);
                   glTexCoord2f(0, 1); glVertex3f( 0.5f,-0.5f,-0.5f);
                glEnd();          
      
    /*            glBegin(GL_TRIANGLES);
    
                    glColor3f(1.0f, 0.0f, 0.0f);   glVertex2f(0.0f,   1.0f);
                    glColor3f(0.0f, 1.0f, 0.0f);   glVertex2f(0.87f,  -0.5f);
                    glColor3f(0.0f, 0.0f, 1.0f);   glVertex2f(-0.87f, -0.5f);
    
                glEnd();*/
    
    
                glPopMatrix();
    
                SwapBuffers(hDC);
    
                theta += 1.0f;
                Sleep (1);
            }
        }
    
        /* shutdown OpenGL */
        DisableOpenGL(hwnd, hDC, hRC);
    
        /* destroy the window explicitly */
        DestroyWindow(hwnd);
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
            case WM_CLOSE:
                PostQuitMessage(0);
            break;
    
            case WM_DESTROY:
                return 0;
    
            case WM_KEYDOWN:
            {
                switch (wParam)
                {
                    case VK_ESCAPE:
                        PostQuitMessage(0);
                    break;
                }
            }
            break;
    
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
    
        return 0;
    }
    
    void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC)
    {
        PIXELFORMATDESCRIPTOR pfd;
    
        int iFormat;
    
        /* get the device context (DC) */
        *hDC = GetDC(hwnd);
    
        /* set the pixel format for the DC */
        ZeroMemory(&pfd, sizeof(pfd));
    
        pfd.nSize = sizeof(pfd);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW |
                      PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 16;
        pfd.iLayerType = PFD_MAIN_PLANE;
    
        iFormat = ChoosePixelFormat(*hDC, &pfd);
    
        SetPixelFormat(*hDC, iFormat, &pfd);
    
        /* create and enable the render context (RC) */
        *hRC = wglCreateContext(*hDC);
    
        wglMakeCurrent(*hDC, *hRC);
    }
    
    void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)
    {
        wglMakeCurrent(NULL, NULL);
        wglDeleteContext(hRC);
        ReleaseDC(hwnd, hDC);
    }
    est-ce une bonne exemple :
    comment ajout le cube maintenant je ne sais pas...et je suis un peu perdu

    un gros merci pour le temps...

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    à coup de glBegin(), glEnd(), il faut dessiner le cube triangle par triangle ou quad par quad.

    Il faut te référer à un cours dédié. essaie dans les forums 3D ou jeux.

    Cela n'a cependant pas un grand intérêt, parce que dans de vraies applications, les modèles 3D ne sont pas codés en dur, mais lus dans des fichiers, et stockés/dessiner via des vertex buffer object (VBO) ou leurs successeurs actuels.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Affichage d'un texte avec OpenGL
    Par kripteks dans le forum OpenGL
    Réponses: 13
    Dernier message: 30/03/2013, 18h57
  2. Affichage d'image avec OpenGL
    Par nonolerobot77 dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/02/2008, 15h58
  3. Réponses: 8
    Dernier message: 23/07/2007, 19h44
  4. [DX9][C#] Affichage cube avec vertex buffer
    Par lancer83 dans le forum DirectX
    Réponses: 43
    Dernier message: 30/06/2006, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo