Ĺadny brzuch
Pisze program z użyciem OpenGLa. Muszę wczytać trójwymiarową scenę stworzoną w Blenderze i wyeksportowaną do pliku OBJ. Mam jednak jakiś dziwny błąd, z którym nie wiem co zrobić. Najprawdopodobniej to jakiś drobiazg, tylko ja go nie widzę. W Turbo C++ wczytywał mi do pliku element int omijając pierwszą cyfrę z linii. W C++ Builderze pojawia się Access Violation. Męcze sięz tym bardzo długo i nie wiem co jest źle. Proszę o pomoc.
Szczególne problemy występują w liniach:
else if(e1=='f'){ //µciany glBegin(GL_QUADS); for(int i=0; i<4;i++) { plik >> dane_do_sciany[0]; //1 znak if(!plik){ cout << "Blad otwarcia pliku " << l_pom << " " << i << endl; system("pause"); } cout << "Wczytane: " << test << endl; //system("pause"); //cout << dane_do_sciany[][] << endl; //system("@pause >> NULL"); if(plik.peek()!='/'){ //jeµli prawda, 2 i 3 znak to liczby plik >> dane_do_sciany[1] >> dane_do_sciany[2]; } else{ //jest znak / plik >> temp; if(plik.peek()=='/'){ //tylko 2 liczby dane_do_sciany[1]=0; //oznacza, że tu nic nie ma plik >> dane_do_sciany[2]; } else //3 liczby plik >> dane_do_sciany[1] >> temp >> dane_do_sciany[2]; } glVertex3f(wierzcholki[dane_do_sciany[0]][0], wierzcholki[dane_do_sciany[0]][1], wierzcholki[dane_do_sciany[0]][2]); glNormal3f(wektory_normalne[dane_do_sciany[2]][0], wektory_normalne[dane_do_sciany[2]][1], wektory_normalne[dane_do_sciany[2]][2]); glEnd(); } }
Cała problematyczna funkcja to:
void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); double wierzcholki[3000][3]; double wektory_normalne[20][3]; double wierzcholki_tekstur[100][3]; ifstream plik; ofstream plik2; plik.open("labirynt_Scene.obj"); if(!plik){ cout << "Blad otwarcia pliku" << endl; system("pause"); } char element[100]; char e1,e2; double x,y,z; int k=1; //licznik wierzchołków int l=1; //licznik wektorów normalnych int m=1; //licznik tekstur int l_pom=0; //ponieważ w pliku obj wierzchołki i wektory normalne sĹĄ liczone od 1, //dla uproszczenia pomijam indeks 0 int dane_do_sciany[3]; int test; char temp; while(!plik.eof()){ plik >> e1 >> e2; //cout << "l_pom= " << l_pom << endl; if(l_pom==1057) cout << " " << e1 << " " << e2 << endl; /*if(!plik){ cout << "Blad otwarcia pliku " << l << endl; system("pause"); }*/ //cout << e1 << " " << e2 << endl; //system("@pause >> NULL"); //cout << e1; l_pom++; //system("pause"); //cout << e1 << " "; if(e1=='v'&&e2=='n'){ //wektory normalne plik >> wektory_normalne[l][0] >> wektory_normalne[l][1] >> wektory_normalne[l][2]; l++; } else if(e1=='v'&&e2=='t'){ //tekstury plik >> wierzcholki_tekstur[m][0] >> wierzcholki_tekstur[m][1] >> wierzcholki_tekstur[m][2]; m++; } else if(e1=='v'){ //wierzchołki plik >> wierzcholki[k][0] >> wierzcholki[k][1] >> wierzcholki[k][2]; k++; } else if(e1=='f'){ //µciany glBegin(GL_QUADS); for(int i=0; i<4;i++) { plik >> dane_do_sciany[0]; //1 znak if(!plik){ cout << "Blad otwarcia pliku " << l_pom << " " << i << endl; system("pause"); } cout << "Wczytane: " << test << endl; //system("pause"); //cout << dane_do_sciany[][] << endl; //system("@pause >> NULL"); if(plik.peek()!='/'){ //jeµli prawda, 2 i 3 znak to liczby plik >> dane_do_sciany[1] >> dane_do_sciany[2]; } else{ //jest znak / plik >> temp; if(plik.peek()=='/'){ //tylko 2 liczby dane_do_sciany[1]=0; //oznacza, że tu nic nie ma plik >> dane_do_sciany[2]; } else //3 liczby plik >> dane_do_sciany[1] >> temp >> dane_do_sciany[2]; } glVertex3f(wierzcholki[dane_do_sciany[0]][0], wierzcholki[dane_do_sciany[0]][1], wierzcholki[dane_do_sciany[0]][2]); glNormal3f(wektory_normalne[dane_do_sciany[2]][0], wektory_normalne[dane_do_sciany[2]][1], wektory_normalne[dane_do_sciany[2]][2]); glEnd(); } } else{ //coµ innego (do pominięcia) //system("@pause >> NULL"); plik.getline(element,256); } } //glRotatef(angle,0.0f,1.0f,0.0f); //gluLookAt (gdzie, gdzie, gdzie, gdzie, gdzie, gdzie, gdzie, gdzie, gdzie); glFlush(); plik.close(); }
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Szczególne problemy występują w liniach:
else if(e1=='f'){ //µciany glBegin(GL_QUADS); for(int i=0; i<4;i++) { plik >> dane_do_sciany[0]; //1 znak if(!plik){ cout << "Blad otwarcia pliku " << l_pom << " " << i << endl; system("pause"); } cout << "Wczytane: " << test << endl; //system("pause"); //cout << dane_do_sciany[][] << endl; //system("@pause >> NULL"); if(plik.peek()!='/'){ //jeµli prawda, 2 i 3 znak to liczby plik >> dane_do_sciany[1] >> dane_do_sciany[2]; } else{ //jest znak / plik >> temp; if(plik.peek()=='/'){ //tylko 2 liczby dane_do_sciany[1]=0; //oznacza, że tu nic nie ma plik >> dane_do_sciany[2]; } else //3 liczby plik >> dane_do_sciany[1] >> temp >> dane_do_sciany[2]; } glVertex3f(wierzcholki[dane_do_sciany[0]][0], wierzcholki[dane_do_sciany[0]][1], wierzcholki[dane_do_sciany[0]][2]); glNormal3f(wektory_normalne[dane_do_sciany[2]][0], wektory_normalne[dane_do_sciany[2]][1], wektory_normalne[dane_do_sciany[2]][2]); glEnd(); } }
Cała problematyczna funkcja to:
void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); double wierzcholki[3000][3]; double wektory_normalne[20][3]; double wierzcholki_tekstur[100][3]; ifstream plik; ofstream plik2; plik.open("labirynt_Scene.obj"); if(!plik){ cout << "Blad otwarcia pliku" << endl; system("pause"); } char element[100]; char e1,e2; double x,y,z; int k=1; //licznik wierzchołków int l=1; //licznik wektorów normalnych int m=1; //licznik tekstur int l_pom=0; //ponieważ w pliku obj wierzchołki i wektory normalne sĹĄ liczone od 1, //dla uproszczenia pomijam indeks 0 int dane_do_sciany[3]; int test; char temp; while(!plik.eof()){ plik >> e1 >> e2; //cout << "l_pom= " << l_pom << endl; if(l_pom==1057) cout << " " << e1 << " " << e2 << endl; /*if(!plik){ cout << "Blad otwarcia pliku " << l << endl; system("pause"); }*/ //cout << e1 << " " << e2 << endl; //system("@pause >> NULL"); //cout << e1; l_pom++; //system("pause"); //cout << e1 << " "; if(e1=='v'&&e2=='n'){ //wektory normalne plik >> wektory_normalne[l][0] >> wektory_normalne[l][1] >> wektory_normalne[l][2]; l++; } else if(e1=='v'&&e2=='t'){ //tekstury plik >> wierzcholki_tekstur[m][0] >> wierzcholki_tekstur[m][1] >> wierzcholki_tekstur[m][2]; m++; } else if(e1=='v'){ //wierzchołki plik >> wierzcholki[k][0] >> wierzcholki[k][1] >> wierzcholki[k][2]; k++; } else if(e1=='f'){ //µciany glBegin(GL_QUADS); for(int i=0; i<4;i++) { plik >> dane_do_sciany[0]; //1 znak if(!plik){ cout << "Blad otwarcia pliku " << l_pom << " " << i << endl; system("pause"); } cout << "Wczytane: " << test << endl; //system("pause"); //cout << dane_do_sciany[][] << endl; //system("@pause >> NULL"); if(plik.peek()!='/'){ //jeµli prawda, 2 i 3 znak to liczby plik >> dane_do_sciany[1] >> dane_do_sciany[2]; } else{ //jest znak / plik >> temp; if(plik.peek()=='/'){ //tylko 2 liczby dane_do_sciany[1]=0; //oznacza, że tu nic nie ma plik >> dane_do_sciany[2]; } else //3 liczby plik >> dane_do_sciany[1] >> temp >> dane_do_sciany[2]; } glVertex3f(wierzcholki[dane_do_sciany[0]][0], wierzcholki[dane_do_sciany[0]][1], wierzcholki[dane_do_sciany[0]][2]); glNormal3f(wektory_normalne[dane_do_sciany[2]][0], wektory_normalne[dane_do_sciany[2]][1], wektory_normalne[dane_do_sciany[2]][2]); glEnd(); } } else{ //coµ innego (do pominięcia) //system("@pause >> NULL"); plik.getline(element,256); } } //glRotatef(angle,0.0f,1.0f,0.0f); //gluLookAt (gdzie, gdzie, gdzie, gdzie, gdzie, gdzie, gdzie, gdzie, gdzie); glFlush(); plik.close(); }