Bonsoir,
J'ai un problème assé curieux avec OpenGL (?), je l'ai rencontré il y a deux jours maintenant, et je n'ai toujours pas réussi à la résoudre.
J'ai créé un petit viewer de fichier 3d binaires, que j'ai moi-même créé à partir de fichiers .obj. (générés avec le script d'export wavefront de Blender 2.42) Autrement dit, j'ai créé un convertisseur.
Il n'est pas encore très oppérationnel, mais je ne pense pas que celà ai un rapport avec mon problème.
Je vous ai fais quelques screens de mon programme, affichant un model qu'un ami m'a créé dans Blender, exporté en obj puis converti dans mon format.
http://img280.imageshack.us/img280/866/scr1es7.png
Ici, tout est normal.
J'affiche le model en mode filaire, sans back face culling et avec de la lumière.
En fait mon bug est plus ou moins "aléatoire", dès fois il y est, dès fois non, et quand il y est, il existe sous plusieurs formes.
En voici une :
http://img253.imageshack.us/img253/9608/scr2lf1.png
Je n'ai fais que relancer l'application, appuyer sur quelques touches auxquelles j'ai atribué des actions ( changer le mode de dessin des polygones, lumière...) et cette barre est apparue.
Je dessine en mode filaire car faces pleines elle n'apparait pas. (sauf certains cas avec exportation de plusieurs objets, je détaillerai s'il le faut)
Voici encore une autre façon qu'il a de se présenter :
http://img253.imageshack.us/img253/9991/scr3nd6.png
Sympatique la barre verticale![]()
Bon, un peu de code maintenant.
Voici la fonction que j'utilise pour rendre mon model :
Voici les structures utilisées :
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 void Render(M3D scene) { unsigned int i=0; glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); for(i=0; i<scene.n_objects; i++) { if(scene.objs[i].matid != -1) { glMaterialfv(GL_FRONT, GL_AMBIENT, scene.mats[scene.objs[i].matid].ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, scene.mats[scene.objs[i].matid].diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, scene.mats[scene.objs[i].matid].specular); glMaterialf(GL_FRONT, GL_SHININESS, scene.mats[scene.objs[i].matid].shininess); if(scene.mats[scene.objs[i].matid].tex != 0) { glEnable(GL_TEXTURE_2D); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindTexture(GL_TEXTURE_2D, scene.mats[scene.objs[i].matid].tex); } else { glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); } } if(scene.objs[i].c_lines > scene.objs[i].primcount) glDrawArrays(GL_LINES, scene.objs[i].primcount, scene.objs[i].c_lines); if(scene.objs[i].c_triangles > scene.objs[i].c_lines) glDrawArrays(GL_TRIANGLES, scene.objs[i].c_lines, scene.objs[i].c_triangles); if(scene.objs[i].c_quads > scene.objs[i].c_triangles) glDrawArrays(GL_QUADS, scene.objs[i].c_triangles, scene.objs[i].c_quads); } glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); }
Dans un premier temps je ne vais pas vous demander d'éplucher tout mon code, je veux d'abord savoir si le type d'erreur que j'obtient est "courante" ou déjà vu, et si ça correspond à une erreur de déclaration dans le 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 typedef struct mat MAT; struct mat{ float ambient[4]; float diffuse[4]; float specular[4]; float shininess; char *texfile; /* Fichier de texture */ unsigned int /* GLuint */ tex; }; typedef struct obj3d OBJ; struct obj3d{ unsigned long primcount; unsigned long c_lines; unsigned long c_triangles; unsigned long c_quads; int use_texture; /* Booléen */ unsigned int matid; /* Identifiant du materiau qui appartient à cet objet (servira dans un tableau) */ }; typedef struct m3d M3D; struct m3d{ unsigned long intersize; /* Taille du tableau ci-dessous */ float* interwined; /* Tableau entrelacé de sommets, coordonnées de textures et normales */ unsigned int n_materials; /* Nombre de materiaux */ unsigned int n_objects; /* Nombre d'objets */ MAT* mats; /* Materiaux */ OBJ* objs; /* Objets */ int use_texture; };
J'ai vérifié les données que j'envoie à OpenGL, elles sont correcte.
J'ai pu le vérifier simplement car mon bug part toujours du point 0,0,0. (en mode de dessin des polygones en point, je le remarque, grâce à ma caméra qui tourne autour de ces coordonnées par défaut)
Il existe des models qui n'ont pas ce bug, la seul différence entre ces derniers et celui que je vous ai montré plus haut, est la présence d'un materiau (glMaterial) dans ceux qui bugs.
Sans-doute que j'exporte mal
Je sais que certains trucs ne sont pas tout à fait oppérationnels, mais normalement la géométrie ça va.
Ah, autre détail, la longueur (et parfois même l'orientation) de cette (ces) barre(s) est relative à la position de ma caméra.. oO
Voilà, si vous avez quelques idées de solution avec les indices que je vous ai donné, n'hésitez pas
Si par la suite je ne trouve toujours pas le problème de mon programme, (et vous non plus) j'essayerai de vous procurer un code source complet et un peu portable, enfin, uniquement si vous aurez encore le courage de chercher la solution![]()
Dites-moi si vous voulez des infos supplémentaires.
Merci aux lecteurs de ce sujet.
Bonne soirée.
Partager