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:
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
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); }
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
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(); })
Merci encore en vous souhaitant une bonne nuit bien sûr![]()
Partager