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

 C Discussion :

[OPENGL] problème de chargement fichier .obj


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut [OPENGL] problème de chargement fichier .obj
    Bonsoir tout le monde ,

    Je suis nouveau et j'ai déjà une questin à vous poser si vous le voulez bien
    J'ai un gros problème: en effet je souhaite faire un simple petit loader de fichiers .obj mais le problème est que mon programme ne veut pas se lancer...

    Tout d'abord voici mes différentes fonctions:
    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
     char character[100];
     
    int linereadvertex;
    int linereadtexcoord;
    int linereadordervertex;
    int linereadordertexcoord;
     
    int lineobjvertex;
    int lineobjtexcoord;
    int lineobjordervertex;
    int lineobjordertexcoord;
     
    typedef struct Vertexs {
         GLfloat x;
    	 GLfloat y;
    	 GLfloat z;
    }
    Vertexs;
     
    typedef struct orderVertexs {
         int v1;
    	 int v2;
    	 int v3;
    	 int v4;
    }
    orderVertexs;
     
    typedef struct Texcoords {
         float x;
    	 float y;
    }
    Texcoords;
     
    typedef struct orderTexcoords {
         int t1;
    	 int t2;
    	 int t3;
    	 int t4;
    }
    orderTexcoords;
     
    typedef struct ModelObj {
         Vertexs*vertex;
    	 orderVertexs*ordervertex;
    	 Texcoords*texcoord;
    	 orderTexcoords*ordertexcoord;
    }
    ModelObj;
    ModelObj modelobj;
     
    void readvertexobj(char*filename) {//on calcule le nombre de vertex... contenu dans le fichier .obj
    	 FILE*obj = NULL;
    	 obj = fopen(filename, "r");
    	 linereadvertex = 0;
    	 linereadtexcoord = 0;
    	 linereadordervertex = 0;
    	 linereadordertexcoord = 0;
    	 while(fgets(character, sizeof(character), obj) != NULL) {
    	     if(character[0] == 'v' && character[1] != 't') {
    		     linereadvertex++;
    		 }
    		 else if(character[0] == 'v' && character[1] == 't') {
    		     linereadtexcoord++;
    		 }
    		 else if(character[0] == 'f') {
    		     linereadordervertex++;
    			 linereadordertexcoord++;
    		 }
    	 }
    	 fclose(obj);
    }
     
    void loadobj(char*filename, int modeloadobj) {
            readvertexobj("./data/cube.obj");
    	 FILE*obj = NULL;
     
    	 lineobjvertex = 1;
    	 lineobjtexcoord = 1;
    	 lineobjordervertex = 1;
    	 lineobjordertexcoord = 1;
    	 linereadordertexcoord = 1;
     
    	 obj = fopen(filename, "r");
     
    	 modelobj.vertex = (Vertexs*)malloc(sizeof(Vertexs)*linereadvertex);//on alloue assez de mémoire afin de contenir tous les vertex du fichier
    	 modelobj.texcoord = (Texcoords*)malloc(sizeof(Texcoords)*linereadtexcoord);
    	 modelobj.ordervertex = (orderVertexs*)malloc(sizeof(orderVertexs)*linereadordervertex);
    	 modelobj.ordertexcoord = (orderTexcoords*)malloc(sizeof(orderTexcoords)*linereadordertexcoord);
     
    	 if(modelobj.vertex == NULL) exit(0);
    	 if(modelobj.texcoord == NULL) exit(0);
    	 if(modelobj.ordervertex == NULL) exit(0);
    	 if(modelobj.ordertexcoord == NULL) exit(0);
     
    	 if(obj > 0) {
    	     while(fgets(character, 100, obj) != NULL) {
    		     if(modeloadobj == 0) {//mode du fichier .obj "normal" à charger c'est-à-dire dépourvu de coordonnées de texture 
    	             if(character[0] == 'v') {
    		             sscanf(character+2, "%f %f %f", &modelobj.vertex[lineobjvertex].x, &modelobj.vertex[lineobjvertex].y, &modelobj.vertex[lineobjvertex].z);//on stocke les différents valeur en x, y et z du vertex
    			         lineobjvertex++;
    		         }
    		         else if(character[0] == 'f') {
    		             sscanf(character+2, "%d %d %d %d", &modelobj.ordervertex[lineobjordervertex].v1, &modelobj.ordervertex[lineobjordervertex].v2, &modelobj.ordervertex[lineobjordervertex].v3, &modelobj.ordervertex[lineobjordervertex].v4);
    			         lineobjordervertex++;
    			         lineobjordertexcoord++;
    		         }
    			 }
    		     else if(modeloadobj == 1) {//mode du fichier .obj "pluspoussé" à charger c'est-à-dire avec les coordonnées de texture 
    	             if((character[0] == 'v') && (character[1] != 't')) {
    		             sscanf(character+2, "%f %f %f", &modelobj.vertex[lineobjvertex].x, &modelobj.vertex[lineobjvertex].y, &modelobj.vertex[lineobjvertex].z);
    			         lineobjvertex++;
    		         }
    			     else if((character[0] == 'v') && (character[1] == 't')) {
    			         sscanf(character+3, "%f %f", &modelobj.texcoord[lineobjtexcoord].x, &modelobj.texcoord[lineobjtexcoord].y);
    				     lineobjtexcoord++;
    			     }
    		         else if(character[0] == 'f') {
    		             sscanf(character+2, "%d/%d %d/%d %d/%d %d/%d", &modelobj.ordervertex[lineobjordervertex].v1, &modelobj.ordertexcoord[lineobjordertexcoord].t1, &modelobj.ordervertex[lineobjordervertex].v2, &modelobj.ordertexcoord[lineobjordertexcoord].t2, &modelobj.ordervertex[lineobjordervertex].v3, &modelobj.ordertexcoord[lineobjordertexcoord].t3, &modelobj.ordervertex[lineobjordervertex].v4, &modelobj.ordertexcoord[lineobjordertexcoord].t4);
    			         lineobjordervertex++;
    		         }
    			 }
    	     }
    	 }
    	 else exit(0);
     
    	 fclose(obj);
    }
    Voici le début de ma fonction principale avec l'affichage de l'objet à partir du fichier .obj :
    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
     
    int main(int argc, char **argv) 
    {  
      glutInit(&argc, argv);  
      glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);  
      glutInitWindowSize(480, 272); // @@@
     
      int window = glutCreateWindow("pspflashsystem");
      glutInitWindowPosition(0, 0); 
     
     
      GLfloat angle = 0.0f;
     
      GLfloat vitesse = 0.0f;
     
     
      glGenTextures(5, texture);//on vrée 5 textures en prenant leur id
      loadJpegImage("data/cube2.jpg", texture[0]);  
      loadJpegImage("data/cube.jpg", texture[1]);
     
      int i;
      int j;
      int k;
     
      loadobj("./data/cube.obj", 0);
      float anglepi = 0.0f;
     
      FILE*debug = NULL;
      debug = fopen("./data/debug.txt", "w");
     
      while(1) {	 
     
    	 glEnable(GL_TEXTURE_2D);
    	 glEnable(GL_DEPTH_TEST);//pour autoriser le Z-Buffer
    	 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//on nettoie l'écran et le Z-Buffer (==depth buffer)
     
    	 glMatrixMode(GL_PROJECTION);
    	 glLoadIdentity();
    	 gluPerspective(55, 480/272, 0.1, 1000);
    	 glMatrixMode(GL_MODELVIEW);
    	 glLoadIdentity();
    	 gluLookAt(0.0f, 25.0f, 30.0f, 0.0f, 10.0f, 0.0f, 0.0f, 1.0f, 0.0f); 
     
    	 anglepi+=0.75f; 
    //affichage de l'objet
    	 for(i=0; i<lineobjordervertex; i++) {
    	     glPushMatrix();
    		 glTranslatef(0.0f, 15.0f, 19.0f);
    		 glRotatef(anglepi, 1.0f, 1.0f, 1.0f);
    		 //glBindTexture(GL_TEXTURE_2D, texture[0]);
    		 glColor3ub(255, 255, 255);
    		 glBegin(GL_QUADS);
    		 glVertex3f(modelobj.vertex[modelobj.ordervertex[i].v1].x, modelobj.vertex[modelobj.ordervertex[i].v1].y, modelobj.vertex[modelobj.ordervertex[i].v1].z);
    		 glVertex3f(modelobj.vertex[modelobj.ordervertex[i].v2].x, modelobj.vertex[modelobj.ordervertex[i].v2].y, modelobj.vertex[modelobj.ordervertex[i].v2].z);
    		  glVertex3f(modelobj.vertex[modelobj.ordervertex[i].v3].x, modelobj.vertex[modelobj.ordervertex[i].v3].y, modelobj.vertex[modelobj.ordervertex[i].v3].z);
    		 glVertex3f(modelobj.vertex[modelobj.ordervertex[i].v4].x, modelobj.vertex[modelobj.ordervertex[i].v4].y, modelobj.vertex[modelobj.ordervertex[i].v4].z); 
    		 glEnd();
    		 glPopMatrix();
    	 }
    Sinon j'ai constaté que san la boucle for en affichant un à un les vertex (donc plus long) l'objet apparait et le programme fonctionne sans problème donc je pense que cela doit venir de la boucle mais je ne sais pas comment le résoudre si vous pouviez m'aider (ça fait tout une demi-journée que j'essaye de le résoudre non stop et je ne trouve pas la solution )

    Merci encore en vous souhaitant une bonne nuit bien sûr

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 163
    Billets dans le blog
    153
    Par défaut
    Bonjour , j'ai pas tout décripter à fond,

    mais si cela vient du for, et que cela ne s'affiche pas, c'est que la variable "lineobjordervertex" n'a pas la taille que tu pense ( j'ai pas trouver son initialiation )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    Son initialisation est au début du code que j'ai mis dans mon message précédent et est utilisé dans la fonction loadobj
    Merci encore

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 163
    Billets dans le blog
    153
    Par défaut
    Je présume que tu as toujours le même problême, tu peux essayer de lancer dans un debuggeur , ou rajouter des lignes pour savoir ou passe le programme ( std::cout<<"À fais cela" << std::endl )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    Oui merci cela m'a aidé à résoudre le problème merci beaucoup je passe le topic en résolu

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

Discussions similaires

  1. problème génération de fichier et chargement de page
    Par anjiniaina dans le forum Struts 1
    Réponses: 8
    Dernier message: 21/03/2007, 14h40
  2. Réponses: 2
    Dernier message: 05/03/2007, 14h21
  3. Réponses: 5
    Dernier message: 17/10/2006, 18h27
  4. Problème de chargement d'un fichier XML
    Par PANAYE Nicolas dans le forum XMLRAD
    Réponses: 4
    Dernier message: 25/08/2006, 16h17
  5. [C#] Problème chargement fichier xml dans treeview
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/06/2006, 14h10

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