Accueil > Forum > > > > affichage d'une grande grille
affichage d'une grande grille
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ée 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
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|