Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1457 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Problème d'animation avec OpenGL.....

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème d'animation avec OpenGL.....

n°1227604
jeremy13
Posté le 20-10-2005 à 22:57:54  profilanswer
 

bonsoir tt le monde,
 
J'ai un gros problème!!Je suis en école d'ingé et j'ai un projet en C++ qui est de concevoir un Tétris avec OpenGL et GLUT... :D Mais pour l'instant j'ai dessiné l'interface (je sais c'est hyper moche....) et j'ai dessiné un carré rouge mais je n'arrive à faire bouger selon y ce dernier....En fait il bouge uniquement quand je réduis et je restaure la fenêtre.....
 
Voilà mon code :  
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <GL/glut.h>
  5. #include <time.h>
  6. #include <windows.h>
  7. int x=0,y=0,z=0;
  8. void Ecrire_chaine(char *s,int x,int y)
  9. {
  10. int longueur=strlen(s),i;
  11. glRasterPos2i(x,y);
  12. for(i=0;i<longueur;i++)
  13.  glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,s[i]);
  14. }
  15. void fond()
  16.      {
  17.      glPushMatrix();       
  18.      glColor3f(0.5,0.5,0.6);
  19.      glBegin(GL_QUADS);
  20.  glVertex2i(0,0);
  21.  glVertex2i(0,500);
  22.  glVertex2i(400,500);
  23.  glVertex2i(400,0);
  24. glEnd();
  25. glColor3f(0,0,0);
  26. glBegin(GL_LINES);
  27.  glVertex2i(400,500);
  28.  glVertex2i(400,0);
  29.  glVertex2i(401,500);
  30.  glVertex2i(401,0);
  31.  glVertex2i(402,500);
  32.  glVertex2i(402,0);
  33. glEnd();
  34. glColor3f(0,0,0);
  35. glBegin(GL_POLYGON);
  36.  glVertex2i(35,35);       //base cadre noir
  37.  glVertex2i(35,50);
  38.  glVertex2i(355,50);
  39.  glVertex2i(355,35);
  40. glEnd();
  41.     glColor3f(0,0,0);
  42.     glBegin(GL_POLYGON);
  43.         glVertex2i(60,50);       //gauche cadre noir
  44.         glVertex2i(60,500);
  45.         glVertex2i(75,500);
  46.         glVertex2i(75,50);
  47.     glEnd();
  48.    
  49.     glColor3f(0,0,0);
  50.     glBegin(GL_POLYGON);
  51.         glVertex2i(325,50);       //droit cadre noir
  52.         glVertex2i(325,500);
  53.         glVertex2i(310,500);
  54.         glVertex2i(310,50);
  55.     glEnd();
  56.    
  57.     glColor3f(0.9,0.95,0.95);
  58.      glBegin(GL_QUADS);
  59.  glVertex2i(75,50);
  60.  glVertex2i(75,500);
  61.  glVertex2i(310,500);
  62.  glVertex2i(310,50);
  63. glEnd();
  64.     }
  65.    
  66. void carre()
  67.    
  68.      glPushMatrix();
  69.      glTranslated(x,y,z);
  70.         glBegin(GL_POLYGON);
  71.            glColor3f(1, 0, 0);
  72.            glVertex2i(500, 300);
  73.            glVertex2i(500, 350);
  74.            glVertex2i(450, 350);
  75.            glVertex2i(450, 300);
  76.         glEnd();
  77.      glPopMatrix();
  78.      y-=50;
  79. }
  80.    
  81.    
  82.    
  83. void affichage(void)
  84. {
  85. glClear(GL_COLOR_BUFFER_BIT);
  86. fond();
  87.     carre();
  88.     glFlush();
  89. }
  90. void redim(int l,int h)
  91. {
  92. glViewport(0,0,l,h);
  93. glMatrixMode(GL_PROJECTION);
  94. glLoadIdentity();
  95. gluOrtho2D(0,l,0,h);
  96. glMatrixMode(GL_MODELVIEW);
  97. glLoadIdentity();
  98. }
  99. int main(int argc,char **argv)
  100. {
  101. /* Initialisation */
  102. glutInit(&argc,argv);
  103. /* Initialisation des paramètres */
  104. glutInitWindowPosition(50,50);
  105. glutInitWindowSize(650,500);
  106. glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE);
  107. /* Création de la fenêtre */
  108. glutCreateWindow("Un tétris tout moche...." );
  109. /* Association d'évènements */
  110.     glutDisplayFunc(affichage);
  111.     glutReshapeFunc(redim);
  112. /* Initialisation de OpenGL */
  113. glClearColor(1,1,1,1);
  114. glutMainLoop();
  115.     return 0;
  116. }


 
Donc en fait j'aimerai que le carré rouge bouge selon y comme dans un Tétris normal c'est-à-dire à intervalle de temps régulier..... :heink:  
 
Merki bcp pour vos répoonses!!!
 
A+

mood
Publicité
Posté le 20-10-2005 à 22:57:54  profilanswer
 

n°1227610
retrox
Posté le 20-10-2005 à 23:13:48  profilanswer
 

Faudrait deja clear le zbuffer...
 
edit : bon sinon c'est un probleme de programation evenementielle. Tu t'es demandé quand étais appelée ta fonction affichage?


Message édité par retrox le 20-10-2005 à 23:18:38
n°1227611
jeremy13
Posté le 20-10-2005 à 23:21:29  profilanswer
 

bah en fait j'me doute que la fonction affichage est appelé uniquement quand windows détecte une modification au niveau de la fenêtre...dc comment appeler "affichage()" par exemple toutes les 0.5s ???
 
C'est très loin d'être clair tout ça....merki

n°1227818
retrox
Posté le 21-10-2005 à 10:55:56  profilanswer
 

Regarde du coté des timers (ça existe dans GLUT).

n°1227821
le_courtoi​s
Posté le 21-10-2005 à 10:57:37  profilanswer
 

Salut,
   Je ne sais si je vais pouvoir t'aider car je n'ai que 2 jours d'opengl et je ne connais pas ton langage. Alors, dis moi si j'ai bien compris ce que tu as codé: tu définis ton carré avec ses coordonnée, coordonnées que tu modifies en fin (y - 50) et tu veux que ce soit ta fonction affichage qui aille rechercher ton "objet" carré avec les nouvelles coordonnées ? Si c'est cela, à ta place je ferai autrement:
   Si j'ai bien compris, opengl est un "moteur" graphique statique" librairie, donc il affiche lorsque les paramètres que tu lui passe changent. Donc pas la peine de vouloir passer par la fonction affichage pour les animes.
  Tu crées une fonction qui décrit ta translation: de y_début à y_max avec un pas de n. Dans ta fonction affichage avant le carré tu mets (gltranslated x (appel_fonction) z) (avec la bonne syntaxe) et tu reinitialise tes coordonnées pour le cadre avec un glLoadIdentity.
  Et puis tiens: http://www-evasion.imag.fr/Membres [...] engl3.html
 plus le fameux site Nehe avec pleins d'exemple de code. (Y'en a trop peu pour scheme  :cry: )
  Maintenant si j'ai dit des conneries, dites le moi, ça pourra me servir.
A+


Message édité par le_courtois le 21-10-2005 à 12:44:55
n°1227877
retrox
Posté le 21-10-2005 à 12:00:53  profilanswer
 

OpenGL n'est pas un moteur, c'est une librairie.
Elle fait ce qu'on lui demande.
Quant à appeler une fonction qui modifie l'etat de la simu dans la fonction d'affichage, c'est une mauvaise idée.
La fonction d'affichage, comme son nom l'indique est faite pour afficher.
Dans le cas présent, la simu c'est le jeu tetris. Le programe doit avoir une représentation interne de l'état du jeu indépendante d'une quelconque méthode de rendu.

n°1227926
le_courtoi​s
Posté le 21-10-2005 à 12:29:30  profilanswer
 

Retrox -> Ah ok merci et donc désolé.
  Cependant une question, en essayant de ne pas pourrir son topic (et peut être, mes suis-je mal exprimé, problème de lexique spécifique): dans mes exemples, on va prendre celui d'un rotation
  L'auteur définit un compteur pour la rotation:

Code :
  1. [(define (counter-generator init step min max)
  2.   (letrec ((value init)
  3.            (loop
  4.             (lambda ()
  5.              ......
  6.       (set! value (+ value step))
  7.       (loop))))


puis dans la fonction principale d'affichage:

Code :
  1. ;; Our rotation variables
  2. (define trirot (counter-generator 0 2 0 360))
  3. ;; Our main function that does the drawing
  4. (define (gl-draw)
  5.   (glClear (+ GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT))
  6.   (glLoadIdentity)
  7.   (glTranslatef -1.5 0 -6)
  8.   (glRotatef (trirot) 0 1 0) <--ici, appel aux "arguments" de rotation
  9.  
  10.   (glBegin GL_TRIANGLES)
  11.  
  12.   (glColor3f 1 0 0)
  13.   (glVertex3f 0 1 0)
  14.   (glColor3f 0 1 0)
  15.   (glVertex3f -1 -1 1)
  16.   (glColor3f 0 0 1)
  17.   (glVertex3f 1 -1 1)
  18. (glEnd)
  19. (glflush)


 Bon, je mets pas tout le code, mais ça ressemble plus à ce que je voulais lui expliquer. Et ça, c'est "mal"?

n°1227992
retrox
Posté le 21-10-2005 à 13:25:11  profilanswer
 

Si c'est juste pour faire tourner un triangle, c'est pas "mal". Mais quand il s'agit de faire des choses un peu plus compliquées (par exemple, quand dans son tetris il y aura quelques dizaines de pieces deja tombées), c'est pas dans la fonction d'affichage qu'il faut gérer ça. Une fonction d'affichage doit normalement afficher l'état d'une simulation à un instant donné.

n°1228016
le_courtoi​s
Posté le 21-10-2005 à 13:48:30  profilanswer
 

Une dernière et j'arrête, j'effacerai mes posts à la demande.
Retrox -> on est d'accord. En fait j'avais mal compris la question. J'avais cru comprendre qu'en fait il voulait appeler régulièrement sa fonction affichage, laquelle se chargeait de modifier le système puisque son changement de coordonnées se faisait dans la définition de carré(), à la fin.
 Alors qu'en fait, c'est le système qui doit appeler l'affichage  lorsqu'il change. Le peu que j'avais compris de son code et de sa question me faisait penser qu'il essayait via pour la première solution. Mais mes connaissances sont faibles. Donc Dsl  :jap:   -->[]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Problème d'animation avec OpenGL.....

 

Sujets relatifs
Dimensionnement d'une animation FlashProblème de compilation
[SQL/Access] Problème de rafraichissement de zone de listeProbleme pour Configurer MySql en Serveur Dedie
Probleme d'incrementationproblème avec un Jpanel
Problème de multipageProbleme de clé unique, relier des tables
Problème avec renvoi de la valeur.probleme de verification de poid d'un fichier en php
Plus de sujets relatifs à : Problème d'animation avec OpenGL.....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR