qu'est-ce qui foire là-dedans?
C'est censé charger un modèle 3D à partir d'un fichier PLY structuré ainsi: d'abord on a le nombre de points, puis le nombre de facettes, puis les coordonnées de chaque point, puis (dernière partie du fichier) pour chaque facette, le nombre de pts qui la compose et l'indice de chacun d'eux.
exemple:
3
1
4.56 2.16 0.45
456.0 4.3 9.2
0.22 0.11 0.33
3 1 2 3
et voici le code (désolé pour la taille):
#include <fstream.h>
#include <iostream.h>
#include <GL/glut.h>
#include <stdlib.h>
GLfloat * tete;
GLuint * face;
GLuint * ppface;
int nbpts,nbface;
GLint a=0,s=0,d=0,f=0,un=0,deux=0;
GLfloat n=0,b=0,o=0;
double z=0;
int LightPos[4] = {0,0,3,1};
float MatSpec [4] = {1.f,1.f,1.f,1.f};
float MatDif[4] = {.8f,.8f,.5f,1.f};
float MatAmb[4] = {.8f,.8f,.5f,1.f};
float LightDif[4] = {.6f,1.f,1.f,1.f};
float LightSpec[4] = {.6f,1.f,1.f,1.f};
float LightAmb[4] = {.1f,.1f,.1f,1.f};
void tabcoord(char * fic,GLfloat *& tete, GLuint *& fct, GLuint *& ppf, int & nbp, int & nbf)
{
ifstream i(fic);
if (i)
{
int nbpts, nbface; //variables contenant le nb de pts et de faces
int toupts=0; //variable contenant le nb total d'indices de pts pour les facettes
int j=0,k=0; //compteurs
GLfloat * ptet;
i>>nbpts>>nbface;
nbp=nbpts;
nbf=nbface;
tete=new GLfloat [nbpts*3]; //tet contient toutes les coordonnées de chaque point
float tmpf; //variable temporaire utilisée pour remplir tet
ptet=&(tete[0]);
for (j;j<nbpts*3;j++,ptet++) //remplissage de tet
{
i>>tmpf;
cout<<"ayhi"<<endl;
*ptet=tmpf; /*PLANTAGE*/
cout<<"ayho"<<endl;
}
unsigned int tmpui,crotte; //variables temporaires tmpui pour remplir ppf et face crotte pour se déplacer dans le flot
ppf=new GLuint [nbface]; //ppf contient le nombre de points constituant chaque facette
for (j=0;j<nbface;j++) //remplissage de ppf
{
i>>tmpui;
ppf[j]=tmpui;
toupts+=tmpui;
for(k;k<tmpui;k++) //on se place au prochain nombre de pts
{
i>>crotte;
}
}
i.seekg(0); //retour au début du flot
for(j=0;j<=(2+nbpts*3);j++) //on se place sur le 1er indice de point de la 1ere facette
{
i>>crotte;
}
fct=new GLuint [toupts]; //fct contient tous les indices de chaque facette
GLuint * cont=&fct[0]; //variable servant à se positionner dans fct
for(j=0;j<nbface;j++) //remplissage de fct
{
for(k=0;k<ppf[j];k++,cont++)
{
i>>tmpui;
*cont=tmpui;
}
i>>crotte;
}
}
else cout<<"Erreur lors de l'ouverture du fichier";
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h); // Le viewport remplit tout l'écran
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective (45.0, (GLfloat) w/ (GLfloat) h, 0.0001, 135.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -15.0);/*
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,
1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h,
1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();*/
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,6,6,0,0,0,0,1,0);
glRotatef(f,1,0,0);
glRotatef(un,0,1,0);
glRotatef(deux,0,0,1);
glTranslatef(n,o,b);
glRotated(z,0,1,0);
glTranslatef(0.0,0.0,6.0);
glDisable(GL_LIGHTING);
glBegin(GL_POINTS);
glVertex3iv(LightPos);
glEnd();
glEnable(GL_LIGHTING);
glTranslatef(0.0,0.0,-6.0);
glLightiv(GL_LIGHT0,GL_POSITION,LightPos);
glRotated(-z,0,1,0);
glPushMatrix();
glTranslatef(0.0,-0.3,1.0);
glRotatef(a,1,0,0);
glRotatef(s,0,1,0);
glRotatef(d,0,0,1);
//glColor3f(1.0,0.0,0.0);
glBegin(GL_POLYGON);
int j;
for(int i=0;i<nbface;i++)
{
//glColor3f((GLfloat)i/nbface,(GLfloat)i/nbface,(GLfloat)i/nbface);
for(j=0;j<ppface[i];j++)
glVertex3f(tete[face[j]*3],tete[face[j]*3+1],tete[face[j]*3+2]);
}
glEnd();
glPopMatrix();
//glutSolidSphere(1,50,50);
z+=4;
glutSwapBuffers();
glutPostRedisplay();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glEnableClientState(GL_INDEX_ARRAY);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,MatSpec);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,MatDif);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,MatAmb);
glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,50);
glLightfv(GL_LIGHT0,GL_DIFFUSE,LightDif);
glLightfv(GL_LIGHT0,GL_SPECULAR,LightSpec);
glLightfv(GL_LIGHT0,GL_AMBIENT,LightAmb);
glEnable(GL_DEPTH_TEST); // Active le test de profondeur
glEnable(GL_LIGHTING); // Active l'éclairage
glEnable(GL_LIGHT0);
glMatrixMode(GL_MODELVIEW);
glPointSize(3);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
//rotation du modele axe des X
case 'a': a+=5;if (a>=360)a=0;glutPostRedisplay();break;
case 'A': a-=5;if (a<=0)a=360;glutPostRedisplay();break;
//rotation du modele axe des Y
case 's': s+=5;if (s>=360)s=0;glutPostRedisplay();break;
case 'S': s-=5;if (s<=0)s=360;glutPostRedisplay();break;
//rotation du modele axe des Z
case 'd': d+=5;if (d>=360)d=0;glutPostRedisplay();break;
case 'D': d-=5;if (d<=0)d=360;glutPostRedisplay();break;
//rotation de la vue axe des X
case '4': f+=5;if (f>=360)f=0;glutPostRedisplay();break;
case '1': f-=5;if (f<=0)f=360;glutPostRedisplay();break;
//rotation de la vue axe des Y
case '5': un+=5;if (un>=360)un=0;glutPostRedisplay();break;
case '2': un-=5;if (un<=0)un=360;glutPostRedisplay();break;
//rotation de la vue axe des Z
case '6': deux+=5;if (deux>=360)deux=0;glutPostRedisplay();break;
case '3': deux-=5;if (deux<=0)deux=360;glutPostRedisplay();break;
//translation de la vue axe des X
case 'v': n-=0.1;glutPostRedisplay();break;
case 'n': n+=0.1;glutPostRedisplay();break;
//translation de la vue axe des Y
case 'k': b+=0.1;glutPostRedisplay();break;
case 'i': b-=0.1;glutPostRedisplay();break;
//translation de la vue axe des Z
case 'h': o+=0.1;glutPostRedisplay();break;
case 'b': o-=0.1;glutPostRedisplay();break;
//affichage des valeurs des variables
case 'l': cout<<"a:"<<a<<"\ns:"<<s<<"\nd:"<<d<<"\nf:"<<f<<"\nun:"<<un<<"\ndeux:"<<deux<<"\nn:"<<n<<"\nb:"<<b<<"\no:"<<o<<endl;break;
//exit
case 'x': exit(0);break;
//reset
case 'r': a=s=d=n=b=o=f=un=deux=0;glutPostRedisplay();break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
tabcoord("Generic.ply",tete,face,ppface,nbpts,nbface);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
delete tete;
delete face;
return 0;
}
Ca plante là où j'ai mis que ça plantait.
Merci de votre aide!
---------------
La néantiseation de l'en-soi est une ontologie post-husserlienne