IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

[Display lists] Rien ne s'affiche !!!


Sujet :

OpenGL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 8
    Points
    8
    Par défaut [Display lists] Rien ne s'affiche !!!
    Je tente d'afficher un cercle au centre de l'ecran... avec un display list (en mode 2D) : voici mon mode de fonctionnement

    déclaration globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLuint BalleDL; // id de ma DL
    initialisation de BalleDL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BalleDL = buildCircle();
    code de ma DL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    GLuint buildCircle()
    {
       GLint i;
       GLfloat cosine, sine;
    	GLuint iDL;
    	// Create the id for the list
    	iDL = glGenLists(1);
     
       glNewList(iDL, GL_COMPILE);
    		glColor3f(1.0, 0.0, 0.0);
          glBegin(GL_POLYGON);
             for(i=0;i<100;i++){
                cosine=cos(i*2*M_PI/100.0);
                sine=sin(i*2*M_PI/100.0);
                glVertex2f(cosine,sine);
             }
          glEnd();
       glEndList();
    	return iDL;
    }
    Puis code de l'appel, dans la fonction d'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void glutDisplay()
    {
      ....
      glPushMatrix();
    	 	glTranslatef(0.0,0.0,0.0);
    		glScalef(0.5,0.5,1);
    	 	glColor3f (1.0, 0.0, 0.0);
    	 	//gluDisk(m_obj,0.0,0.1,100/*nb_faces*/,1/*nbre de ss disques*/);
    	 	glCallList(BalleDL);
    	 glPopMatrix();
    ...
    }
    je précise que je dessine aussi un rectangle que je peut deplacer comme je le veut (fonctions gluts) et que cela marche au poil

    Mais qu'ai-je oublie???? merci bcp !!!
    Sincerily

  2. #2
    Membre à l'essai

    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 19
    Points
    19
    Par défaut
    Faudrait que tu nous montre comment tu as définis ta matrice de projection (le code de ta fonction « resize () »), car là ton cercle il marche bien chez moi. Ça ne vient pas de lui.

    (voire si tu pouvais nous montrer le code complet, s'il n'est pas trop long)

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,
    effectivement, rien n'est choquant dans ton code et cela parrait bizarre si tu affiche déjà un rectangle.
    Donc montre nous tout ton code.

    Juste deux petit détails (pour le principe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cosine=cos((GLfloat)i*2.0*M_PI/100.0);
    sine=sin((GLfloat)i*2.0*M_PI/100.0);
    Comme ca tout les types sont identiques.

    Et le "glTranslatef(0.0,0.0,0.0);" ne sert à rien !

    En attendant de voir le reste...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    bon ben je poste donc :

    code d'initialisation (dans un constructeur d'un classe CJeu)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    CJeu::CJeu(int x, int y, bool ecran, int argc, char **argv,bool serveur)
    {
    	m_serveur=serveur;
    	m_fenx=x;	//taille fenetre
    	m_feny=y;
    	vitesse_jeu=1000000;
    	//vitesse_jeu=100000;
    	BalleDL = buildCircle();
     
    	struct timeval currentTime;
     
    	currentTime.tv_sec  = 0;
     
    	currentTime.tv_usec = 0; 
     
        // gets the microseconds passed since app started
        gettimeofday(&currentTime, NULL);
    	tps2=currentTime.tv_usec+currentTime.tv_sec*1000000;
    	tps1=tps2;
    	//initialisation du plateau de jeu, joueurs, etc..
    	InitJeu();
     
     
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA | GLUT_MULTISAMPLE );
     
    // initialisation du GLUT
     
    	glutInit(& argc, argv);
     
    // taille et position de la fenetre
     
    	glutInitWindowSize(x, y);
    	glutInitWindowPosition(50, 50);
     
     
    // creation de la fenetre
     
    	glutCreateWindow("Pong");
     
     
    // affichage de la fenetre gere par la fonction Display()
     
    	glutDisplayFunc(glutDisplay);
     
        /*
           The function below are called when the respective event
           is triggered. Very simple, isn't it?
        */
        glutReshapeFunc(glutResize);       // called every time  the screen is resized
        glutDisplayFunc(glutDisplay);      // called when window needs to be redisplayed
        glutIdleFunc(glutPostRedisplay);         // called whenever the application is idle
        glutKeyboardFunc(glutKeyboard);    // called when the application receives a input from the keyboard
    	 glutKeyboardUpFunc(glutKeyboardUp);	//gestion du relachement des touches
    	 glutSpecialFunc(SpecialKeys);      // called when a special key is pressed like SHIFT
    	 glutSpecialUpFunc(SpecialKeysUp);	//gestion du relachement des touches speciales
        glutMouseFunc(glutMouse);          // called when the application receives a input from the mouse
        //glutMotionFunc(glutMotion);        // called when the mouse moves over the screen with one of this button pressed
     
        /*
            Do any lighting, material, alpha, etc initialization or
            configuration here.
        */
        InitializeOGL();
           Application's main loop. All the above functions
    	 are called whe the respective events are triggered
        */
    	glutMainLoop();
     
     
    }
    ma fonction initjeu ne touche rien a l'opengl, je ne la met pas pour plus de clarte

    fonction initogl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void InitializeOGL()
    {
        glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
        glShadeModel(GL_SMOOTH);
        return;
    }
    fonction de reshape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void glutResize(int width, int height)
    {
    	glViewport(0, 0, width, height);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluOrtho2D(0,0,width,height);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    }
    [edit] : oubli de ma fonction d'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    void glutDisplay()
    {	
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	// definition de la couleur de fond
     
     
    	 //dessiner un rectangle!!
    	 glColor3f (1.0, 0.0, 0.0);  /* the current RGB color is red: */
                                /* full red, no green, no blue. */
    	 glRectf(moi.getPositionx(),moi.getPositiony(),		//affiche moi
    	 			moi.getPositionx()+Normex(moi.getTaillex()),
    				moi.getPositiony()+Normey(moi.getTailley()));
     
    	 glRectf(adv.getPositionx(),adv.getPositiony(),		//affiche adversaire
    	 			adv.getPositionx()+Normex(adv.getTaillex()),
    				adv.getPositiony()+Normey(adv.getTailley()));
     
    	 glPushMatrix();
    glTranslatef(Normex(balle.getPositionx()),Normey(balle.getPositiony()),0.0);
    		glScalef(0.5,0.5,1);
    	 	glColor3f (1.0, 0.0, 0.0);
    	 	glCallList(BalleDL);
    	 glPopMatrix();
     
     
        CalculateFrameRate(); 
     
        //glFlush();
        glutSwapBuffers();
     
    	 //calcul de la nouvelle position des objets
    	 float m_posx_temp = moi.getPositionx()+moi.getVitesse()*(float)ecart*cos(moi.getAngle())/vitesse_jeu;
    	 float m_posy_temp = moi.getPositiony()+moi.getVitesse()*(float)ecart*sin(moi.getAngle())/vitesse_jeu;
     
    	 if(m_serveur==true)
    	 {
    	 	if(m_posx_temp>=0.0 && m_posx_temp<=(1.0-Normex(moi.getTaillex())))
    		{
    	 		moi.setPositionx(moi.getPositionx()+moi.getVitesse()*(float)ecart*cos(moi.getAngle())/vitesse_jeu);
    		}
    	 	if(m_posy_temp>=-1.0 && m_posy_temp<=1.0-Normey(moi.getTailley()))
    	 		moi.setPositiony(moi.getPositiony()+moi.getVitesse()*(float)ecart*sin(moi.getAngle())/vitesse_jeu);
    	 }	
     
     
    }

    voila, je n'ai pas mis les fonctions de gestion de touches, pas interessantes je pense... avec ca, je peut afficher deux rectangle, j'en deplace un avec 4 touches directionnelles sans bugs, avec gestion des bords... mais pas de cercle au centre grrrrr !
    Sincerily

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,
    as tu pensé à vérifier si ton gltranslate pour le cercle ne te fait pas sortir de l'écran ? Dans ton message d'origine, ton cercle semblait correcte.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Membre à l'essai

    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Points : 19
    Points
    19
    Par défaut
    Hum bizarre, chez moi ça s'affiche bien. Et si tu remplace ton glCallList(BalleDL) par glutSolidSphere (1.0f, 20, 20), t'as quelque chose ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    as tu pensé à vérifier si ton gltranslate pour le cercle ne te fait pas sortir de l'écran ? Dans ton message d'origine, ton cercle semblait correcte.
    oui, en realite ma balle est placee en (0,0) et pour le moment ne bouge pas.. ce n'est pas le probleme
    en ce qui concerne un glutsolidsphere... je vais tester de ce pas !
    Sincerily

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    ca fonctionne : j'ai une sphere qui rempli l'ecran (logique, les coordonnees de l'ecran sont definies entre -1.0 et 1.0, quelle que soit la definition)
    c'est rapide un glutSolidSphere (j'en ai pas besoin, mais bon si c'est joli c'est preferable)??

    parce que si c'est le cas, je garderai cette methode (en changeant la taile !!! ;-) )

    personne ne voit pourquoi ma callist ne fonctionne pas ??

    [edit] par contre la balle n'est pas ronde : comment peut on faire ?
    Sincerily

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Elle n'est pas ronde (et elle ne le sera jamais parfaitement) parce que tu la dessineavec assez peu de points. Essais avec 1000 points (ce qui est excessif) et tu véras que la courbe sera mieux.
    Au fait, as tu essayé de faire afficher la balle sans la gllist ???
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Elle n'est pas ronde (et elle ne le sera jamais parfaitement) parce que tu la dessineavec assez peu de points. Essais avec 1000 points (ce qui est excessif) et tu véras que la courbe sera mieux.
    Au fait, as tu essayé de faire afficher la balle sans la gllist ???
    par pasronde, je parlais de ovale ;-) je sais bien que le manque de faces la rend polygonée, non elle est ovale...

    Qu'entends tu par "afficher la balle sans la gllist"??? glutSolidSphere fonctionne, si c'est ce qu tu voulais savoir.. mais je pense plutot que je ne comprend pas bien ce que tu me demande .. snif :-(
    Sincerily

  11. #11
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Le fait quelle soit ovale vient s'en doute de ton glscale, si tu ne met pas les meme coefficients, ca va déformer ta balle.
    Sinon, je voulais savoir si tu arrivais à afficher une balle sans appeller de gllist (en la faisant directement tracer dans display) ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Le fait quelle soit ovale vient s'en doute de ton glscale, si tu ne met pas les meme coefficients, ca va déformer ta balle.
    Sinon, je voulais savoir si tu arrivais à afficher une balle sans appeller de gllist (en la faisant directement tracer dans display) ?
    faut que j'essaie...
    Par contre piur le glscale.. bizarement j'ai essayé de modifier les parametres d'echelle...et cela ne change pas la taille de la balle ??? c'est fort étrange...
    Il faut bien faire un pushmatrix, un glscale, un glutsolidsphere puis un popmatrix ????
    bon pour le moment je travaille comme cela, mais je n'aime pas ne pas faire ce que je veut !! grrrrrr....
    Sincerily

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Aloooors... j'ai mis, a la place du glut SolidSphere, un appel a buildCircle();

    bah rien.... vraiment je ne comprends pas : il n'y a pas d'erreur dans mes viewport ? Cela pourrait-il venir du mode de coordonnées que j'utilise (entre -1.0 et 1.0 ?? : par exemple, ma display list affiche un cercle hors de mon champ de vision...) Cependant, un cos et un sin renvoient des resultats entre -1.0 et 1.0, donc dans la fenetre...
    parce que bizarrement, un glscalef ne modifie pas la taille de mes objets... pfff c'est a n'y rien comprendre !
    Sincerily

  14. #14
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Comme tout le monde (ou presque) tu ne testes pas les erreurs OpenGL, si ça se trouve ta display list ne se crée pas bien qu'elle soit bonne

    je me demandais en fait si tu ne l'appelais pas trop tot, c'est à dire qu'apparemment tu la crées avant ton appel à glutCreateWindow

    avec glut je ne sais pas à quel moment opengl est initialisé mais normalement tant que ton contexte opengl n'est pas créé ET sélectionné, tout appel à opengl foire puisque que le driver ne sait pas à qui s'adresser pour envoyer les commandes
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

Discussions similaires

  1. [Oracle] Liste déroulante qui n'affiche rien
    Par Latimer dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/05/2015, 10h54
  2. Display List.. Rien ne s'affiche
    Par Daikyo dans le forum OpenGL
    Réponses: 3
    Dernier message: 01/04/2010, 15h50
  3. problème liste déroulante qui n'affiche rien
    Par edonist dans le forum IHM
    Réponses: 5
    Dernier message: 28/08/2008, 21h09
  4. [JAVASCRIPT] Rien ne s'affiche lors d'une pause
    Par stephane93fr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/05/2005, 15h38
  5. Multitexturing Vertex Array et Display List
    Par Wyatt dans le forum OpenGL
    Réponses: 1
    Dernier message: 04/05/2005, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo