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

Développement 2D, 3D et Jeux Discussion :

Problème avec std::stringstream pour lire un fichier OBJ


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut Problème avec std::stringstream pour lire un fichier OBJ
    Bonjour

    Je travaille actuellement sur un loader de fichier OBJ et j'ai un petit souci lors de la lecture des lignes concernant la description des faces.
    Une ligne décrivant une face est composée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    f 1/1/1 2/2/2 3/3/3
    Je charge ma ligne dans mon stringstream comme décrit dans la parti le code puis je boucle tant que je n'ai pas atteins la fin de celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (!ss.eof())
    {
       ss >> buf;
       ...
    }
    Et le problème c'est que je passe 4 fois dans le while alors que ne devrais y passer que 3 fois : une fois pour '1/1/1', une autre pour '2/2/2' et une dernière pour '3/3/3'. Cependant je me retrouve avec 2 fois le contenu de '3/3/3' dans mon 'buf'. Pour le moment je sors de ma boucle avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (i > 2)
        break;
    Donc si vous avez une idée j'achète.
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    MeshPtr OBJMeshLoader::createMesh(const std::string& fileName)
    {
    	std::ifstream file;
    	file.open(fileName.c_str(), std::ifstream::in);
    	if (!file)
    		return MeshPtr();
     
    	Mesh* mesh = OPG_NEW Mesh();
     
    	std::vector<Vector3> verticesBuffer;
    	std::vector<Vector3> normalsBuffer;
    	std::vector<Vector2> UVsBuffer;
     
    	std::string line;
    	std::string code;
     
    	std::map<MeshVertex::IndexType, MeshVertex> meshIndexMap;
     
    	SubMeshPtr currentSubMesh(OPG_NEW SubMesh());
     
    	while (std::getline(file, line))
    	{
    		std::stringstream ss(line);
    		ss >> code;
     
    		if (code == "mtllib") // material
    		{
    			std::string mtl;
    			readMaterial(mtl, ss);
    		}
    		else if (code == "v") // vertex
    		{
    			Vector3 vertex;
    			readVector3(vertex, ss);
    			verticesBuffer.push_back(vertex);
    		}
    		else if (code == "vn") // vertex normal
    		{
    			Vector3 normal;
    			readVector3(normal, ss);
    			normalsBuffer.push_back(normal);
    			_useNormals = true;
    		}
    		else if (code == "vt") // vertex texture
    		{
    			Vector2 uv;
    			readUV(uv, ss);
    			UVsBuffer.push_back(uv);
    			_useUVs = true;
    		}
    		else if (code == "f") // face
    		{
    			MeshVertex v;
    			int i = 0;
    			std::string buf;
    			while (!ss.eof())
    			{
    				if (i>2)
    					break;
     
    				ss >> buf;
     
    				MeshVertex::IndexType idx[3];
    				readFace(buf, idx);
     
    				if (idx[0] != -1)
    					v.position = verticesBuffer[idx[0]];
    				if (idx[1] != -1)
    					v.uv = UVsBuffer[idx[1]];
    				if (idx[2] != -1)
    					v.normal = normalsBuffer[idx[2]];
     
    				std::map<MeshVertex::IndexType, MeshVertex>::const_iterator it = meshIndexMap.find(idx[0]);
    				if (it == meshIndexMap.end())
    				{
    					currentSubMesh->vertices.push_back(v);
    					meshIndexMap[idx[0]] = v;
    				}
     
    				currentSubMesh->indices.push_back(idx[0]);
     
    				i++;
    				buf.clear();
    			}
    		}
    	}
     
    	file.close();
     
    	mesh->addSubMesh(currentSubMesh);
     
    	return MeshPtr(mesh);
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Je n'ai pas du tout le même comportement.

    Quel compilateur utilises-tu ? Quelle version ? Sur quel OS ?

  3. #3
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    J'utilise Visual C++ 2008 Express sur Windows XP Pro (et Windows Seven à mon école)

    Kromagg

  4. #4
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    J'ai enfin trouvé une solution à mon problème, il suffit de faire un
    avant d'entrer dans le while et la même chose à la fin du while, ça fonctionne très bien.

    Kromagg

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour lire des fichiers XML avec tFileInputXML- probleme format date
    Par rogermar dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 06/10/2010, 14h46
  2. Problème pour lire un fichier Xml avec Xpath
    Par adrix26 dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/11/2008, 17h06
  3. problème pour lire un fichier wav
    Par r0d dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/05/2007, 19h56
  4. Réponses: 14
    Dernier message: 01/05/2007, 19h25
  5. [C#] Problème pour lire un fichier xml
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 7
    Dernier message: 22/06/2006, 23h12

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