Affichage d'une grande grille

[Résolu]
Signaler
Messages postés
33
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
22 octobre 2007
-
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
-
Bonjour



J'ai un probleme avec opengl

J'ai ecris un petit code qui génère une grille en triangles et les
affiche si on le lui demande. Il possede aussi une possibilité de
mouvements... celle ci ne fonctionne qu'avec SDL



Mon probleme est qu'il ne peut pas afficher une grille de plus de 30 * 30.



Voici mon code :



#include "terrain.h"

#include "math.h"





GRILLE::GRILLE(int X, int Y, float taille_case)

{

//pour creer une grille

this->angleX this->angleY this->distance = 0.0f;

this->distance = 2.0f;



this->iselect = 0;

this->X = X+1;

this->Y = Y+1;

this->taille_case = taille_case;

this->x = 0.0f;

this->y = 0.0f;

this->z = 1.2f;

this->px = 0.0f;

this->py = 0.0f;

this->pz = -100.0f;

}



//recoit les messages quon lui envoie

//effectue certaines taches

void GRILLE::message_sdl(int msg)

{

printf("Message recu %d\n", msg);

//calcul des positions

switch(msg)

{

case 273 : camera_bouge( 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f); break;

case 274 : camera_bouge( -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); break;

case 275 : camera_bouge( 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f); break;

case 276 : camera_bouge( 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f); break;

case 280 : camera_bouge( 0.0f, 0.0f, 0.01f, 0.0f, -0.01f, 0.0f); break;

case 281 : camera_bouge( 0.0f, 0.0f, -0.01f, 0.0f, 0.01f, 0.0f); break;





case 104 : this->coordonnees[iselect*3+1] += 0.1f; break;

case 98 : this->coordonnees[iselect*3+1] -= 0.1f; break;



case 113 : if(iselect < X*Y)

{

this->iselect++;

}

break;

case 115 : if(iselect > 0)

{

this->iselect--;

}

break;

case 119 : if(iselect >= Y)

iselect-=Y;

break;

case 120 : if(iselect+Y <= X*Y)

iselect+=Y;

break;

}

this->afficher();

}



//bouger le point de vue de la camera

void GRILLE::camera_bouge(float x,float y, float z, float px, float py, float pz)

{

//rotation du degré X

if((angleX + x) > 359)

angleX = (angleX+x) - 359;

else if((angleX +x) < 0)

angleX = 359 - (angleX +x);

else

angleX += x;

//rotation du degré Y

if((angleY + y) > 359)

angleY = (angleY+y) - 359;

else if((angleY +y) < 0)

angleY = 359 - (angleY +y);

else

angleY += y;

this->distance += z;

}





// creer les points de la grille

void GRILLE::creer()

{

int nombre 0, index 0, pindex = 0;

this->coordonnees = new float[X * Y * 3];

this->liste_points = new int[X * Y * 6];

//creation des points

for(int i = 0; i < this->X; i++)

{

for(int j = 0; j < this->Y; j++)

{

// point en haut a gauche

this->coordonnees[index++] = i*this->taille_case; // X

this->coordonnees[index++] = 0.0f; // Y

this->coordonnees[index++] = j*this->taille_case; // Z

}

}

//creation des faces

for(int j = 0; j < (X-1)*Y ; j+= Y)

{

for(int i = 0 ; i < Y-1; i++)

{

int a = j;

this->numfaces++;

this->liste_points[pindex++] = i + a ;

this->liste_points[pindex++] = i + a + Y;

this->liste_points[pindex++] = i + a + 1;

this->numfaces++;

this->liste_points[pindex++] = i + a + Y;

this->liste_points[pindex++] = i + a + (Y+1);

this->liste_points[pindex++] = i + a + 1;

}

}



//center la vue sur et par dessus la grille

//camera_bouge(this->X/2, this->Y/2, 1.2f, 0.0f, 0.0f, 0.0f);

}



// afficher

void GRILLE::afficher()

{

glDisable(GL_LIGHTING);

int index = 0;

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glDepthRange(0.0f, 100.0f);

glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, 1.0f, 100.0f);



glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glColor3f(1.0f, 0.0f, 0.0f);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity();

glRotatef(angleX, 1.0f, 0.0f, 0.0f);

glRotatef(angleY, 0.0f, 1.0f, 0.0f);

glTranslatef(0.0f, 0.0f, -distance);



glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, this->coordonnees);

glDrawElements(GL_TRIANGLES, this->numfaces*3, GL_UNSIGNED_INT, this->liste_points);







//imprimer un gros point vert

glColor3f(0.0f, 1.0f, 0.0f);

glPointSize(5.0f);

glBegin(GL_POINTS);

glVertex3fv(&this->coordonnees[this->iselect*3]);

glEnd();

}



Si quelqu'un a une idée, ce n'est pas de refus.

Merci



Nicolas

3 réponses

Messages postés
33
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
22 octobre 2007

le probleme est partielement résolu.



Il sagit d'un probeme qui se pose avec la commande glDrawElements() qui
ne doit pas accepter que le tableau d'indices ne dépasse une certaine
taille.



en remplacant :



glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, this->coordonnees);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, this->liste_points);



par :



for(int a = 0; a < X*Y*6; a+=3)

{

glBegin(GL_TRIANGLES);

glVertex3fv(&this->coordonnees[liste_points[a]*3]);

glVertex3fv(&this->coordonnees[liste_points[a+1]*3]);

glVertex3fv(&this->coordonnees[liste_points[a+2]*3]);

glEnd();

}



reste que ca va etre plus lent mais le programme fonctionne, c'est le principal.
Messages postés
33
Date d'inscription
mercredi 19 février 2003
Statut
Membre
Dernière intervention
22 octobre 2007

Ce message est nul et non avenu.

Je vais remanier la création de la grille (les index ) car après
vérification, ils sont foireux. De plus, opengl semble avoir certaines
limites dont il faudra que je tienne compte.

Quant tout fonctionnera correctement, je le remettrait en ligne
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
fais glDrawArray et pas glDrawElement, OpenGL n'est pas limite il affiche ce que tu envoies, la seule limite c'est la RAM pleine a craquée !!!!.
Et apres un glEnableClientState(GL_XXX_ARRAY) et apres avoir afficher, on appelle glDisableClientState(GL_XXX_ARRAY).

Ensuite glClearColor(0.0f, 0.0f, 0.0f, 1.0f); se fait dans l'initailisation, n'oublies pas qu'OpenGL est une machine a états.

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glDepthRange(0.0f, 100.0f);
glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, 1.0f, 100.0f);
cela se fait dans un resizeGL ou un reshape et je vois pas a quoi te sert glDepthRange ici

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); meme histoire que pour le glClearColor si tu ne compte pas le changer fait le dans un initialize (en plus je crois que c'est l'etat par defaut du glPolygonMode)

glPointSize(5.0f); idem que glPolygonMode

Les this-> partout c'est pas top ne l'utilise que si tu as des conflits de variables ou les cas habituels.