[OpenGL][C++] Mein *.obj File parser



  • Guten Abend Freunde der Grafik/Spieleprogrammierung,

    ich hab jetzt nach langem hin und her einen *.obj File Parser selbst erstellt, da ich keinen den Google ausgespuckt hat zum laufen bekommen hab.

    Also der File Parser funktioniert, nur sagen wir mal so, er ist nicht der effektivste. Das kommt daher das ich Struktur-Arrays für die Vertices/Faces nutze und ich ja nie genau weiß wie viele Vertices/Faces nun ein Objekt hat.

    Hier mal ein Beispiel:

    struct vert{
    
    			GLfloat x;
    			GLfloat y;
    			GLfloat z;
    
    		};
    
    		struct mesh{
    
    			GLfloat p1[3];
    			GLfloat p2[3];
    			GLfloat p3[3];
    
    		};
    
    		vert vertice[1200]; //<-- Endgültige Anzahl Punkte
    		mesh meshes[2400]; //<-- Endgültige Anzahl Faces
    

    Geladen wird das ganze dann so:

    while(getline(objFile, line))
    	{
    
    		if(line[0] == 'v' && line[1] == ' ')
    		{
    		  string lineVals = line.substr(2);
    
    		  string val0 = lineVals.substr(0, lineVals.find(' '));
    		  vertice[i].x = (float)atof(val0.c_str());
    
    		  string val1 = lineVals.substr(val0.length()+1, lineVals.find(' '));
    		  vertice[i].y = (float)atof(val1.c_str());
    
    		  string val2 = lineVals.substr(lineVals.find_last_of(' ') + 1);
    		  vertice[i].z = (float)atof(val2.c_str());
    
    		  i++;
    		}
    
    	if(line[0] == 'f' && line[1] == ' ')
    		{
    		  string lineVals = line.substr(2);
    		  int face;
    
    		  string val0 = lineVals.substr(0, lineVals.find(' '));
    		  face = (int)atof(val0.c_str());		  
    
    		  meshes[j].p1[0] = 0.0f + vertice[face - 1].x;
    		  meshes[j].p1[1] = 0.0f + vertice[face - 1].y;
    		  meshes[j].p1[2] = 0.0f + vertice[face - 1].z;
    
    		  string val1 = lineVals.substr(val0.length() + 1, lineVals.find(' '));
    		  face = (int)atof(val1.c_str());  
    
    		  meshes[j].p2[0] = 0.0f + vertice[face - 1].x;
    		  meshes[j].p2[1] = 0.0f + vertice[face - 1].y;
    		  meshes[j].p2[2] = 0.0f + vertice[face - 1].z;
    
    		  string val2 = lineVals.substr(lineVals.find_last_of(' ') + 1);
    		  face = (int)atof(val2.c_str());
    
    		  meshes[j].p3[0] = 0.0f + vertice[face - 1].x;
    		  meshes[j].p3[1] = 0.0f + vertice[face - 1].y;
    		  meshes[j].p3[2] = 0.0f + vertice[face - 1].z;
    
    		  j++;
    		}
    	}
    

    Naja wie gesagt nicht sehr effektiv, deshalb wollte ich hier mal nachfragen ob mir jemand 'ne bessere Lösung vorschlagen kann. Vor allem liegt mir am Herzen das nicht ein "meshes[1200]" erzeugt wird wenn ich bloß 200 brauche, aber in einem anderen trotzdem die 1200 brauche. Kurz gesagt das ganze etwas dynamischer gestalten.



  • Dann verwende doch einen vector statt rohen Arrays.



  • Und statt getline, strings und atof, nimm doch einfach die entsprechenden Möglichkeiten der C++ streams (operator >>)... 😉


Log in to reply