Script klappt komischerweise wegen dem Vector nicht
-
problem bleibt weiterhin... hier der "neue" code:
void Starten ( const char *filename ) { std::ifstream Datei; Datei.open(filename, std::ios::in); int vD = 0, fD = 0, vtD = 0; std::vector<OGL> Koordinaten; std::string Line; OGL vertic; glBegin(GL_TRIANGLE_STRIP); while(!Datei.eof()) { const std::string s = getWord(Line, 0); while(getline(Datei,Line)) { // Die Vs, Fs und VTs zählen... if(Line.find('v') != std::string::npos) { vD++; for(int v = 0; v == vD; v++) { Koordinaten[v].x = convertToFloat(getWord(Line,1)); Koordinaten[v].y = convertToFloat(getWord(Line,2)); Koordinaten[v].z = convertToFloat(getWord(Line,3)); } } else if(Line.find('f') != std::string::npos) { fD++; } else if(Line.find('vt') != std::string::npos) { vtD++; } } } // ... und verarbeiten. // als erstes die Koordinaten for(int i = 0; i < vD; i++) { glVertex3f(Koordinaten[i].x,Koordinaten[i].y,Koordinaten[i].z); } // danach die Faces for(int j = 0; j < fD; j++) { Face face; size_t x; if(Line.find("/") != std::string::npos) { face.vertexIndex[0] = convertToInt(getWord(Line,1)); face.vertexIndex[1] = convertToInt(getWord(Line,2)); face.vertexIndex[2] = convertToInt(getWord(Line,3)); } } // und dann die Textur for(int k = 0; k < vtD; k++) { } glEnd(); Datei.close(); };
-
void Starten ( const char *filename ) { std::ifstream Datei; Datei.open(filename, std::ios::in); int vD = 0, fD = 0, vtD = 0; std::vector<OGL> Koordinaten; std::string Line; OGL vertic; // vertic? Gibt's nicht, höchstens vertices... while(!Datei.eof()) { const std::string s = getWord(Line, 0); getline(Datei,Line); // Die Vs, Fs und VTs zählen... if(Line.find('v') != std::string::npos) { vD++; for(int v = 0; v == vD; v++) { Koordinaten[v].x = convertToFloat(getWord(Line,1)); Koordinaten[v].y = convertToFloat(getWord(Line,2)); Koordinaten[v].z = convertToFloat(getWord(Line,3)); } } else if(Line.find('f') != std::string::npos) { fD++; } else if(Line.find('vt') != std::string::npos) { vtD++; } } // ... und verarbeiten. // als erstes die Koordinaten glBegin(GL_TRIANGLE_STRIP); for(int i = 0; i < vD; i++) { glVertex3f(Koordinaten[i].x,Koordinaten[i].y,Koordinaten[i].z); } glEnd(); // danach die Faces /* Das hier ist völlig aus der Routine, hat hier nichts verloren... for(int j = 0; j < fD; j++) { Face face; size_t x; if(Line.find("/") != std::string::npos) { face.vertexIndex[0] = convertToInt(getWord(Line,1)); face.vertexIndex[1] = convertToInt(getWord(Line,2)); face.vertexIndex[2] = convertToInt(getWord(Line,3)); } } */ Datei.close(); };
Du wirst trotzdem nicht zum gedachten Rendering-Ergebnis kommen. Falls du diese extra-lib (glm war es glaube ich) rauskicken kannst, schick mir nochmal ne Mail dann kann ich dir eben dran schreiben was falsch war. Achja, noch was: DEBUGGER.
EDIT:
Noch was, du holst dir in jeder Zeile durchconst std::string s = getWord(Line, 0);
schon das erste Element des std::strings. Daher reicht es, "s" auf ein bestimmtes Zeichen zu überprüfen.
-
hmmm also bei dem verbessertem Code bekomme ich trotzdem den Fehler in der vector Header Datei. Aber ich glaube jetzt welche Zeile(n) daran Schuld sind:
for(int i = 0; i < vD; i++) { glVertex3f(Koordinaten[i].x,Koordinaten[i].y,Koordinaten[i].z); }
Ich verstehe nicht, was daran falsch ist.
Achja:
Falls du diese extra-lib (glm war es glaube ich) rauskicken kannst
Die glm.h Datei benutze ich nicht (mehr), weil sie bei mir nicht funktioniert (keine Ahnung warum).
Ich benutze den Standart-Debugger von VC++ 2008
-
mascerade schrieb:
hmmm also bei dem verbessertem Code bekomme ich trotzdem den Fehler in der vector Header Datei. Aber ich glaube jetzt welche Zeile(n) daran Schuld sind:
...Ach, so ein Mist, ich hätte es doch merken müssen... Durch Vektoren iteriert man und looped nicht einfach. Außerdem brauchst du den Inkrement innerhalb der Schleifen auch nicht, weil man mit der Methode std::vector::size( ) die Anzahl der Elemente bekommen kann. Hättest aber auch ruhig mal den Fehlercode posten können.
So sollte es gehen:for( std::vector<Koordinaten>::iterator i = Koordinaten.begin( ); i < Koordinaten.end( ); ++i ) { glVertex3f( i->x, i->y, i->z); }
mascerade schrieb:
Die glm.h Datei benutze ich nicht (mehr), weil sie bei mir nicht funktioniert (keine Ahnung warum).
Ich benutze den -Debugger von VC++ 2008
Wenn du es jetzt nicht hinbekommst, schick mir einfach eine E-Mail mit dem Projekt.
-
Perfekt, danke! Jetzt muss ich nur noch die Faces und die Texturen laden...
Meine Frage noch: muss ich die Faces genauso zeichnen wie die Koordinaten oder muss ich sie irgendwie "speziell" behandeln?
-
mascerade schrieb:
muss ich die Faces genauso zeichnen wie die Koordinaten oder muss ich sie irgendwie "speziell" behandeln?
Du musst die faces nicht zeichnen
. Am Besten du schaust dir nochmal eben meine E-Mail an, da steht alles drin...
So renderst du die Vertices richtig: (Vorsicht, ungetestet und SPOILER!)
// Wie bereits gesagt, musst du das Alignement beachten, wie man das ausschaltet habe // ich dir auch schon geschrieben. Achja: Am Besten eindeutige Namen verwenden, nicht "OGL". #pragma pack( 1 ) struct OGL { int x; int y; int z; }; #pragma pop( ) #pragma pack( 1 ) struct faces { /* Besser ist es, wenn du einen Initialisierungswert festlegst. Dann kannst du später überprüfen, ob vielleicht etwas nicht eingelesen wurde oder sonst etwas */ faces() { vertexIndex[0] = vertexIndex[1] = vertexIndex[2] = 0xffffffff; } unsigned int vertexIndex[3]; }; #pragma pop( ) void Starten ( const char *filename ) { std::ifstream Datei; Datei.open(filename, std::ios::in); std::vector<OGL> Koordinaten; std::vector<faces> faceIndex; std::string Line; OGL vertic; // vertic? Gibt's nicht, höchstens vertices... while(!Datei.eof()) { const std::string s = getWord(Line, 0); getline(Datei,Line); if(Line.find('v') != std::string::npos) { for(int v = 0; v == vD; v++) { Koordinaten[v].x = convertToFloat(getWord(Line,1)); Koordinaten[v].y = convertToFloat(getWord(Line,2)); Koordinaten[v].z = convertToFloat(getWord(Line,3)); } } else if(Line.find('f') != std::string::npos) { face faces; faces.vertexIndex[0] = convertToInt( getWord( Line, 1 ) ); faces.vertexIndex[0] = convertToInt( getWord( Line, 2 ) ); faces.vertexIndex[0] = convertToInt( getWord( Line, 3 ) ); faceIndex.push_back( faces ); } else if(Line.find('vt') != std::string::npos) { } } // ... und verarbeiten. // als erstes die Koordinaten glBegin(GL_TRIANGLE_STRIP); for( std::vector<face>::iterator k = face.begin( ); k < face.end( ); ++k ) { glVertex3f( Koordinaten[k->vertexIndex[0]].x, Koordinaten[k->vertexIndex[1]].x, Koordinaten[k->vertexIndex[2]].x); } glEnd(); Datei.close(); };
Du solltest dir vielleicht nochmal die Standard STL-Container ansehen, so macht man das nämlich nicht mit den Koordinaten...
-
ok vielen Dank, werde mir deine E-Mail nochmal durchlesen!
Edit: bekomme 2 Errors, wegen dem .begin und dem .end (".begin/.end ist kein Element von face...")
Danke schonmal
-
Wie bereits gesagt, ist der Code ungetestet. Der Vector heisst "faceIndex", der muss natürlich anstelle von "face" dahin.
-
ich schick dir mal ne ´mail...
-
mascerade schrieb:
ich schick dir mal ne ´mail...
Das wird ne' lange Nacht
.
-
hast du meine E-Mail bekommen?
-
mascerade schrieb:
hast du meine E-Mail bekommen?
Ja, alle Beide. Konnte bisher aber immer nur kurzweilig reinschauen weil ich soviel zu tun habe. Aber wenn ich ehrlich bin: Der komplette Code ist ein wirrwarr. Wenn du es am laufen hast schreibst du deine nächste Implementierung und dann? Dann wirste ständig Probleme haben wenn du deinen Code nicht stark strukturierst und mal den Debugger anwirfst (;.
-
Völlig OT, aber nötig:
Es ist kein Script! Es ist ein Programm. C++ ist KEINE Skriptsprache, demnach hier KEIN Script.Nur so nebenher.
Ansonsten: Weitermachen!
-
Ja, alle Beide
Sorry wegen den 2 Mails, ich wusste nur nicht ob beide abgeschickt worden sind.
Dann wirste ständig Probleme haben wenn du deinen Code nicht stark strukturierst und mal den Debugger anwirfst (;.
jo, da hast du wohl recht! Ich werde mal meinen Code umstrukturieren und dann mit dem Debugger noch einmal überprüfen. Fals ich dann immer noch fragen haben sollte, kann ich mich ja hier melden
Völlig OT, aber nötig:
Es ist kein Script! Es ist ein Programm. C++ ist KEINE Skriptsprache, demnach hier KEIN Script.Ah Ok und schon bin ich ein bisschen klüger geworden^^
-
Dürfte ich mal so ganz nebenbei wissen, wie alt du bist? (Meinetwegen auch E-Mail)
-
Ich verstehe gerade nicht was mein Code mit meinem Alter zutun hat.
-
mascerade schrieb:
Ich verstehe gerade nicht was mein Code mit meinem Alter zutun hat.
Naja, ich führe Statistiken. Würde ich gerne wissen; wobei ich dir doch schon so viel erklärt habe.