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 d'affichage: une ligne apparaît toute seule


Sujet :

OpenGL

  1. #1
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut Problème d'affichage: une ligne apparaît toute seule
    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 :

    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);
    }
    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
    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;
    };
    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.
    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.

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    - est ce que c'est une des arètes de ton modèle qui part en vrille ou est ce une nouvelle arète venue par magie ?
    - Si tu n'affiche aucune arète de ton modèle, est ce que l'arète y est toujours ? Si non, c'est une de tes arètes qui a un mauvais point.

  3. #3
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par ToTo13
    Bonjour,

    - est ce que c'est une des arètes de ton modèle qui part en vrille ou est ce une nouvelle arète venue par magie ?
    - Si tu n'affiche aucune arète de ton modèle, est ce que l'arète y est toujours ? Si non, c'est une de tes arètes qui a un mauvais point.
    - C'est par magie

    - Arf, le point magique central (et aussi la ligne) n'apparait (aissent) pas quand je commente mon glDrawArrays(GL_QUADS...).
    (c'est fou comme quoi des fois je ne pense pas à faires des choses simples...)

    J'exporte probablement mal, mais je me demande bien comment ça se fait, puisque j'ai des models qui marchent...

    J'ai eu une petite idée, je l'essaye et je te tiens au courant.
    Merci beaucoup de ta réponse en tout cas

    A bientôt.

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut
    c'est normal que la tête que tu montres ne marche pas, elle n'a pas de jambes

    plus sérieusement vérifies que tu n'as pas de :
    - quad concave
    - coordonnées super grande par rapport aux autres
    - quad avec un indice de vertex en dehors de ton tableau

    et vérifies tout de même ton exporteur, si le problème est dedans tu risques de chercher des heures dans ton programme pour rien

  5. #5
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    ca resemble etrangement à un vertex avec une composant w à 0... peut être un probleme dans l'indexation du tableau ?

  6. #6
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par shenron666
    c'est normal que la tête que tu montres ne marche pas, elle n'a pas de jambes


    Citation Envoyé par shenron666
    - quad concave
    Oui quelques-uns

    Citation Envoyé par shenron666
    - coordonnées super grande par rapport aux autres
    Je vérifirais, mais je ne pense pas, car cette ligne magique est "en trop", mon model est complet à l'affichage. (il ne manque aucune face)

    Citation Envoyé par shenron666
    - quad avec un indice de vertex en dehors de ton tableau
    Déjà vérifié, ce n'est pas le cas, même si j'y ai pensé.
    Par exemple, pour deux cubes, j'obtient les valeurs suivantes :
    - 0 à 24 --> premier cube soit -> glDrawArrays(0, 24)
    - 24 à 48 --> 2nd -> glDrawArrays(24, 48)

    Les données sont normalement correctement triées dans le tableau de vertices.

    Citation Envoyé par shenron666
    et vérifies tout de même ton exporteur, si le problème est dedans tu risques de chercher des heures dans ton programme pour rien
    J'ai prévu de le modifier un peu, mais je n'ai pas encore eu le temps de le faire aujourd'hui.

    @ bafman: Je sais que je gère pas très bien mes lumières, et j'ai remarqué que c'est toujours après avoir activé le lighting (dans mon programme, touche assignée à cette fonction) que le bug apparait, de plus, les mouvements de ma lumière sont pas très bien gérés.
    A part ça, il ne me semble pas attribuer de valeur w à mes sommets, dans ce cas, faudrait-il que je fasse un tableau de nb_vertex*4 ? Et dire à glVertexPointer que j'utilise une taille de 4 pour mes sommets ?
    Quel "devrait" être la valeur de la composante w ?

    Merci de vos réponses

    A bientôt j'éspère.

    PS:
    Ah, petit détail, ça me vient à l'ésprit, une fois j'avais essayé de remplacer la valeur 48 (d'en haut, pour mes cubes) par 44 (donc une face en moins au 2eme objet) et le bug était toujours présent.

    EDIT:

    J'ai un indice interessant, après un petit essaie, ma tête sans pieds arrive à marcher ( ) quand je choisi l'option "Triangulate" lors de l'export Blender -> Obj.
    Autrement dit, aucun appel à glDrawArrays(GL_QUADS...) n'est effectué, blender m'a uniquement donné des triangles, et là ça marche.

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

Discussions similaires

  1. [AC-2000] Etat:inverser l'affichage, une ligne de D en colonne
    Par kir4000 dans le forum IHM
    Réponses: 4
    Dernier message: 07/07/2009, 11h45
  2. Désactiver une ligne (pas toutes) d’un DbGrid
    Par gilardino dans le forum Langage
    Réponses: 1
    Dernier message: 03/05/2008, 14h05
  3. Problème pour déplacer une ligne à partir d'une variable
    Par Cadenwarr dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/01/2008, 12h12
  4. detecter une ligne a un seul mot dans un fichier txt
    Par malikoo dans le forum Général Python
    Réponses: 9
    Dernier message: 04/07/2007, 19h43
  5. [datagrid] problème lorsque modifie une ligne
    Par shirya dans le forum ASP.NET
    Réponses: 1
    Dernier message: 26/02/2007, 16h06

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