|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : affichage d'une grande grille [ Archives / OpenGL ] (gillescpp)
Informations & options pour cette discussion
mardi 22 février 2005 à 09:07:32 |
affichage d'une grande grille

gillescpp
|
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
|
|
|
mercredi 23 février 2005 à 11:23:50 |
Re : affichage d'une grande grille

gillescpp
|
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
|
|
|
mercredi 23 février 2005 à 11:50:44 |
Re : affichage d'une grande grille

gillescpp
|
Réponse acceptée !
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.
|
|
|
jeudi 3 mars 2005 à 21:17:23 |
Re : affichage d'une grande grille

KeniiyK
|
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.
|
|
|
Cette discussion est classé dans : int, grille, case, 0f, iselect
Répondre à ce message
Sujets en rapport avec ce message
pourkoi sa marche pas [ par nazca ]
Le Zero de la programmationNazcaj'aimerais savoir pourkoi on ne pe pas faire une boucle avecla difference entre 2 heures.voici le code:{ CDialog::OnOK
Ou est l'erreur [ par nazca ]
Le Zero de la programmationNazcaj'aimerai savoir ou est l'erreur de mon programme,surtout pourkoi j'ai pas le droit de mettre Diff dans ma boucle Nomb
morpion [ par charon123 ]
Bon, 1), je suis débutant et je viens de commencer il y a une semaine. 2)j'utilise dev-cpp es ce que c'est bien? 3)alors voila, j'essaye de faire un m
C++ switch [ par blastmanu ]
Bonjour tt le monde!Et oui j'ai encore une question je voudrais savoir si il est possible de declarer une variable a l'interieur d'une boucle switchpa
bitte hilfe!!!!!!!!! [ par sansan_2 ]
Bonjour!!!!!!!! le programme c est un FIFO (ringpufffer) et j aimerais avoir une amelioration. Apres execution du programme, faire une tabulation, un
Aide event gtk+ / dev cpp / c++ [ par Toxiko ]
Ceci est le constructeur de ma case pour un jeu de plateauj'aurais aimé pouvoir appeler une fonction qui change l'image (gui_case::set(int i)) [cpp]g
3Dexplorateur : Comment utiliser les .cpp OpenGL [ par Amanobuo ]
Bonjours. J'ai fait un cube 100cm avec 3D studio max 6 et j ai enregistre en .3dsJ ai ouvert ce .3ds avec 3D explorateur pour l' enregistre sous .cpp
test morpion [ par nadml ]
nous programmons un morpion et nous avons un problème avec notre test de case valide ou pas est ceque quelqu'un pourrez nous aidez à résoudre notre p
URGENT :voila la sulution du SUDOKU avec recursivité,mais y a qq chose qui manque [ par imad_lol ]
merci de lire ma fonction de parcour (recursive).jai donné que des "0" a ma grille.donc y a au moin une solution.mon prg affiche les chiffe de "1" a "
GESTION CLAVIER SDL [ par Batman60 ]
voici un bout de code qui sert à me déplacer dans une scène 3D opengl ,le problème c'est qu'il faut à chaque fois appuyer sur la touche pour ce dépla
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|