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 :

Problème affichage cube (loader .obj)


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut Problème affichage cube (loader .obj)
    Bonjour,

    Si quelqu'un pouvait m'aider ça serait sympa?
    Avec ce loader de modèle 3D .obj, mon dessin s'affiche mais là au lieu d'avoir un cube tout simple, j'ai un triangle à 4 côtés

    J'ai essayé dans "afficher objet", de mettre dans tous les "glVertex3f" -1, du fait que dans les .obj, les vertex commence à partir de 1 alors qu'en programmation les tableaux commence à 0 et ça ne marche pas mon cube est toujours déformé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glVertex3f(vertices[ faces[i].a-1 ].x
    Voici mon code :

    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
     
    #include "CObjet3D.h"
    #include <GL/gl.h>
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    void Cobjet3D::ChargerObjet(char *fichier)
    {
        // on ouvre le fichier
        ifstream FichierSource(fichier);
     
        // on vérifie s'il est bien ouvert
        if(!FichierSource)
            cout << "Erreur: fichier introuvable" << endl;
        else
        {
            // on lit dans le fichier le nombre de points puis de faces
            FichierSource >> NbVertex
                          >> NbFaces;
     
            // on définit l'espace mémoire necessaire au stockage des points
            vertices = new VERTEX[NbVertex];
            // on stocke les points en mémoire
            for(unsigned int i=0; i<NbVertex; i++) // pour chaque point
            {
                FichierSource >> vertices[i].x // lecture de la coordonnée x
                              >> vertices[i].y // de la coordonnée y
                              >> vertices[i].z; // et de la coordonnée z
            }
     
            // on définit l'espace mémoire necessaire au stockage des faces
            faces = new FACE[NbFaces];
            // on stocke les faces en mémoire
            for(unsigned int i=0; i<NbFaces; i++) // pour chaque face
            {
                FichierSource >> faces[i].a // lecture du point a
                              >> faces[i].b // du point b
                              >> faces[i].c; // et du point c
            }
     
            FichierSource.close(); // on ferme le fichier
        }
    }
     
    void Cobjet3D::AfficherObjet()
    {
            glPushMatrix();
                    glBegin(GL_TRIANGLES);
                    for(unsigned int i=0; i<NbFaces; i++)
                    {
                            glColor3ub(255, 100, 0);
     
                            glVertex3f(vertices[ faces[i].a ].x,
                                           vertices[ faces[i].a ].y,
                                       vertices[ faces[i].a ].z);
                            glVertex3f(vertices[ faces[i].b ].x,
                                           vertices[ faces[i].b ].y,
                                       vertices[ faces[i].b ].z);
                            glVertex3f(vertices[ faces[i].c ].x,
                                           vertices[ faces[i].c ].y,
                                       vertices[ faces[i].c ].z);
                }
            glEnd();
            glPopMatrix();
    }
     
    void Cobjet3D::LibereObjet()
    {
            if(vertices)
        {
            delete [] vertices;
            vertices = NULL;
        }
     
            if(faces)
        {
            delete [] faces;
            faces = NULL;
        }
    }
    Et le modèle 3D :

    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
     
    8
    12
     
      -10.1 -7.2 0.0
      -7.3 -7.2 0.0
      -10.1 -4.4 0.0
      -7.3 -4.4 0.0
      -10.1 -7.2 2.8
      -7.3 -7.2 2.8
      -10.1 -4.4 2.8
      -7.3 -4.4 2.8
     
     
     1 3 4
     4 2 1
     5 6 8
     8 7 5
     1 2 6
     6 5 1
     2 4 8
     8 6 2
     4 3 7
     7 8 4
     3 1 5
     5 7 3
    Merci,

  2. #2
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Bonsoir,

    Effectivement, il faut diminuer la valeur des indices de 1.


    Sinon, voici mes modifications pour que le code fonctionne:
    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
     
    struct vertex
    {
    	float x,y,z;
    };
     
    struct face
    {
    	unsigned int a,b,c;
    };
     
    vector<vertex>v;
    vector<face>f;
     
    string  ligne, mot;
     
    void ChargerObjet(char *fichier)
    {
     
        // on ouvre le fichier
        ifstream FichierSource(fichier);
     
        // on vérifie s'il est bien ouvert
        if(!FichierSource)
        cout << "Erreur: fichier introuvable" << endl;
        else
        {
               // pour chaque ligne
               while ( getline(FichierSource,ligne) )
                {
     
                    istringstream iss( ligne );
     
                    // pour chaque mot dans la ligne
                    while ( iss>>mot )
                    {
    			if ( mot == "v" )
    			{
    				vertex v_temp;
    				iss>>v_temp.x>>v_temp.y>>v_temp.z;
    				v.push_back( v_temp );
    			}
     
    			if ( mot == "f" )
    			{
    				face f_temp;
    				iss>>f_temp.a>>f_temp.b>>f_temp.c;
    				f.push_back( f_temp );
    			}
    		}
    	}
            FichierSource.close(); // on ferme le fichier
        }
     
    }
    Un cube:
    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
     
    v -10.1 -7.2 0.0
    v -7.3 -7.2 0.0
    v  -10.1 -4.4 0.0
    v  -7.3 -4.4 0.0
    v  -10.1 -7.2 2.8
    v  -7.3 -7.2 2.8
    v  -10.1 -4.4 2.8
    v -7.3 -4.4 2.8
     
     
    f 1 3 4
    f 4 2 1
    f 5 6 8
    f 8 7 5
    f 1 2 6
    f 6 5 1
    f 2 4 8
    f 8 6 2
    f 4 3 7
    f 7 8 4
    f 3 1 5
    f 5 7 3
    Et pour l'affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            glBegin(GL_TRIANGLES);
            for(unsigned int i=0; i < f.size(); ++i)
            {
            	glVertex3f(v[ f[i].a-1 ].x, v[ f[i].a-1 ].y, v[ f[i].a-1 ].z);
                glVertex3f(v[ f[i].b-1 ].x, v[ f[i].b-1 ].y, v[ f[i].b-1 ].z);
                glVertex3f(v[ f[i].c-1 ].x, v[ f[i].c-1 ].y, v[ f[i].c-1 ].z);
            }
            glEnd();

  3. #3
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    merci de m'avoir répondu!
    Je te dirais de ce qu'il en est dans la semaine, car en ce moment j'ai pas mal de boulot.
    Il y a juste un truc que je n'ai pas compris c'est ça :

    vector<vertex>v;

    vector<face>f;

    Si tu pouvais me l'expliquer, ça serait sympa.

    Merci,

  4. #4
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    La classe vector est une classe de la librairie c++ standard.
    Elle te permet d'éviter de passer par des (type *) pour faire des tableaux et gère toute seule la mémoire ( adieu malloc, realloc :p )

    Pour t'en servir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // include
    #include <vector>
     
    // Déclaration
    std::vector <type> monTableau;
     
    // Ajout d'un élement en queue du tableau
    type maVar;
    monTableau.push_back(maVar);
    Bref, regarde la doc sur le net, c'est plutot pratique à utiliser

  5. #5
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    ah cool merci!
    Je comprend mieux maintenant!

    Merci à tous les deux, je vous tiens au courant pour la suite.

    Bonne soirée,

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    Bonsoir,

    Voilà j'ai tout rectifié mais le compilateur me donne cette erreur pour les 3 lignes de "GlVertex3f", savez pourquoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cobjet3D.cpp:84: warning: passing `float' for converting 1 of `typename _Alloc::reference std::vector<_Tp, _Alloc>::operator[](size_t) [with _Tp = VERTEX, _Alloc = std::allocator<VERTEX>]'
    Je pensais que c'était le fait que le compilateur attende autre chose qu'un float, mais je ne suis pas sûr?!

    Merci,

  7. #7
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Si tu as déclaré ton vector comme un vector de VERTEX , tu es obligé de mettre des VERTEX dedans !

    Si tu veux un vector de float déclare le comme ça :

    vector <float> monVector;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008] Problème affichage attribut table de fait dans un cube
    Par cana13 dans le forum SSAS
    Réponses: 6
    Dernier message: 01/04/2013, 12h50
  2. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  3. Problème affichage primitive
    Par goutbouyo dans le forum DirectX
    Réponses: 4
    Dernier message: 29/12/2004, 18h25
  4. [Plugin][VE] Problème affichage
    Par sebb84 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/07/2004, 14h50
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 13h31

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