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 sur un loader


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 sur un loader
    Bonjour,

    Voila je poste ce mail car j ai un souci avec un loader (.obj -> delphi) que je veux creer.
    En effet, jai un souci avec mes tableaux de vertices et de face, quand je lis mes fichiers, les tableux ne se remplissent pas avec les coordonnes mais ils se remplissent avec la valeurs nulle

    Ci joint le code de mon loader, j' ai indiquer par des commentaires la ou se situe le probleme ( d'apres moi ).

    Est ce que cela est du a que mes tableaux soient passes en variable? Faut il faire un enregistrement?

    Merci d'avance pr vos reponses, Bonne apres midi
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    bonjour, attache moi un fichier .obj afin de bien tracer ton code

  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
    Je t'envoie un .obj classique, il s'agit du singe de Blender.
    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
    j'ai fait un LoadOBJ.pas dans un de mes vieux projet 3D

    ben il fonctionne ^^Nom : monkey.png
Affichages : 55
Taille : 22,7 Ko

  5. #5
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    pas grande modification mais ça marche:

    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
    // Charge les faces et les vertex dans leurs tableaux respectifs
    function charger_models (filename : String) : boolean;
    var f: TextFile;
        S: String;
        VertexLength, FaceLength: integer;
    begin
     result := FileExists(filename);
     if result then
      begin
       AssignFile(f, filename);
       Reset(f);
       VertexLength:= 0;
       FaceLength:= 0;
       S := '';
       while not eof(f) do
        begin
         Readln(f, S);
         begin
           if S[1]= 'v' then
             begin
              Inc(VertexLength);
              SetLength(Vertex, VertexLength);
              Vertex[VertexLength- 1]:= calcul_string_vertex(S)
             end;
     
           if S[1]= 'f' then
             begin
              Inc(FaceLength);
              SetLength(Face, FaceLength);
              Face[FaceLength- 1]:= calcul_string_face(S)
             end
         end
        end;
       CloseFile(f)
      end
    end;

  6. #6
    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 beaucoup, ta solution marche!!!!!

    Et dire que j ai passer tout ce temps alors au'il me manquais juste le Vertex[VertexLength - 1]..... Saloperie de -1

    Merci encore a vous, bonne apm

  7. #7
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    ton code peut encore être optimisé, tu trouves pas?

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    A mon avis, un loadfromfile via un StringList et parcours du stringlist est plus optimisé au lieu d'une lecture ligne par ligne du fichier.
    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
     
    function charger_models (filename : String) : boolean;
    var 
        VertexLength, FaceLength, memLigne : Integer;
        memFile : TStrings;
    begin
        result := FileExists(filename);
        if result then
        begin
            memFile := TStringList.Create;
            try
                memFile.LoadFromFile(FileName);
                VertexLength:= 0;
                FaceLength:= 0;
                for memLigne := 0 to memFile.Count -1 do
                begin
                    if memFile[memLigne][1]= 'v' then
                    begin
                        Inc(VertexLength);
                        SetLength(Vertex, VertexLength);
                        Vertex[VertexLength- 1]:= calcul_string_vertex(memFile[memLigne])
                    end;
                    if memFile[memLigne][1]= 'f' then            
                    begin
                        Inc(FaceLength);
                        SetLength(Face, FaceLength);
                        Face[FaceLength- 1]:= calcul_string_face(memFile[memLigne])
                    end        
                end;
            finally
                memFile.Free;
            end;
        end;
    end;
    J'ai pas delphi sous la main mais je l'aurais codé comme cela.
    Sinon, j'aurais aussi alloué le max de mémoire possible aux deux tableaux, pour ne pas ralentir le code pendant les allocations mémoire et ensuite découper le tableau à la fin . le code peut être comme ceci :
    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
     
    function charger_models (filename : String) : boolean;
    var 
        VertexLength, FaceLength, memLigne : Integer;
        memFile : TStrings;
    begin
        result := FileExists(filename);
        if result then
        begin
            memFile := TStringList.Create;
            try
                memFile.LoadFromFile(FileName);
                VertexLength:= 0;
                FaceLength:= 0;
                setLength(Vertex,memFile.Count -1);
                SetLength(Face,memFile.Count -1);
                for memLigne := 0 to memFile.Count -1 do
                begin
                    if memFile[memLigne][1]= 'v' then
                    begin
                        Inc(VertexLength);
                        //SetLength(Vertex, VertexLength);
                        Vertex[VertexLength- 1]:= calcul_string_vertex(memFile[memLigne])
                    end;
                    if memFile[memLigne][1]= 'f' then            
                    begin
                        Inc(FaceLength);
                        //SetLength(Face, FaceLength);
                        Face[FaceLength- 1]:= calcul_string_face(memFile[memLigne])
                    end        
                end;
            finally
                SetLength(Vertex, VertexLength);
                SetLength(Face, FaceLength);
                memFile.Free;
            end;
        end;
    end;
    Non

  9. #9
    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
    pour avoir testé sur un bon nombre de .OBJ mon loader, j'ai choisi de faire une lecture en deux passes...la première permet de déterminer le nombre de points et de faces, la seconde de remplir les tableaux alloués une fois pour toute


  10. #10
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    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
     
    // Enleve les points d'une string en virgule (nouvelle variante)
    function StrConvert(S: string): Real;
    var I : Integer;
    begin
     I:= 1;
     while S[I]<> #0 do
      begin
       if S[I]='.' then
        begin
         S[I]:=',';
         Break
        end
       else
        Inc(I)
      end;
     result:= StrToFloat(S)
    end;
    // Prends les coord des Vertex a partir d'une String (nouvelle variante)
    function calcul_string_vertex(S: string ): TCoord;
    var P : Integer;
        Tmp : String;
    begin
     Delete(S, 1, 2);
     P:= Pos(' ', S); 
     Tmp:= Copy(S, 1, P- 1);
     result.X:= StrConvert(Tmp);
     Delete(S, 1, P);
     P:= Pos(' ', S);
     Tmp:= Copy(S, 1, P- 1);
     result.Y:= StrConvert(Tmp);
     Delete(S, 1, P);
     P:= Length(S); 
     Tmp:= Copy(S, 1, P);
     result.Z:= StrConvert(Tmp)
    end;
    Idem pour calcul_string_face.

    Comme le dit Andry, Je pense que passer par TStringList est la meilleure façon

  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
    ReBonjour,
    Merci a tous pour toutes vos reponses, je vous montre la version que j'ai retenu :
    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
     
    type
     
      TCoord = Record
        X, Y, Z : glDouble;
      end;
      TFace = Record
        V1, V2, V3, V4 : Integer;
      end;
     
    Var
    Vertex : Array of TCoord;
    Face : Array of Tface;
     
    implementation
    function charger_models (filename : String) : boolean;
    var
    f : TextFile;
    S : String;
    Vertexlength, FaceLength : integer;
     
    begin
     
    if FileExists(filename) = false then
      result := false
    else
    begin
    AssignFile(f, filename);
    Reset(f);
    VertexLength := 0;
    FaceLength := 0;
    S := '';
     
    while not(eof(f)) do
    begin
    Readln(f, S);
    begin
    if S[1] = 'v' then
    begin
     Inc(VertexLength);
     SetLength(Vertex, VertexLength);
     Vertex[VertexLength - 1] := calcul_string_vertex(S);
    end;
     
    if S[1] = 'f' then
    begin
      Inc(FaceLength);
      SetLength(Face, FaceLength);
      Face[Facelength - 1] := calcul_string_face(S);
    end;
     
    end;
    end;
    result := true;
    CloseFile(f);
    end;
    end;
    Cependant, j ai un gros probleme, etant etudiant en 1iere anne d'informatique, je n est pas bcp de connaissances...Et d'apres les maigres connaissances que j ai, on nous a tjr dit que pr 'enregistrer' des valeurs definitivement en memoire, il fallait les passer par adresse ( a l aide du 'var')

    Or ici, mon gros probleme est qu a la sortie de cette fonction, je voudrais que mes tableaux gardent toutes les valeurs enregistrees pdt l execution de la fonction( car actuellement, ils sont tous les 2 vides a la sortie :\)
    Comment faire? est il possible de passer des variables par adresse?

    Merci bcp de votre aide, bonne apm

  12. #12
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    salut,
    si tu ne fais pas d'opération d'affectation sur les éléments de ton tableau, ils ne changeront pas jusqu'à la fermeture de ton programme ou quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vertex := nil;
    Face := nil;
    d'ailleurs tes tableaux sont des variables globales que tu manipule directement depuis ta fonction, donc ils ne sont pas passés comme paramètre à cette dernière. on évoque pas donc l'utilisation du mot réservé var

    êtes vous sur que les tableaux se remettent a vide? avec ce code que tu propose ?

  13. #13
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    et penses plutôt à programmer en orienté objet, et d'optimiser ton code pour gagner en temps d'exécution (surtout en ce qui concerne le graphisme)

  14. #14
    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
    On n'a evoque que de tres pres le language oriente objet, je n est donc quasiment aucunes connaissances en POO :/

    Le probleme de la fonction precedente venait d une erreur de ma part dans l appel de la fonction dans le .dpr

    Sinon, j aurais un dernier petit probleme a vous soumettre ( apres c est promis j'arrete )

    Voila, j'ai coder une fonction pr l'affichage et je n arrive pas tres bien a comprendre pourquoi cela n'affiche t il rien ( il doit y avoir un probleme)

    Je suis desolé mais je commence l'openGl et j'ai un petit peu de mal a me familiariser avec ses 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
    // determine si la face contient un cube ou un triangle
    function triangle_ou_cube (Face : Array of TFace; i : integer) : integer;
    begin
    if Face[i].V3 = 0 then
      result := 3
    else
      result := 4
    end;
     
    //dessine le model dans une fenetre OpenGl
     
    procedure afficher_models ();
    var
    i,a : 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 := 1 to length(face) do
    begin
    if triangle_ou_cube(Face,i) = 3 then
    begin
    GlBegin( Gl_Triangles );
    Glcolor3f(1.0, 1.0, 1.0);
    GlVertex3d(Vertex[Face[i].V1].X, Vertex[Face[i].V1].Y, Vertex[Face[i].V1].Z);
    Glcolor3f(1.0, 1.0, 1.0);
    GlVertex3d(Vertex[Face[i].V2].X, Vertex[Face[i].V2].Y, Vertex[Face[i].V2].Z);
    Glcolor3f(1.0, 1.0, 1.0);
    GlVertex3d(Vertex[Face[i].V4].X, Vertex[Face[i].V4].Y, Vertex[Face[i].V4].Z);
    GlEnd();
    end
    else
    begin
    GlBegin( Gl_Quads );
      Glcolor3f(1.0, 1.0, 1.0);
      GlVertex3d(Vertex[Face[i].V1].X, Vertex[Face[i].V1].Y, Vertex[Face[i].V1].Z);
      Glcolor3f(1.0, 1.0, 1.0);
      GlVertex3d(Vertex[Face[i].V2].X, Vertex[Face[i].V2].Y, Vertex[Face[i].V2].Z);
      Glcolor3f(1.0, 1.0, 1.0);
      GlVertex3d(Vertex[Face[i].V3].X, Vertex[Face[i].V3].Y, Vertex[Face[i].V3].Z);
      Glcolor3f(1.0, 1.0, 1.0);
      GlVertex3d(Vertex[Face[i].V4].X, Vertex[Face[i].V4].Y, Vertex[Face[i].V4].Z);
    GlEnd();
    end;
    end;
    end;
    C est vraiment tres gentil a vous de prendre du temps pr aider les autres

    Merci d'avance, bonne fin d'apm

Discussions similaires

  1. [LG]Probleme sur l'identification de typage
    Par axelmeunier dans le forum Langage
    Réponses: 10
    Dernier message: 19/01/2004, 13h41
  2. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  3. Probleme sur le Fields des fichiers Xmlgram
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 4
    Dernier message: 20/03/2003, 17h09
  4. Probleme sur un AppendChild
    Par Toxine77 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 14/03/2003, 18h25
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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