19/07/10 11:10
Ho cercato a lungo su internet per vedere se c'èra una funzione delle OpenGL che mi permettesse di caricare i file .obj ma non ho trovato nulla.
Allora ho pensato di creare io un loader per quei file.
Funziona tutto ma anziche disegnare un cubo, mi fa apparire una figura un po' strana.
Il codice è commentato ma se non capite chiedete.
Questo è il file .h con la funzione del loader
e questo è il main.cpp
e questo è il file tank2.obj
(lo metto come codice per facilitare la lettura)
aspetto risposte!
Allora ho pensato di creare io un loader per quei file.
Funziona tutto ma anziche disegnare un cubo, mi fa apparire una figura un po' strana.
Il codice è commentato ma se non capite chiedete.
Questo è il file .h con la funzione del loader
/* breve spiegazione : ogni punto che voglio disegnare sullo schermo ha tre coordinate, scritte come float è per questo che uso gli arrai bidimensionali */ #include<iostream> #include<string> #include<GL/gl.h> #include<GL/glut.h> #define MAX_VERT 100000 using namespace std; void load(char *filename) { float coordVert[MAX_VERT][3];//creo un array bidimensionale con le cordinate del vertice da inserire nella funzione //glVertex3f(%f,%f,%f); int vertPos[MAX_VERT][3]; //file position della dichiarazione del vertice for(int o = 0;o <= MAX_VERT;o++) for(int n = 1;n <= 3; n++) { coordVert[o][n] = 0; vertPos[o][n] = 0; } int numbLine = 0; //numero di linee int numbVert = 0;// numero dei vertici int c[MAX_VERT]; //per fgetc() int numbChar = 0; //numero caratteri totali FILE* obj; //stream per leggere il file int i = 0;//vettore di c[] int x = 1;//seconda dimensione dell'array cout<<"inizio\n"; for(int p = 0;p <= MAX_VERT;p++) c[p] = 0; //inizializzo 'c' cout<<"c inizializzata\n"; obj = fopen(filename,"r"); //apro il file lo stream in lettura cout<<"stream aperto\n"; cout<<"ora leggo il file\n"; while((c[i] = fgetc(obj)) != EOF)//memorizza ogni carattere della riga in un elemento del vettore di 'c' { ++numbChar;//conto i caratteri, non è che mi serva a molto ma l'avevo messo all'inizio per vedere se funzionava tutto if(c[i] == '\n'){ ++numbLine; cout<<"\nriga "<<numbLine<<" letta\n"; } if(c[i] == 'v' && c[i-1] == '\n') //se incontra una 'v' che segue un carattere newline aumenta il numero dei vertici { ++numbVert;//aumento il numero dei vertici vertPos[numbVert][x] = (ftell(obj)+1);//memorizzo la file position delle 3 coordinate di ogni punto cout<<"\nposizione coodinata 1 punto "<<numbVert<<" memorizzata\n"; cout<<"file position 1 punto "<<numbVert<<" : "<<vertPos[numbVert][x]<<endl; ++x; vertPos[numbVert][x] = (ftell(obj)+10); cout<<"\nposizione coodinata 2 punto "<<numbVert<<" memorizzata\n"; cout<<"file position 2 punto "<<numbVert<<" : "<<vertPos[numbVert][x]<<endl; ++x; vertPos[numbVert][x] = (ftell(obj)+20); cout<<"\nposizione coodinata 3 punto "<<numbVert<<" memorizzata\n"; cout<<"file position 3 punto "<<numbVert<<" : "<<vertPos[numbVert][x]<<endl; if(x >= 3)x = 1; } ++i; } cout<<"\nfine del file\n"; int a = numbVert; cout<<"assegno le coordinate\n"; for(numbVert = 0;numbVert <= a;++numbVert) for(x = 1;x <= 3;x++) { fseek(obj,vertPos[numbVert][x],SEEK_SET);//ottengo la file position delle cordinate fscanf(obj,"%f",&coordVert[numbVert][x]);//e le leggo con fscanf e le assegno a coordVert } for(numbVert = 1;numbVert <= a;++numbVert) { cout<<"\nCoordinata 1 punto "<<numbVert<<" "<<coordVert[numbVert][1]<<endl; cout<<"Coordinata 2 punto "<<numbVert<<" "<<coordVert[numbVert][2]<<endl; cout<<"Coordinata 3 punto "<<numbVert<<" "<<coordVert[numbVert][3]<<endl; } cout<<"disegnoo!!\n"; glLoadIdentity(); glBegin(GL_POLYGON); glColor3f(0.0f,0.0f,1.0f); for(numbVert = 1;numbVert <= a;++numbVert) { //per ogni vertice c'è glVertex3f con le varie coordinate di ogni punto glVertex3f(coordVert[numbVert][1],coordVert[numbVert][2],coordVert[numbVert][3]); } glEnd(); cout<<"Disegnato!\n"<<endl; cout<<"\n numero vertici "<<a<<endl; fclose(obj); }
e questo è il main.cpp
#include "loader_obj.h" #include<iostream> #include<GL/gl.h> #include<GL/glut.h> using namespace std; void renderPrimitive(void); void display(void) { glClearColor(1.f,0.f,0.f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-5.0f); renderPrimitive(); glFlush(); } void renderPrimitive(void) { load("tank2.obj"); } void reshape(int width,int height) { glViewport(0,0,(GLsizei)width, GLsizei(height) ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, (GLfloat)width / (GLfloat)height,1.0,100.0); glMatrixMode(GL_MODELVIEW); } main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE); glutInitWindowSize(640,480); glutInitWindowPosition(500,500); glutCreateWindow("My first Opengl Window!!!"); glutDisplayFunc( display ); glutReshapeFunc( reshape); glutMainLoop(); }
e questo è il file tank2.obj
(lo metto come codice per facilitare la lettura)
mtllib tank2.mtl v 0.525662 -1.061759 -1.825004 v 0.525662 -1.061759 0.174996 v -1.474339 -1.061759 0.174996 v -1.474338 -1.061759 -1.825005 v 0.525662 0.938241 -1.825004 v 0.525661 0.938241 0.174996 v -1.474339 0.938241 0.174995 v -1.474338 0.938241 -1.825004 usemtl (null) s off f 1 2 3 4 f 5 8 7 6 f 1 5 6 2 f 2 6 7 3 f 3 7 8 4 f 5 1 4 8
aspetto risposte!
Ultima modifica effettuata da 19/07/10 11:37