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 :

Chargement de modèle en .obj


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Terminal S
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Terminal S

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Par défaut Chargement de modèle en .obj
    Bonjour à tous,

    j'ai fais un chargeur de modèles 3D en c++, mais je rencontre des problèmes quand je lance le programme, je vous met le code ci dessous:

    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
     
    static void drawContent()
    {
    	ifstream file;
    	file.open("D:/Users/askjmk/Documents/Visual Studio 2013/monkey.obj");
    	if (file)
    	{
    		string ligne;
    		int lines = 0;
     
    		vector<float> fxyz;
     
    		while (!file.eof())
    		{
    			getline(file, ligne);
    			string ifv = ligne.substr(0,2);
     
    			if (ifv == "v ")
    			{
     
    				string sx = ligne.substr(2, 9);
    				string sy = ligne.substr(11, 9);
    				string sz = ligne.substr(21, 9);
    				float fx = stof(sx);
    				float fy = stof(sy);
    				float fz = stof(sz);
     
    				fxyz.push_back(fx);
    				fxyz.push_back(fy);
    				fxyz.push_back(fz);
     
    				lines++;
    			}
     
    		}
    		if (file.eof())
    		{
    			glEnableClientState(GL_VERTEX_ARRAY);
    			glEnable(GL_DEPTH);
    			glVertexPointer(3, GL_FLOAT, 0, fxyz.data());
    			glDrawArrays(GL_QUADS, 0, lines);
    			glDisable(GL_DEPTH);
    			glDisableClientState(GL_VERTEX_ARRAY);
    		}
    	}
    	else
    	{
    		window.close();
    	}
    }
    je vous montre le problème avec l'exemple d'une sphere fait avec blender et d'un cube:
    Nom : 1436207457-sans-titre.jpg
Affichages : 608
Taille : 39,5 Ko
    Désolé, pour la taille de l'image je ne sais pas comment faire, je vous met le lien ici: http://image.noelshack.com/fichiers/...sans-titre.jpg


    je pense que l'erreur viens d'un problème entre vertex, faces, etc et GL_TRIANGLES/GL_QUADS...

    Ce serai sympa de me faire part de vos connaissances !
    Maxime

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Sans plus de précision , impossible de savoir d'ou vient le probleme mais si j'ai un conseille a donné la plupart des modeleur 3D permet d'exporté le .obj en triangle uniquement donc je te conseille d'enlever GL_QUADS par GL_TRIANGLES.

    En faite je viens de remarqué que tu as écrit le loader + le rendu...
    Il faut que tu comprenne ce que tu fait vu que je pense que tu ne comprend pas comment fonctionne le .obj.
    Il va y avoir du boulot a faire avant de faire un loader + rendu d’après ce que je vois pour moi c'est un peu n'importe quoi la...
    Deja lire un fichier c'est lent , donc tu ne peut pas le faire pendant la phase de rendu.
    Un fichier .obj tu ne peux pas afficher quoique ce soit de correct en te basant que sur le 'v' il te faut lire aussi les index donc a la base un fichier .obj s'affiche avec glDrawElements tu peux afficher un .obj avec glDrawArrays mais il faut faire un certain tri avant (ce que tu ne fait pas).

    Donc pour ma part il faut deja faire un Loader .obj (récupérer tout les v , vt , vn ,et i + nombre de vertex,nombre index ect dans une classe ou structure) , ensuite la phase de rendu sera beaucoup plus simple qui ne fera que quelque ligne (enfin chez moi la fonction ne fait que 60 ligne mais elle gère pas mal de cas).

  3. #3
    Membre averti
    Homme Profil pro
    Terminal S
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Terminal S

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Par défaut
    D'accord, je fais faire un loader complet et puis je t'en fait part ^^

  4. #4
    Membre averti
    Homme Profil pro
    Terminal S
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Terminal S

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Par défaut
    Est ce que tu connait une autre manière d'analyser une ligne au lieu d'utiliser substr ?

  5. #5
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 035
    Billets dans le blog
    12
    Par défaut
    En utilisant std::stringstream?

    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
    getline(file, ligne);
    stringstream stream( ligne );
    string ifv;
    stream >> ifv
     
    if (ifv == "v")
    {
    	float fx;
    	float fy;
    	float fz;
    	stream >> fx >> fy >> fz;
     
    	fxyz.push_back(fx);
    	fxyz.push_back(fy);
    	fxyz.push_back(fz);
    	lines++;
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #6
    Membre averti
    Homme Profil pro
    Terminal S
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Terminal S

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Par défaut
    Est ce que vous containériseriez un lien qui montre le fonctionnement d'un obj...

Discussions similaires

  1. Tutoriel DirectX 11 : chargement de modèles Maya 2011
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 03/09/2014, 22h31
  2. Réponses: 18
    Dernier message: 26/06/2011, 16h21
  3. [OPENGL] problème de chargement fichier .obj
    Par pspflashsystem dans le forum Débuter
    Réponses: 4
    Dernier message: 23/02/2009, 00h28

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