Oppure

Loading
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

/* 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
19/07/10 11:54
TheKaneB
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 19/07/10 11:55
aaa
19/07/10 12:15
mmm....però quando le stampo a video, le coordinate sono tutte giuste