Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - loader di file .obj per le OpenGL
Forum - C/C++ - loader di file .obj per le OpenGL

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
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

Codice sorgente - presumibilmente C++

  1. /* breve spiegazione : ogni punto che voglio disegnare sullo schermo ha tre coordinate, scritte come float
  2.   è per questo che uso gli arrai bidimensionali */
  3.  
  4.  
  5. #include<iostream>
  6. #include<string>
  7. #include<GL/gl.h>
  8. #include<GL/glut.h>
  9. #define MAX_VERT 100000
  10.  
  11. using namespace std;
  12.  
  13. void load(char *filename)
  14. {
  15.  
  16.     float coordVert[MAX_VERT][3];//creo un array bidimensionale con le cordinate del vertice da inserire nella funzione
  17.                 //glVertex3f(%f,%f,%f);
  18.     int   vertPos[MAX_VERT][3]; //file position della dichiarazione del vertice
  19.     for(int o = 0;o <= MAX_VERT;o++)
  20.         for(int n = 1;n <= 3; n++)
  21.            {
  22.                coordVert[o][n] = 0;
  23.                vertPos[o][n] = 0;
  24.            }
  25.  
  26.     int numbLine = 0; //numero di linee
  27.  
  28.     int numbVert = 0;// numero dei vertici
  29.     int c[MAX_VERT]; //per fgetc()
  30.     int numbChar = 0; //numero caratteri totali
  31.     FILE* obj; //stream per leggere il file
  32.     int i = 0;//vettore di c[]
  33.     int x = 1;//seconda dimensione dell'array
  34.     cout<<"inizio\n";
  35.     for(int p = 0;p <= MAX_VERT;p++)
  36.          c[p] = 0; //inizializzo 'c'
  37.     cout<<"c inizializzata\n";
  38.  
  39.     obj = fopen(filename,"r"); //apro il file lo stream in lettura
  40.     cout<<"stream aperto\n";
  41.  
  42.     cout<<"ora leggo il file\n";
  43.  
  44.  
  45.     while((c[i] = fgetc(obj)) != EOF)//memorizza ogni carattere della riga in un elemento del vettore di 'c'
  46.     {
  47.         ++numbChar;//conto i caratteri, non è che mi serva a molto ma l'avevo messo all'inizio per vedere se funzionava tutto
  48.         if(c[i] == '\n'){
  49.                          ++numbLine;
  50.                          cout<<"\nriga "<<numbLine<<" letta\n";
  51.         }
  52.         if(c[i] == 'v' && c[i-1] == '\n')   //se incontra una 'v' che segue un carattere newline aumenta il numero dei vertici
  53.  
  54.        {
  55.  
  56.  
  57.  
  58.  
  59.                      ++numbVert;//aumento il numero dei vertici
  60.                      vertPos[numbVert][x] = (ftell(obj)+1);//memorizzo la file position delle 3 coordinate di ogni punto
  61.                      cout<<"\nposizione coodinata 1 punto "<<numbVert<<" memorizzata\n";
  62.                      cout<<"file position 1 punto "<<numbVert<<" : "<<vertPos[numbVert][x]<<endl;
  63.                      ++x;
  64.                      vertPos[numbVert][x] = (ftell(obj)+10);
  65.                      cout<<"\nposizione coodinata 2 punto "<<numbVert<<" memorizzata\n";
  66.                      cout<<"file position 2 punto "<<numbVert<<" : "<<vertPos[numbVert][x]<<endl;
  67.  
  68.                      ++x;
  69.                      vertPos[numbVert][x] = (ftell(obj)+20);
  70.                      cout<<"\nposizione coodinata 3 punto "<<numbVert<<" memorizzata\n";
  71.                      cout<<"file position 3 punto "<<numbVert<<" : "<<vertPos[numbVert][x]<<endl;
  72.  
  73.                      if(x >= 3)x = 1;
  74.  
  75.         }
  76.  
  77.  
  78.         ++i;
  79.       }
  80.  
  81.     cout<<"\nfine del file\n";
  82.  
  83.     int a = numbVert;
  84.    cout<<"assegno le coordinate\n";
  85.    for(numbVert = 0;numbVert <= a;++numbVert)
  86.       for(x = 1;x <= 3;x++)
  87.                        {
  88.                            fseek(obj,vertPos[numbVert][x],SEEK_SET);//ottengo la file position delle cordinate
  89.                            fscanf(obj,"%f",&coordVert[numbVert][x]);//e le leggo con fscanf e le assegno a coordVert
  90.                        }
  91.  
  92.     for(numbVert = 1;numbVert <= a;++numbVert)
  93.     {
  94.  
  95.      cout<<"\nCoordinata 1 punto "<<numbVert<<" "<<coordVert[numbVert][1]<<endl;
  96.      cout<<"Coordinata 2 punto "<<numbVert<<" "<<coordVert[numbVert][2]<<endl;
  97.      cout<<"Coordinata 3 punto "<<numbVert<<" "<<coordVert[numbVert][3]<<endl;
  98.     }
  99.  
  100.    cout<<"disegnoo!!\n";
  101.  
  102.  
  103.     glLoadIdentity();
  104.     glBegin(GL_POLYGON);
  105.     glColor3f(0.0f,0.0f,1.0f);
  106.  
  107.     for(numbVert = 1;numbVert <= a;++numbVert)
  108.     {                                            //per ogni vertice c'è glVertex3f con le varie coordinate di ogni punto
  109.  
  110.         glVertex3f(coordVert[numbVert][1],coordVert[numbVert][2],coordVert[numbVert][3]);
  111.     }
  112.  
  113.  
  114.  
  115.     glEnd();
  116.  
  117.   cout<<"Disegnato!\n"<<endl;
  118.   cout<<"\n numero vertici "<<a<<endl;
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.     fclose(obj);
  126.  
  127.  
  128. }




e questo è il main.cpp
Codice sorgente - presumibilmente C++

  1. #include "loader_obj.h"
  2. #include<iostream>
  3. #include<GL/gl.h>
  4. #include<GL/glut.h>
  5.  
  6. using namespace std;
  7. void renderPrimitive(void);
  8.  
  9.  
  10. void display(void)
  11. {
  12.  
  13.     glClearColor(1.f,0.f,0.f,1.0f);
  14.     glClear(GL_COLOR_BUFFER_BIT);
  15.     glLoadIdentity();
  16.     glTranslatef(0.0f,0.0f,-5.0f);
  17.     renderPrimitive();
  18.  
  19.     glFlush();
  20. }
  21.  
  22.  
  23.  
  24. void renderPrimitive(void)
  25.   {
  26.        load("tank2.obj");
  27.       }
  28.  
  29.  
  30.  
  31.  
  32. void reshape(int width,int height)
  33. {
  34.    glViewport(0,0,(GLsizei)width, GLsizei(height) );
  35.    glMatrixMode(GL_PROJECTION);
  36.    glLoadIdentity();
  37.    gluPerspective(60, (GLfloat)width / (GLfloat)height,1.0,100.0);
  38.    glMatrixMode(GL_MODELVIEW);
  39. }
  40.  
  41.  
  42.  
  43. main(int argc,char** argv)
  44. {
  45.     glutInit(&argc,argv);
  46.     glutInitDisplayMode(GLUT_SINGLE);
  47.     glutInitWindowSize(640,480);
  48.     glutInitWindowPosition(500,500);
  49.     glutCreateWindow("My first Opengl Window!!!");
  50.     glutDisplayFunc( display );
  51.  
  52.  
  53.     glutReshapeFunc( reshape);
  54.     glutMainLoop();
  55.  
  56. }



e questo è il file tank2.obj
(lo metto come codice per facilitare la lettura)
Codice sorgente - presumibilmente Plain Text

  1. mtllib tank2.mtl
  2. v 0.525662 -1.061759 -1.825004
  3. v 0.525662 -1.061759 0.174996
  4. v -1.474339 -1.061759 0.174996
  5. v -1.474338 -1.061759 -1.825005
  6. v 0.525662 0.938241 -1.825004
  7. v 0.525661 0.938241 0.174996
  8. v -1.474339 0.938241 0.174995
  9. v -1.474338 0.938241 -1.825004
  10. usemtl (null)
  11. s off
  12. f 1 2 3 4
  13. f 5 8 7 6
  14. f 1 5 6 2
  15. f 2 6 7 3
  16. f 3 7 8 4
  17. f 5 1 4 8



aspetto risposte! :-?:-?

Ultima modifica effettuata da il 19/07/2010 alle 13:37
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 13:54
Lunedì, 19/07/2010
aumentando la posizione del carattere corrente "a mano" (quei +10 e +20 non si possono guardare... >_< ) , te ne infischi altamente del fatto che alcuni numeri hanno il segno "-" davanti, contando quindi un carattere in più.

Devi utilizzare le normali funzioni di lettura da file del c++, senza fare pericolosi "jump" all'interno del file con offset inventati alla cieca...

Ultima modifica effettuata da TheKaneB il 19/07/2010 alle 13:55
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:15
Lunedì, 19/07/2010
mmm....però quando le stampo a video, le coordinate sono tutte giuste

PM Quote