OpenGl: Wie ist eine Objekt aufgebaut?



  • Hum, das könnte gut ein Bufferoverflow sein... Es ist im Übrigen ziemlich hässlich, auf gut Glück einfach mal 50k Elemte zu reservieren. Der Code sieht mir stark nach C aus, wie siehts aus mit C++? Da gäbe es dann tolle Möglichkeiten wie beispielsweise std::vector und std::ifstream. Mit den std::vectoren kannst du dann dynamisch rumallokieren, ist echt eine tolle Sache. Ich habe damals auch einen OBJ-Loader für mein damaliges Framework geschrieben, ich schreibe ihn bei Zeiten mal neu, da immernoch die MTL-Daten nicht richtig geparst werden. Ich hab ihn mal hochgeladen, der Code sollte (in einer C++-Umgebung) funktionieren:
    http://coders-square.de/downloads/Framework.rar
    Und wie bereits gesagt, ist es ein altes Ding und sollte nochmal überarbeitet werden. Kann man aber schnell in 2min. machen.



  • ok danke, aber für deine datei brauch ich header dateien die nicht dabei sind:
    z.b. vector2.h oder vector3.h



  • Dachte ich mir schon... Sieht natürlich so aus:

    #include "Framework.h"
    
    #ifndef VECTOR3_HEADER
    #define VECTOR3_HEADER 
    
    class Vector3
    {
    public:
    	Vector3();
    	~Vector3();
    
    	float x;
    	float y;
    	float z;
    };
    
    #endif VECTOR3_HEADER
    

    Kannste auch direkt in die Headerdatei des Loaders einfügen, dann natürlich ohne Framework-Include und Includeguards. Vector2( ) hingegen sieht genau so aus, halt nur ohne die Z-Koordinate, sollte klar sein... Damit mein Image hier nicht verschmutzt wird: Im Framework gibt es ebenfalls 2 und 3-Dimensionale Vektorklassen mit Operatorenüberladung, in diesem Parser hatte es jedoch so gereicht^^.



  • ok danke, jetzt hab ich nur noch zwei probleme: ich bekomm bei convertToInt und getWord immer "Bezeichner wurde nicht gefunden".

    danke schonmal



  • Achso, klar doch. Ich dachte das wäre selbstverständlich: Das ist eine Konvertierung von einem std::string zu einem integer. Also nichts anderes als:

    int zahl = ::atoi( zahl.c_str( ) );
    

    und bei der zweiten Konvertierung zum Float natürlich: ::atof( );.



  • ah ok danke, jetzt hab ich nur noch die errors wegen dem getWord



  • 🙂

    #ifndef STRING_HEADER
    #define STRING_HEADER
    
    std::string const getWord(std::string Line, int Pos) 
    {
    	std::vector<std::string> Vec;
    	std::stringstream ss(Line);
    	std::string Word, a;
        while(ss >> Word)
        Vec.push_back(Word);
    
    	return (static_cast<unsigned int> (Pos) + 1 > Vec.size() ? "" : Vec[Pos] );
    }
    
    float convertToFloat(std::string Num)
    {
    	if((strlen(Num.c_str())) > 0)
    	{
    		float x = static_cast<float> ( atof( Num.c_str( ) ) );
    		return x;
    	}
    	else
    	{
    		Num.clear();
    		return 0;
    	}
    }
    
    int convertToInt(std::string Num)
    {
    	if((strlen(Num.c_str())) > 0)
    	{
    		int x = atoi(Num.c_str());
    		return x;
    	}
    	else
    	{
    		Num.clear();
    		return 0;
    	}
    }
    
    #endif STRING_HEADER
    


  • vielen dank hat alles fuktioniert

    edit: ich bekomme 4 linker fehler (LNK2019) bei den 2 klassen (vector2 und vector3)



  • 😃
    Schick mir dein Projekt eben per E-Mail...



  • ok 😉



  • Nachdem du mir sehr per E-Mail geholfen hast, habe ich nur noch ein Problem: Meine .Obj Datei wird nicht angezeigt, obwohl ich sie im Code rendere.

    Den Link zu meinem Projekt müsstest du noch haben, fals nicht sag bescheid, dann schick ich nochmal den Link.



  • Deine letztendliche Vertexausgabe war an die Erfüllung einer Kondition geknüpft, nämlich:

    if( texture->ModelHasUV )
             glVertex3f( x, y, z );
    

    Oder so ähnlich, du hast aber eine E-Mail bekommen. Und wie gesagt, wenn du mal alles durchdebuggst, solltest du den/die Fehler leicht finden...



  • danke für deine mail, aber (ich weiß echt nich was ich falsch mache) es geht nicht. immer wenn ich kompiliere und anschließend starte kommt nur das fenster mit dem schwarzen hintergrund und sonst nichts.



  • Das ist nicht ganz so einfach zu sagen... ich weiss auch nicht, warum du imemr den Umweg gehen möchtest. Wofür brauchst du überhaupt die glm-lib? Hast du die gesamte Szene mal in die ferne translantiert? Könnte ja sein, schiebe sie einfach mal mit glTranslatef( x, y, z ); auf der Z-Achse in den Minusbereich, dann solltest du etwas zu sehen bekommen...


Anmelden zum Antworten