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 :

Importation d'un .ASE en OpenGL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut Importation d'un .ASE en OpenGL
    Bonjour,

    J´ai un problème lorsque je souhaite charger sous Windows en Opengl et C++ un fichier .ase exporté depuis 3DSMax. J´utilise pour le moment juste le code fourni par le site glinfrench
    (http://glinfrench.apinc.org/article.php3?id_artic
    le=80) et ça marche nickel sur les exemples fournis. Le problème intervient lorsque je met l´un de mets fichiers .ase exporté (l´erreur vient du fait que mon .ase ne contient pas de MESH_NUMTVERTEX et donc de TVERTEX tout court alors qu´ils sont indispensables pour le bon fonctionnement du loader..)

    Si quelqu´un pouvais m´expliquer à quoi les TVERTEX sont utiles et comment résoudre mon problème, je lui en serait extrêmement reconnaissant. Merci

    De plus, le programme marche lorsque je mets en commentaire les lignes pour les TVERTEX. Pour m'assurer que mon fichier est bien chargé, j'ai essayé d'afficher quelque chose mais le fenêtre reste noire... Comment puis-je faire ?

    Voici mon 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
    void RePaint ()
    {
    	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glMatrixMode (GL_MODELVIEW);
    	glLoadIdentity ();
     
        gluLookAt (0,0,-10,0,0,0,0,1,0);
     
    	glEnable(GL_DEPTH_TEST);
     
    	for (int i = 0; i<fileLoader.num_mesh; i+=sizeof(Mesh)){
    		glBegin (GL_TRIANGLES);
                glColor3d (0,0,1);
    			for(int j=0; j<fileLoader.mesh->num_faces; j++){
    				glColor3d (0,1,0);
    				glVertex3f (fileLoader.mesh->faces->v[0],fileLoader.mesh->faces->v[1],fileLoader.mesh->faces->v[2]);
    			}
    			glColor3d (1,0,0);
    		glEnd ();
    	}
     
    	SwapBuffers (DC);
    }

  2. #2
    Membre chevronné
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Par défaut
    Désolés je suis pas dans la capacité de t'aider mais juste une remarque (peut etre que j'ai tord...) je trouve assez moche la boucle appellant des glVertex.
    Pourquoi ne pas utiliser des vertex array ? Ce sera beaucoup plus propre et plus optimisé.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Merci je vais me renseigner sur ce que sont les vertex_array. En attendant, je suis toujours ouvert à une aide pour mon affichage. Merci

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Je suis vraiment paumé là

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Je vais donc essayer d'être plus clair dans mes explications...

    Alors voici mon code pour l'affichage :

    void RePaint ()
    {
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();

    gluLookAt (x,y,z,0,0,z-200,0,1,0);

    glEnable(GL_DEPTH_TEST);

    for (int i=0; i<fileLoader.num_mesh; i++){
    glBegin (GL_TRIANGLES);
    glColor3d(0,1,0);
    for(int j=0; j<fileLoader.mesh->num_faces; j++)
    glVertex3f (fileLoader.mesh[i].faces[j].v[0],fileLoader.mesh[i].faces[j].v[1],fileLoader.mesh[i].faces[j].v[2]);
    glEnd ();
    }

    SwapBuffers (DC);
    }
    Je précise que la couleur imposée par glColor est juste là pour me permettre de voir un résultat lors de l'affichage.

    Je vais détailler un peu maintenant, voilà les classes dans lesquelles je stocke les infos de mon fichier .ase :

    typedef float vec3_t[3];
    typedef float vec2_t[2];

    la structure face_t avec les attributs suivants :
    face_t();
    int v[3];
    int id;

    La structure Material avec les attributs suivants :
    int id;
    vec3_t ambient;
    vec3_t diffuse;
    vec3_t specular;

    string diffuse_map;
    unsigned int dId;
    bool has_texture;
    string bump_map;
    unsigned int bId;
    bool has_bump;

    vec2_t dOffset;
    vec2_t dTiling;
    vec2_t bOffset;
    vec2_t bTiling;

    bool has_subs;
    int num_sub;
    Material* subs;

    La structure Mesh avec les attributs :
    int num_vertices;
    int num_faces;
    int num_Tvertices;
    int num_Tfaces;
    int material;

    vec3_t *vertices;
    vec2_t *Tvertices;
    face_t *faces;
    face_t *Tfaces;
    vec3_t *Fnormals;
    vec3_t *Vnormals;

    Et pour finir la classe Ase avec les attributs :
    int Load(char* s);
    void Render(void);
    void Flush();

    int num_materials;
    Material *mats;
    int num_mesh;
    Mesh *mesh;
    vec3_t ambient;

    Bon pour que ça ne soit pas trop compliqué à comprendre, je ne vous ai pas mis les méthodes de la classe Ase qui sont appelées pour charger le fichier .Ase

    Voilà, j'espère que ça vous paraît plus clair maintenant et que ça vous aidera à m'aider (pas mal cette formule tiens ^^)

    Merci d'avance !

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 583
    Par défaut
    Les TVERTEX ne seraient pas les coordonnées de texture ? (TextureVERTEX)

    auquel cas si ton objet n'a aucune coordonnée de texture générée c'est pour cela qu'il n'y en a pas d'exportée

    essayes de texturer ton objet avant de l'exporter et regardes si tu a des TVERTEX qui apparaissent
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Ok mais il n'y a pas un moyen sans importer les textures ?

    Merci

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 583
    Par défaut
    tu modifies le loader... il est mal foutu s'il veut obligatoirement les TVERTEX
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    C'est ce que j'ai fait, je pensais par exemple juste dessiner les points et les relier entre-eux pour voir si ça à bien chargé le fichier, mais je ne vois pas comment faire... (par rapport aux classes et aux atttributs que j'ai bien entendu)

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 583
    Par défaut
    Ne connaissant pas l'import ASE que tu utilises je ne saurai te répondre
    le format de fichier ASE étant un format ASCII, il n'est pas difficile de créer soit même un import

    à partir du moment où tu as accès aux vertex tu peux dessiner l'objet, si tu as les normales tu peux ajouter de l'éclairage, il faut que tu définisses une couleur au début du dessin

    une question, ta version de 3DSMax peut-il exporter au format OBJ (wavefront) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (int i=0; i<fileLoader.num_mesh; i++)
    { 
       glBegin (GL_TRIANGLES); 
          glColor3d(0,1,0); 
          for(int j=0; j<fileLoader.mesh->num_faces; j++) 
             glVertex3f (fileLoader.mesh[i].faces[j].v[0],fileLoader.mesh[i].faces[j].v[1],fileLoader.mesh[i].faces[j].v[2]); 
       glEnd (); 
    }
    il y a peut-etre un problème dans ta boucle de dessin, ta variable j parcours les faces mais même si tu as les vertex dans v[], à mon avis tu dois avoir une table d'index et parcourir cette table pour savoir quel vertex envoyer à la carte

    si j'ai le temps j'irai voir le code de l'import
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Par défaut
    Citation Envoyé par alex6891
    C'est ce que j'ai fait, je pensais par exemple juste dessiner les points et les relier entre-eux pour voir si ça à bien chargé le fichier, mais je ne vois pas comment faire...
    Au moins pour les points :

    glPointSize(GLfloat size)

    glBegin (GL_POINTS);

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Merci à tous pour votre aide : je viens de réussir à afficher les lignes ce qui créé un simple effet fil de fer (c'est déjà un bon début!) mais il demeure un problème (moindre mais problème quand même.)

    En effet, lorsque je me déplace dans ma scène, pour tenter d'admirer les objets 3D sous toutes leurs formes, des lignes disparaissent sans raison ce qui fait que je n'arrive pas à voir l'ensemble de la scène. A votre avis, est-ce que cela peut venir de la caméra (champ de vision), ou de l'affichage ?

    Merci beaucoup,

    Alex

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 583
    Par défaut
    tu paramètre ton affichage avec un appel à gluPerspective quelque part j'imagine ?

    le dernier paramètre de gluPerspective (zFar) peut-être en cause, à voir la taille de ton objet et la profondeur de champ paramètrée, essaie de diminuer la taille de l'objet par un appel à glScalef avant l'affichage ou d'augmenter le zFar pour voir
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  14. #14
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    tu paramètre ton affichage avec un appel à gluPerspective quelque part j'imagine ?

    le dernier paramètre de gluPerspective (zFar) peut-être en cause, à voir la taille de ton objet et la profondeur de champ paramètrée, essaie de diminuer la taille de l'objet par un appel à glScalef avant l'affichage ou d'augmenter le zFar pour voir
    En effet, celà venait du zFar merci beaucoup.

    Donc maintenant ça fonctionne, le rendu est nickel (toujours en mode "fil de fer" cad que j'affiche juste les lignes) sauf qu'au lancement de la fenêtre OpenGL, la caméra est positionnée dans un mauvais sens... je ne sais pas d'où ça vient exactement car mon glutLookAt définit bien l'axe des y comme verticale du lieu, j'ai pensé alors regarder du côté du loader et du stockage des vertex et j'ai donc ("à la méthode barbare") tenté toutes les combinaisons possibles lorsque j'affiche les vertex dans ma scène sans succès...

    Si quelqu'un pouvais me donner une piste ou mieux une solution, merci !

  15. #15
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    J'essaie tant bien que mal de charger la caméra du fichier ASE. J'ai déjà réussi avec succès à récupèrer la position grâce au noeud *TM_POS du noeud *CAMERAOBJECT. Le problème c'est que je voudrais "redresser la vue subjective" dans la même direction que celle qu'elle a dans le logiciel 3D. Je pensais aux noeuds *TM_ROTAXIS et *TM_ROTANGLE et j'ai donc essayé le code suivant juste au début de ma fonction d'affichage (avant de dessiner les autres objets) :

    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
    glRotated(-0.0361,1,0,0);
    glRotated(-0.7207,0,1,0);
    glRotated(-0.6923,0,0,1);
    gluLookAt(x,y,z,0,0,0,0,1,0);
    Ou les premiers paramètres de glRotated sont récupérés des trois paramètres du noeud *TM_ROTAXIS ...

    Ca ne change rien... (je précise que je souhaite faire tourner la caméra pas la scènes ni les objets qu'elle contient) Merci d'avance.

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 583
    Par défaut
    Si je ne me trompe, 3DS considère l'axe z comme axe vertical
    il faut donc que tu fasses une rotation de ton objet pour qu'il se cale sur tes axes ou que tu changes dans ton loader l'ordre des coordonnées

    je te conseille de prendre un logiciel capable d'importer du ase et de voir comment est aligné ton objet (milkshape par exemple)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  17. #17
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    J'ai pourtant essayé de changer l'ordre des coordonnées dans le loader (tous les les permutations possibles) mais sans succès... Je vais réésayer alors...

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Salut,

    Je constate que l'on est en meme temps en train de bidouiller le meme genre de projet
    Bon personnellement, j'ai vite abandonné le format .ASE car il ne respectait pas certaines choses que tu ne pouvais pas recuperer par la suite (notamment les reperes comme tu l'as indiqué, genre j'etais obligé de faire une rotation à 90° sur je ne sais plus quel axe pour que mon objet soit dans le bon sens). Je suis donc passé au format .3DS et si ca t'interresse je pourrais te tuyauter car mon truc fonctionne nickel !! j'ai réussi à charger une jeep avec texturing et tout le tintouin (enfin trop happy quoi ^^)
    Par contre je ne pourrais pas t'envoyer de source ou de proj compilé car je le fais pour le moment sous mac, donc il y a quelques petites differences à l'inclusion des libs (que je n'ai pas encore mis portable) mais sinon tout le reste est portable.
    Pour le chargement d'un fichier 3ds, tu galeres dix fois moins car tu ne te prends pas la tete à gérer toutes les occurences qui varient d'ordre, en nombre... dans un fichier ase.
    Voilou !
    @++

  19. #19
    Invité de passage
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1
    Par défaut
    bonjour a tous,
    comme dit précédement ta boucle de glVertex n'est pas tres propre meme si ca fonctionne tres bien
    je me permet de poser une question : pourquoi ne pas utiliser les tableaux de coordonnées de sommets et les fonctions proposées avec un tableau de sommets et un tableau d'indices de sommets pour former chaque face.

    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
     
    /*
    glEnableClientState(GLenum array) avec comme paramètre : GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_INDEX_ARRAY, GL_NORMAL_ARRAY, GL_TEXTURE_COORD_ARRAY, ou GL_EDGE_FLAG_ARRAY.
    */
     
    // exemple:
     
         glEnableClientState(GL_VERTEX_ARRAY); // activation des tableaux de sommets
     
    /*
    void glVertexPointer(GLint taille, GLenum type, GLsizei stride, const GLvoid *pointeur)
    pointeur indique l'adresse mémoire de la première valeur pour le premier sommet du tableau.
    type indique le type de données
    taille indique le nombre de valeurs par sommets, et peut prendre suivant les fonctions les valeurs 1, 2, 3 ou 4.
    stride indique le décalage en octets entre deux sommets successifs. Si les sommets sont consécutifs, il vaut zéro.
    */
     
    // exemple:
     
         glVertexPointer(3,  GL_FLOAT, 0, sommets);
     
    /*
    void glDrawElements(GLenum mode, GLsizei nombre, GLenum type, void *indices) permet d'utiliser le tableau indices pour stocker les indices des éléments à afficher.
    Le nombre d'éléments dans le tableau d'indices est nombre
    Le type de données du tableau d'indices est type, qui doit être GL_UNSIGNED_BYTES, GL_UNSIGNED_SHORT, ou GL_UNSIGNED_INT
    Le type de primitive géométrique est indiqué par mode de la même manière que dans glBegin().
    */
     
    // exemple:
     
         glDrawElements(GL_TRIANGLES , 3 * nbFaces, GL_UNSIGNED_INT , mesFaces);
    voila jespere que c'est assez clair
    et que ca servira a quelqu'un

    a++

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 583
    Par défaut
    Citation Envoyé par zax-tfh
    Bon personnellement, j'ai vite abandonné le format .ASE car il ne respectait pas certaines choses que tu ne pouvais pas recuperer par la suite (notamment les reperes comme tu l'as indiqué, genre j'etais obligé de faire une rotation à 90° sur je ne sais plus quel axe pour que mon objet soit dans le bon sens).
    Etrange car les formats 3DS et ASE proviennent tous deux de 3DStudio et à ma connaissance ont en commun l'axe Z en axe vertical
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

Discussions similaires

  1. Importation de sybase ASE 12.5
    Par Maria Ross dans le forum Sybase
    Réponses: 2
    Dernier message: 18/07/2007, 11h25
  2. [3D'S MAX] importer des fichiers dans OpenGL
    Par black is beautiful dans le forum OpenGL
    Réponses: 3
    Dernier message: 30/04/2005, 13h45
  3. Réponses: 7
    Dernier message: 28/09/2004, 02h50
  4. Réponses: 6
    Dernier message: 12/02/2004, 21h55

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