Deplacer un rectangle en 2D avec opengl

fiascototal_2501 Messages postés 1 Date d'inscription mercredi 1 novembre 2006 Statut Membre Dernière intervention 6 novembre 2006 - 6 nov. 2006 à 23:36
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 8 nov. 2006 à 01:42
Bonjours
Je debute en opengl, mais ai deja quelques notions.

Je voudrai faire un projet simple (pour le moment) en application console: ouvrir une fenetre opengl, et faire se deplacer un rectangle dessus.
Attention pas se deplacer n'importe comment, on tourne dans une direction avec les bouton gauche et droite, et avancer dans la direction choisi par la rotation grace au bouton haut et bas.

voila le code que j'ai fais

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  opengl,
  glfw,
  math;

var
 x,y:real;
begin

  glfwInit;
  glfwopenwindow(1280,1024,1,0,0,0,42,0,GLFW_FULLSCREEN);
  glClear(GL_DEPTH_BUFFER_BIT);
  glClearColor( 0.0, 0.0, 0.0, 0.0 );
  glEnable(GL_DEPTH_BUFFER_BIT);
  glViewPort(0,0,1280,1024);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  gluLookAt(0,0,0,0,0,-100,0,1,0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(-16,16,-8,24, 10,-10);

x:=0;
y:=0;
u:=0;

 //********************(depard de la boucle)******************

  while true do
   begin
   glfwSwapBuffers;

  glClear(GL_COLOR_BUFFER_BIT);
  glClearColor( 0.9, 0.8, 0.0, 0.0 );

 //*********************(debut de la def des matrices)*-**************

 //*******(premiere matrice)***************

   glpushmatrix();

   if glfwGetKey(GLFW_KEY_UP) =1 then
    y:=y+0.05;
   if glfwGetKey(GLFW_KEY_DOWN) =1 then
    y:=y-0.05;
   if glfwGetKey(GLFW_KEY_LEFT) =1 then
    x:=x+0.1 ;
   if glfwGetKey(GLFW_KEY_RIGHT) =1 then
    x:=x-0.1 ;

             //*************(mouvement du rectangle)**********
    gltranslatef(y*sin(x),y*cos(x),0);
    glrotatef(x,0,0,1);

            //**************(creation du rectangle)************
       glbegin(GL_QUADS);
       glColor3f(0,0.5,0);
       glVertex3f(-1,-1,0);
       glColor3f(0,0.5,0);
       glVertex3f(-1,2,0);
       glColor3f(0,0.5,0);
       glVertex3f(1,2,0);
       glColor3f(0,0.5,0);
       glVertex3f(1,-1,0);
      glEnd();
   glpopmatrix();

//***************************(2è matrice:creation des bordures et decors)*****************

    glpushmatrix();

     glBegin(GL_QUADS);
      glColor3f(0,0,0);
      glVertex3f(-16,-8,0);
      glColor3f(0,0,0);
      glVertex3f(-16,24,0);
      glColor3f(0,0,0);
      glVertex3f(-15,24,0);
      glColor3f (0,0,0);
      glVertex3f(-15,-8,0);
     glEnd();
     glBegin(GL_QUADS);
      glColor3f(0,0,0);
      glVertex3f(-16,23,0);
      glColor3f(0,0,0);
      glVertex3f(-16,24,0);
      glColor3f(0,0,0);
      glVertex3f(16,24,0);
      glColor3f (0,0,0);
      glVertex3f(16,23,0);
     glEnd();

     glBegin(GL_QUADS);
      glColor3f(0,0,0);
      glVertex3f(15,24,0);
      glColor3f(0,0,0);
      glVertex3f(16,24,0);
      glColor3f(0,0,0);
      glVertex3f(16,-8,0);
      glColor3f (0,0,0);
      glVertex3f(15,-8,0);
     glEnd();
     glBegin(GL_QUADS);
      glColor3f(0,0,0);
      glVertex3f(16,-7,0);
      glColor3f(0,0,0);
      glVertex3f(16,-8,0);
      glColor3f(0,0,0);
      glVertex3f(-16,-8,0);
      glColor3f (0,0,0);
      glVertex3f(-16,-7,0);
     glEnd();

    glpopmatrix();

            //**********(action pour quitter le programme)***********
    if glfwGetKey(GLFW_KEY_ESC) = 1 Then break;
   end;

glfwTerminate();
end.

Seulement voila il y a un probleme, et de taille!!
A chaque tour de boucle il fait une translation et une rotation donc si j'avance un peu (donc translation), et que je veux tourner, il se met à decrire des cercle autour du point de depard.
Je vois d'où vient le probleme: apres avoir avancer un peu, si je veux tourner alors je modifie l'angle de rotation, et donc je modifie les valeur de cosinus et sinus de gltranslatef, ce qui cree alors en meme temps une translation circulaire autour du point de depart.

Comment puis je regler ce probleme??
merci

ps:je n'ai pas trouvé comment mettre mon code d'exemple dans les espaces reservé pour mettre du code sur ce forum.

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 nov. 2006 à 01:42
Deja je te conseille d'utiliser les commandes GlPush() et GlPop(), qui te permettent d'eviter ce genre de probleme.
En gros, ces fonctions te permettent d'effectuer un calcul matriciel, sans affecter l'ensemble de la scene. C'est pas facile a expliquer: GlPush sauvegarde la matrice et GlPop la restaure.

Le mieux serait que tu parte sur une bonne base, pour cela je te conseille fortement les tutoriels de sulaco, et surtout le debut de moteur 3D (tres tres basiques) qui te permet de commencer ton projet. Tu trouvera tout ca a cette adresse: http://www.sulaco.co.za/
Notemment:
http://www.sulaco.co.za/opengl_project_Basic_3D_engine.htm

Je t'ai fait un exemple qui regroupe les principales bases en OpenGL:
http://0217021.free.fr/Cours/Synchroniser%20son%20jeu.rar
0
Rejoignez-nous