Partage
  • Partager sur Facebook
  • Partager sur Twitter

[opengl] creer un importeur de fichier OBJ

    5 juin 2008 à 16:23:16

    Salut,
    je suis entrain de monter mon propre moteur graphique (tres basique), et j'en ai marre des cubes et des quadriques :p ! alors je veux creer un importeur de fichier .obj, par exemple, comment transformer ce fichier en commandes opengl:
    # Blender3D v245 OBJ File: untitled.blend
    # www.blender3d.org
    mtllib untitled.mtl
    o Cube
    v 1.444239 1.209038 -1.000000
    v 1.444239 1.209038 1.000000
    v -0.555761 1.209038 1.021403
    v -0.555760 1.209038 -1.000000
    v 2.711393 3.209038 -1.000000
    v 1.444239 3.209038 1.000000
    v -0.555761 3.209038 -0.346642
    v -0.555761 3.209038 -2.593772
    v 0.487216 1.896998 -7.640335
    v 0.609822 1.795522 -9.857322
    v 0.732951 1.669044 -7.840065
    v 0.851871 1.522424 -7.892885
    v 0.962012 1.361296 -7.911219
    v 1.059141 1.191852 -7.894361
    v 1.139526 1.020604 -7.842962
    v 1.200078 0.854133 -7.758995
    v 1.238469 0.698836 -7.645688
    v 1.253224 0.560682 -7.507394
    v 1.243776 0.444979 -9.519156
    v 1.210489 0.356175 -7.177862
    v 1.154641 0.297681 -6.999287
    v 1.078379 0.271745 -6.820567
    v 0.984633 0.279365 -6.648570
    v 0.877006 0.320246 -6.489905
    v 0.759634 0.392820 -6.350670
    v 0.637028 0.494295 -6.236215
    v 0.513899 0.620774 -6.150939
    v 0.394979 0.767395 -6.098120
    v 0.284838 0.928523 -6.079786
    v 0.187709 1.097967 -6.096643
    v 0.107324 1.269214 -6.148043
    v 0.046773 1.435685 -6.232010
    v 0.008382 1.590982 -6.345318
    v -0.006373 1.729136 -6.483611
    v 0.003074 1.844838 -6.641577
    v 0.036362 1.933643 -6.813144
    v 0.092210 1.992137 -6.991718
    v 0.168472 2.018073 -7.170439
    v 0.262218 2.010453 -7.342436
    v 0.369845 1.969570 -7.501101
    v 2.040495 2.867320 -6.836720
    v 2.163102 2.765844 -6.951174
    v 2.286231 2.639365 -7.036449
    v 2.405151 2.492745 -7.089269
    v 2.515292 2.331616 -7.107602
    v 2.612421 2.162173 -7.090745
    v 2.692806 1.990925 -7.039346
    v 2.753357 3.263327 -6.955379
    v 2.791747 1.669159 -6.842071
    v 2.806503 1.531005 -6.703778
    v 2.797055 1.415303 -6.545813
    v 2.763768 1.326498 -6.374246
    v 2.707920 1.268004 -6.195672
    v 2.631658 1.242068 -6.016953
    v 2.537913 1.249687 -5.844955
    v 4.695984 1.290568 -5.686290
    v 2.312915 1.363141 -5.547055
    v 2.190309 1.464616 -5.432600
    v 2.067180 1.591094 -5.347324
    v 1.948261 1.737714 -5.294505
    v 1.838120 1.898841 -5.276170
    v 1.740990 2.068285 -5.293025
    v 1.660605 3.740005 -5.344424
    v 1.600053 2.406003 -5.428391
    v 1.561661 2.561299 -5.541697
    v 1.546905 2.699454 -5.679989
    v 1.556352 2.815157 -5.837954
    v 1.589638 2.903963 -6.009520
    v 1.645485 2.962458 -6.188094
    v 1.721747 2.988395 -6.366814
    v 1.815492 2.980777 -6.538811
    v 1.923118 2.939896 -6.697476
    v 0.623425 1.144909 -6.995502
    v 2.176704 2.115232 -6.191886
    usemtl Material
    s off
    f 1 2 3 4
    f 5 8 7 6
    f 1 5 6 2
    f 2 6 7 3
    f 3 7 8 4
    f 5 1 4 8
    f 73 9 10
    f 74 42 41
    f 73 10 11
    f 74 43 42
    f 73 11 12
    f 74 44 43
    f 73 12 13
    f 74 45 44
    f 73 13 14
    f 74 46 45
    f 73 14 15
    f 74 47 46
    f 73 15 16
    f 74 48 47
    f 73 16 17
    f 74 49 48
    f 73 17 18
    f 74 50 49
    f 73 18 19
    f 74 51 50
    f 73 19 20
    f 74 52 51
    f 73 20 21
    f 74 53 52
    f 73 21 22
    f 74 54 53
    f 73 22 23
    f 74 55 54
    f 73 23 24
    f 74 56 55
    f 73 24 25
    f 74 57 56
    f 73 25 26
    f 74 58 57
    f 73 26 27
    f 74 59 58
    f 73 27 28
    f 74 60 59
    f 73 28 29
    f 74 61 60
    f 73 29 30
    f 74 62 61
    f 73 30 31
    f 74 63 62
    f 73 31 32
    f 74 64 63
    f 73 32 33
    f 74 65 64
    f 73 33 34
    f 74 66 65
    f 73 34 35
    f 74 67 66
    f 73 35 36
    f 74 68 67
    f 73 36 37
    f 74 69 68
    f 73 37 38
    f 74 70 69
    f 73 38 39
    f 74 71 70
    f 73 39 40
    f 74 72 71
    f 73 40 9
    f 74 41 72
    f 9 41 42 10
    f 10 42 43 11
    f 11 43 44 12
    f 12 44 45 13
    f 13 45 46 14
    f 14 46 47 15
    f 15 47 48 16
    f 16 48 49 17
    f 17 49 50 18
    f 18 50 51 19
    f 19 51 52 20
    f 20 52 53 21
    f 21 53 54 22
    f 22 54 55 23
    f 23 55 56 24
    f 24 56 57 25
    f 25 57 58 26
    f 26 58 59 27
    f 27 59 60 28
    f 28 60 61 29
    f 29 61 62 30
    f 30 62 63 31
    f 31 63 64 32
    f 32 64 65 33
    f 33 65 66 34
    f 34 66 67 35
    f 35 67 68 36
    f 36 68 69 37
    f 37 69 70 38
    f 38 70 71 39
    f 39 71 72 40
    f 40 72 41 9
    est ce qu'il suffit de remplacer les o cube par des appels a glBegin() et les v par des glVertex3d() ???
    j'ai trouvé ça, mais quand meme votre aide sera la bienvenue :)
    • Partager sur Facebook
    • Partager sur Twitter
      5 juin 2008 à 16:58:06

      http://www.siteduzero.com/tuto-3-18395 [...] x-arrays.html
      Je te suggère d'apprendre à manier les données de meshs, ensuite tu vas deviner et comprendre le format .obj, puis tu créera ton propre importateur.
      Bon, pour le format obj, tu peux lire mon ébauche de tuto sur ZAP :
      http://bluestorm.info/ZAP/view.php?path=minituto_73
      • Partager sur Facebook
      • Partager sur Twitter
        5 juin 2008 à 17:01:53

        merci beaucoup pour ton aide, mais comme je programme en C++, je pourrais faire autrement pour les sommets ;)
        par exemple:
        std::vector<Sommet> sommet;
        ...
        sommet.push_back(...);
        et ensuite je crée les faces
        std::vector<Face> face;
        face.push_back(sommet[donneLuDansLeOBJ], ...);
        :)
        • Partager sur Facebook
        • Partager sur Twitter
          5 juin 2008 à 17:52:54

          Euh, pour l'implémentation tu fais comme tu veux, je ne vois pas le problème ?
          (et petite parenthèse : ta méthode est trop lourde, tu fais une réallocation pour chaque sommet, c'est horrible)
          • Partager sur Facebook
          • Partager sur Twitter
            5 juin 2008 à 17:55:23

            apres avoir lu ton tuto sur les arrays, j'avue qu'il est plus convenable dans ce cas :)
            • Partager sur Facebook
            • Partager sur Twitter
              7 juin 2008 à 15:26:29

              maintenant j'ai une autre question: comment savoir quel image faut charger pour al texture? oO il y a certes les coordonnées de la texture dans le .Obj mais pas le nom de l'image :(
              • Partager sur Facebook
              • Partager sur Twitter
                7 juin 2008 à 16:16:50

                Suivant le format, le nom de la texture est parfois donné.

                Personnellement, je préfère laisser au développeur le choix de la texture.
                Tout simplement car il arrive, pour un même modèle 3D, d'utiliser une choix une texture différente.

                Exemple: un personnage, qu'on habillera différemment en changeant de textures.
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juin 2008 à 19:18:34

                  et ben comment savoir combien de texture il y a en tout dans un fichier wavefront obj?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 juin 2008 à 20:35:30

                    quel est le meilleur moyen pour implementer ce chargeur:
                    faire un Vector::Push_back a chaque nouvelle corrdonnée? ou bien compter le nombre de Coordonnées totales et faire un resize une seule fois?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 juin 2008 à 23:59:41

                      Salut

                      Citation : zero ptt

                      quel est le meilleur moyen pour implementer ce chargeur:
                      faire un Vector::Push_back a chaque nouvelle corrdonnée? ou bien compter le nombre de Coordonnées totales et faire un resize une seule fois?


                      C'est une méthode correcte. La stl fera des reallocation intelligente. C'est a dire, au lieu de réallouer un seul élément lors d'un push_back, il en fera plusieurs. Tu peut toi aussi préalloué l'espace du vector par reserve
                      http://www.cplusplus.com/reference/stl [...] /reserve.html

                      Si ca t'intéresse , j'avais eu une question sur le obj sur un autre site.
                      http://www.developpez.net/forums/showt [...] highlight=obj
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 juin 2008 à 13:12:28

                        donc tu me conseille le premiere methode? faire des push_back a chque v que je recontre dans le fichier? et la STL s'occupera de faire un realoocation automatique intelligente?
                        et puis c'est quoi la differenceetre resize et reserve?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 juin 2008 à 14:30:55

                          Citation : zero ptt

                          donc tu me conseille le premiere methode? faire des push_back a chque v que je recontre dans le fichier? et la STL s'occupera de faire un realoocation automatique intelligente?


                          oui, ca t'evitera de passer ton fichier deux fois.

                          Citation

                          et puis c'est quoi la differenceetre resize et reserve?


                          Un vector alloue une mémoire dont tu utilise qu'une partie ou en totalité. Reserve permet d'allouer un espace memoire qui est >= au nombre de tes elements.

                          resize et size => correspond au élément que tu utilise
                          reserve et capacity => correspond à la mémoire réellement alloué par le vector
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 juin 2008 à 14:45:07

                            bon resumons: je ne suis pas du tout obligé de faire un resize/reserve ? et je ne perdeerai pas en performances?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 juin 2008 à 15:13:08

                              Si, tu perdras beaucoup en temps de calcul, car le vector utilise un espace mémoire contigu, ainsi si la dimension du tableau devient trop importante, il recopie les données à un endroit où il peut avoir de la marge, et y effectue une recopie des données. Tandis que si tu dis des le début qu'il contiendra 160 000 floats par exemple, il va directement reserver la place dans une zone adéquate, ainsi il n'y aura aucune recopie, puis lorsque tu accedes directement ou affecte directement un element de ton vector les traitements sont plus légers. Il y a moins de tests.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                10 juin 2008 à 15:16:51

                                et est ce que cette difference est trom importante? la STL ne fournit aucune optimisation?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 juin 2008 à 15:19:01

                                  Citation : zero ptt

                                  bon resumons: je ne suis pas du tout obligé de faire un resize/reserve ? et je ne perdeerai pas en performances?


                                  Pour un obj, reserve aurai plus de sens. Tu pourrais réserver 100 point par exemple avant de parsser ton fichier.
                                  Toute façon, un obj sera ouvert qu'une fois, ce ne serait donc pas la partie critique pour les performances de ton code.

                                  Aprés c'est à toi de faire un choix.

                                  [edit]
                                  bon ben tu as eu d'autre réponse dans ton autre poste.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    10 juin 2008 à 16:09:24

                                    j'ai un autre probleme,et j'ai pas envi de creer encore un topic:
                                    ou trouver un documennt qui explique en detail ce que fait chaque commande d'un fichier wavefront obj ?
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 juin 2008 à 16:21:04

                                      Dans le poste que je t'avais mis il y as ce lien :
                                      http://people.scs.fsu.edu/~burkardt/txt/obj_format.txt
                                      ca résume pas mal
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        10 juin 2008 à 17:53:17

                                        au lieu des vector, tu pourrai utiliser les listes ( des "vectors" sans allocations dynamique) ou les deque (je crois (plus du tout sur) qu c'est des listes de vector (donc plus rapide que vector))
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          10 juin 2008 à 17:59:43

                                          Citation : danman

                                          au lieu des vector, tu pourrai utiliser les listes ( des "vectors" sans allocations dynamique)


                                          ben vue ce qu'il fera aprés non. L'accés à un element quelquonce d'un vector est toujours le plus rapide.

                                          Citation : danman


                                          ou les deque (je crois (plus du tout sur) qu c'est des listes de vector (donc plus rapide que vector))


                                          ????

                                          VOici un bon resumé sur l'utilisation des conteneur stl
                                          http://cpp.developpez.com/faq/cpp/?pag [...] oix_conteneur
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            10 juin 2008 à 18:59:25

                                            "des "vectors" sans allocations dynamique"
                                            t'es sur? comment fait il alors stocker des elements?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              10 juin 2008 à 19:26:59

                                              y as des allocation dynamique de taille 1
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                10 juin 2008 à 20:29:03

                                                Citation : danman

                                                au lieu des vector, tu pourrai utiliser les listes ( des "vectors" sans allocations dynamique) ou les deque (je crois (plus du tout sur) qu c'est des listes de vector (donc plus rapide que vector))



                                                List fait que des allocations dynamiques à chaque insertion. Et deque c'est comme un vector mais il peut grandir des deux cotés et n'est absolument pas plus rapide que vector.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                  15 juin 2008 à 15:21:23

                                                  bon manitenant, je vais gerer les materiaux, mais je ne sais pas ce que ça signifie:
                                                  usemtl Material

                                                  # Blender3D MTL File: <memory>
                                                  # Material Count: 1
                                                  newmtl Material
                                                  Ns 96.078431
                                                  Ka 0.000000 0.000000 0.000000
                                                  Kd 0.640000 0.640000 0.640000
                                                  Ks 0.500000 0.500000 0.500000
                                                  Ni 1.000000
                                                  d 1.000000
                                                  illum 2
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  [opengl] creer un importeur de fichier OBJ

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown