begin process at 2012 02 12 12:58:31
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

OpenGL

 > 

affichage d'une grande grille


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

affichage d'une grande grille

mardi 22 février 2005 à 09:07:32 | affichage d'une grande grille

gillescpp

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club

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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,888 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales