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

Langage Delphi Discussion :

Probleme d'affichage a partir d'un .obj


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Probleme d'affichage a partir d'un .obj
    Bonjour,

    Voila je suis en train de creer mon propre loader de .obj pour mon projet informatique et cela fait une semaine que je suis bloque
    En effet, je pense que mes fonctions de transfert des donnees du .obj vers des tableaux sont corrects mais a chaque fois que j'appel mes fonctions d affichages, celle ci n'affiche rien :/

    Voila un extrait de mes types et de ma procedure d'affichage

    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
    type
     
      TCoord = Record
        X, Y, Z : glDouble;
      end;
      TFace = Record
        V1, V2, V3, V4 : Integer;
        Vt1, Vt2, Vt3, Vt4 : Integer;
      end;
      TVt = Record
        X, Y, Z : glDouble;
      End;
     
    Var
    Vertex : Array of TCoord;
    CoordText : Array of TVt;
    Face : Array of Tface;
    Nom_Texture : string;
    Image_texture : glUint;
     
     
    procedure afficher_models ();
    var
    i : integer;
     
    begin
    //glClear(GL_COLOR_BUFFER_BIT or dGL_DEPTH_BUFFER_BIT); // nettoie la scene et le deph buffer
    //glLoadIdentity();  // recentre la vue
    for i := 0 to length(face) - 1 do
    begin
    if triangle_ou_cube(Face,i) = 3 then
    begin
    GlBegin( Gl_Triangles );
    //Glcolor3ub(255, 100, 250);
    glBindTexture(GL_TEXTURE_2D, Image_Texture);
    glTexCoord2f(CoordText[(Face[i].Vt1)].X, CoordText[(Face[i].Vt1)].Y);        //-1?
    GlVertex3d(Vertex[Face[i].V1].X, Vertex[Face[i].V1].Y, Vertex[Face[i].V1].Z);
    GlVertex3d(Vertex[Face[i].V2].X, Vertex[Face[i].V2].Y, Vertex[Face[i].V2].Z);
    GlVertex3d(Vertex[Face[i].V3].X, Vertex[Face[i].V3].Y, Vertex[Face[i].V3].Z);
    GlEnd();
    end
    else
    begin
    GlBegin( Gl_Quads );
    //  Glcolor3ub(140, 90, 180);
      glBindTexture(GL_TEXTURE_2D, Image_texture);
      glTexCoord2f(CoordText[(Face[i].Vt1)].X, CoordText[(Face[i].Vt1)].Y);
      GlVertex3d(Vertex[Face[i].V1].X, Vertex[Face[i].V1].Y, Vertex[Face[i].V1].Z);
      GlVertex3d(Vertex[Face[i].V2].X, Vertex[Face[i].V2].Y, Vertex[Face[i].V2].Z);
      GlVertex3d(Vertex[Face[i].V3].X, Vertex[Face[i].V3].Y, Vertex[Face[i].V3].Z);
      GlVertex3d(Vertex[Face[i].V4].X, Vertex[Face[i].V4].Y, Vertex[Face[i].V4].Z);
    GlEnd();
    end;
    end;
    end;]
    Je pense que le probleme viens de la fonction GlBindtexture car je n'arrive pas trop a conmprendre les parametres qu elle attend mais est ce que un probleme au niveau des textures pourrait empecher tout affichage?

    Je vous remercie pour avoir pris le temps de me lire et pour vos reponses
    Bonne fin d apres midi a tous

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Normalement si le modèle est texturé (donc avec des coordonnées de texture) il faut mettre les bonnes coordonnées de texture pour chaque Vertex, donc appeler glTexCoord avant chaque glVertex.

    Sinon pour savoir si le problème vient de glBindTexture, il faudrait l'enlever
    (et enlever aussi la ligne avec glTexCoord) et à la place mettre une couleur avec un glColor.

    Si ca n'affiche toujours rien, le problème peut venir de plein de choses (initialisation d'opengl, de la vue (camera), etc.. ) le mieux est alors de commencer par essayer d'afficher quelque chose de simple comme un triangle,
    en suivant par exemple les tutoriels de NeHe ou celui intitulé "Open GL avec Delphi" sur ce même site.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Le souci c est que cela ne peut pas venir de mon opengl, car effectivement j avais deja implementer un loader mais qui ne gerait pas les textures
    Celui ci affichait parfaitement un model 3d dans une fenetre Opengl mais sans les textures.

    Jai donc repris ce loader et ma fenetre opengl pour y implementer les textures et celui ci ne m'affiche maintenant plus rien :/
    Je pense donc que le probleme viens me ma gestion des textures...

    Je vous joint mon .pas en esperant que vous pourrez y jeter un coup d oeil

    Bonne journee a vous
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par av3k_51 Voir le message

    Je pense que le probleme viens de la fonction GlBindtexture car je n'arrive pas trop a conmprendre les parametres qu elle attend mais est ce que un probleme au niveau des textures pourrait empecher tout affichage?

    Je vous remercie pour avoir pris le temps de me lire et pour vos reponses
    Bonne fin d apres midi a tous
    pour utiliser des textures il faut les activer avec glEnable(GL_TEXTURE_2D)...inversement tu peux les désactiver avec un glDisable() du coup il est facile de savoir si c'est un pb de texture ou non.

    ceci dit tu dois donner les coordonnées de chaque point dans la texture, là tu place tous les points au même endroit (glTextCoord)...ça ne risque pas de fonctionner.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    pour utiliser des textures il faut les activer avec glEnable(GL_TEXTURE_2D)...inversement tu peux les désactiver avec un glDisable() du coup il est facile de savoir si c'est un pb de texture ou non.

    ceci dit tu dois donner les coordonnées de chaque point dans la texture, là tu place tous les points au même endroit (glTextCoord)...ça ne risque pas de fonctionner.
    Je suis desolé mais je n'ai pas compris cette phrase

    Ceci dit, je ne sais pas trop par quel miracle, maintenant mon loader fonctionne mais quand je veux par exemple afficher un cube il me donne cette forme (en haut a gauche )



    Je me demande a quoi cela peut etre du, car j ai verifie pas mal de fois tout mes enregistrements de vertex, vt et faces et ils sont corrects.
    Il reste je pense l affichage, mais ayant du mal avec ce dernier, je ne vois pas ce qui cloche.

    Merci

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par av3k_51 Voir le message
    Je suis desolé mais je n'ai pas compris cette phrase
    Paul Toth veut dire que les coordonnées dans tes glTexCoord ne sont pas bonnes.

    Ceci dit, je ne sais pas trop par quel miracle, maintenant mon loader fonctionne mais quand je veux par exemple afficher un cube il me donne cette forme (en haut a gauche )
    par rapport au code que tu avait soumis, tu as du sortir le glBindTexture de la paire glBegin/glEnd
    ...ca ne peut pas marcher sinon.



    Je me demande a quoi cela peut etre du, car j ai verifie pas mal de fois tout mes enregistrements de vertex, vt et faces et ils sont corrects.
    Il reste je pense l affichage, mais ayant du mal avec ce dernier, je ne vois pas ce qui cloche.
    les routines de lecture des fichiers .obj dans ton source ne sont pas du tout
    robustes et ne semblent pas renvoyer les bonnes valeurs dans ta structure.
    par exemple ce simple fichier .obj (un carré avec 2 triangles)
    ne se charge pas du tout correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #nom
    #
    ordi.tga //j'ai rajouté un nom de texture ici, pour etre compatible avec ta routine (mais ce n'est pas standard)
    v 0 0 0
    v 0 2 0
    v 0 2 2
    v 0 0 2
    vt 0 0
    vt 0 1
    vt 1 1
    vt 1 0
    f 0/0 1/1 2/2
    f 0/0 2/2 3/3
    pour que ca marche j'ai du :
    ajouter une troisème valeur dans les lignes vt (?)
    ajouter un espace après le f et un autre à la fin de la ligne dans les 2 dernières lignes.

    Bref : il te faut absolument revoir ces routines de lecture de lignes pour les rendre plus robustes (afin qu'elle puissent lire correctement le bête fichier obj ci dessus).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par av3k_51 Voir le message

    autre chose (Rien à voir avec le problème de chargement / opengl )

    dans ton image on voit :

    g
    gl
    glu
    glut
    glut.p
    glut.pa
    glut.pas

    il s'agit visiblement d'un bug de l'IDE delphi car c'est arrivé récemment dans un de mes projets sous D2007.

    j'ai alors du retirer chacun des fichiers obsolètes un par un.

    Cela est il déjà arrivé à quelqu'un d'autre ?

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par av3k_51 Voir le message
    Je suis desolé mais je n'ai pas compris cette phrase
    y'a deux phrases là

    1) glEnable/glDisable permet d'activer ou non les textures, que tu faces appel ou non aux fonctions glBindTexture, glTexCoord etc...

    2) pour appliquer une texture sur une surface, tu dois donner pour chaque sommet 3d (x,y,z), la position du point dans l'espace 2D de la texture (u,v)...exemple, pour un carré, tu auras les coordonnées en (0,0), (1,0), (1,1) et (0,1) ... car (u,v) est dans l'espace 0..1 en réel; 0 = bord gauche/haut 1 = bord droit/bas de la texture; et 0.5 c'est le milieu.

    L'image la plus simple est de se dire qu'on va venir étirer la texture sur la surface en mettant une punaise sur chaque sommet de la surface, les coordonnées de la punaise dans la texture sont les valeurs de (u,v) à donner
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci bien pour vos explications, j ai compris le fonctionnement des textures maintenant

    Sinon j ai un autre petit souci ( promis apres j arrete :p ) delphi me souligne une erreure etrange que je ne comprends pas :

    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
    voici mes types 
    TCoord = Record
        X, Y, Z : glDouble;
      end;
      TFace = Record
        V1, V2, V3, V4 : Integer;
        Vt1, Vt2, Vt3, Vt4 : Integer;
      end;
      TVt = Record
        X, Y, Z : glDouble;
      End;
     
      TObjet = record
        Nom_texture : string;
        Image_texture : glUint;
        Vertex : Array of TCoord;
        Coordtext : Array of TVt;
        Face : Array of Tface;
     
     
      end;
     
    Var
    TabObj : Array of Tobjet;
     
    et voici le bout de code problematique : 
    if (S[1] = 'v') and (S[2] = ' ') then
    begin
     Inc(VertexLength);
     SetLength(TObjet.Vertex, VertexLength);
     TabObj[i - 1].Vertex[VertexLength - 1] := calcul_string_vertex(S);
    delphi me souligne la ligne setlength... en me disant ' identificateur de methode attendu'
    Qu'est ce que cela veut il dire??? car il me semble avoir les bons parametres

    Desole de vous soumettre autant de questions et merci de votre patience

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par av3k_51 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     SetLength(TObjet.Vertex, VertexLength);
     TabObj[i - 1].Vertex[VertexLength - 1] := calcul_string_vertex(S);
    delphi me souligne la ligne setlength... en me disant ' identificateur de methode attendu'
    c'est pas plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SetLength(TabObj[i - 1].Vertex, VertexLength);
    qu'il faudrait ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci c'etait effectivement la bonne solution

Discussions similaires

  1. [AC-2010] Probleme affichage état à partir d'un formulaire
    Par kerneispa dans le forum IHM
    Réponses: 0
    Dernier message: 24/06/2013, 12h48
  2. [Smarty] probleme d'affichage de variables à partir du header
    Par taggik-majin dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 17/10/2011, 10h34
  3. Probleme d'affichage d'une forme a partir d'un menu
    Par tipa42 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/11/2010, 02h38
  4. [Probleme Java3d] Probleme d'affichage d'un objet 3D .obj
    Par Djinner² dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 04/01/2010, 17h55
  5. probleme d'affichage à partir de BD
    Par twister9458 dans le forum JDBC
    Réponses: 5
    Dernier message: 08/02/2009, 15h05

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