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)

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é 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

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.