CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Mouvement d'un carré avec openGL

MrGoTo
MrGoTo
Niveau 8
01 mars 2004 à 13:38:19

J´affiche un carré et en m´inspirant des exercices de lapintade j´essai de les reproduire en openGL.
J´en suis à:
Exercice C1 :
Faire un carré qui de déplace tout seul sur une ligne horizontal. Il change de direction lorsqu’il touche un bord.
Cependant il faudrait que je mette une boucle dans mon code et ajoute les variables pour les coordonnées du acrré mais je ne sais comment m´y prendre.
Voila mon code en esperant qu´il sera structuré:

  1. include < windows.h>
  2. include < gl/gl.h>
  3. include < gl/glut.h>

void Display();

int main(int argc,char **argv)
{
glutInit(&,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glutInitWindowSize(800,600);
glutInitWindowPosition(50,50);
glutCreateWindow("Pong");
glutDisplayFunc(Display);
glutMainLoop();
return 0;
}

void Display()
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);

glViewport(0,0,800,600);
gluOrtho2D(0,800,0,600);

glColor3d(255,255,255);
glBegin(GL_QUADS);
glVertex2d(390,290);
glVertex2d(410,290);
glVertex2d(410,310);
glVertex2d(390,310);
glEnd();

glFlush();
}

Ruffi
Ruffi
Niveau 9
01 mars 2004 à 14:09:34

Je vais pas te donner toutes les reponses, juste des indications :
variable pour les coordonnées du carré : tu les met en gobal : tu les utilisera avec un glTranslate. Pour la boucle, elle existe deja :
glutDisplayFunc(Display); -> indique la fonction qu´openGL doit utiliser pour fair l´affichage
glutMainLoop(); -> indique le debut de la boucle : a partir de maintenant il apelera ta fonction Display pour l´affichage

Pour apeler un timer, afin de faire une action des qu´openGL a du temps pour cela:
glutIdleFunc(&_idle); -> indique la fonction
GLvoid window_idle()
{
/ / ce que tu veux faire
glutPostRedisplay();
}

pour un deplacement :
glTranslatef(x, y, z);
pour une rotation :
glRotatef(angle, x, y, z);
Les fonctions marchent avec des float : pour utiliser des int : glTranslatei(x, y, z), glRotatei(angle, x, y, z);
Pour n´afectuer cette modification qu´a un objet :
glPushMatrix();
glBegin(...);
. ..
/ /dessin de ton objet
. ..
glEnd();
glPopMatrix();

Sa devrai te suffir pour faire l´exercice.
Bon courage :)

MrGoTo
MrGoTo
Niveau 8
01 mars 2004 à 14:11:32

merci ruffi.

MrGoTo
MrGoTo
Niveau 8
01 mars 2004 à 14:16:11

glutIdleFunc(&_idle); Ca je le met dans ma fonction display ou main?

Ruffi
Ruffi
Niveau 9
01 mars 2004 à 14:27:22

Dans le main : il permet , comme glutDisplayFunc , d´indiquer la fonction permettant de faire le idle. Dedans, je t´ai mis glutPostRedisplay() : cela permet d´indiquer a openGL qu´il doit redessiner ( donc apeler ta fonction Display

MrGoTo
MrGoTo
Niveau 8
01 mars 2004 à 15:30:10

Voila le code:

  1. include < windows.h>
  2. include < gl/gl.h>
  3. include < gl/glut.h>

void Display();
void Reshape(int,int);

int x=0;

int main(int argc,char **argv)
{
glutInit(&,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glutInitWindowSize(800,600);
glutInitWindowPosition(50,50);
glutCreateWindow("Pong");

glutDisplayFunc(Display);
glutReshapeFunc(Reshape);

glutMainLoop();
return 0;
}

void Display()
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
x+=1;
glTranslatef(x,0.0,0.0);
glPushMatrix();
glColor3d(255,255,255);
glBegin(GL_QUADS);
glVertex2d(390,290);
glVertex2d(410,290);
glVertex2d(410,310);
glVertex2d(390,310);
glEnd();
glPopMatrix();

glFlush();
}

void Reshape(int w,int h)
{
glViewport(0,0,w,h);
gluOrtho2D(0,w,0,h);
}

Ya un probleme car le carré se déplace avec une pire intervalle de temps. http://mrgoto.no-ip.com/pong.exe

Ruffi
Ruffi
Niveau 9
01 mars 2004 à 17:57:57

Pour le glPush :
glPushMatrix();
glTranslatef(x,0.0,0.0);
. ..
glPopMatrix();

Ensuite, le " x+=1" devrai plutot etre mis dans un idle ( ou mieux, avec un timer : http://www.esil.univ-mrs.fr/~smavroma/Docs/GLUT-Spec-FR-EX/CallbacksGLUT.html ). Sinon, tu augmente x a chaque fois que tu reafiche, alors que la logique serai plutot d´augmenter avant de reaficher.
D´ailleur, a mon avis tu devrai plutot utiliser un float pour x, et augmenter de 0,1 par exemple.
N´oublie pas de verifier que ton cube est bien dans l´ecran affin de le faire aller dans l´autre sens

MrGoTo
MrGoTo
Niveau 8
01 mars 2004 à 20:34:13

J´ai pas compris les paramètres à utiliser avec glTimerFunc. Tu pourrait pas me faire une fonction exemple?

Ruffi
Ruffi
Niveau 9
01 mars 2004 à 21:22:27

Il me semble que c´est comme sa :

declaration de ta fonction :
void FctTimer(int value);

declaration du temps entre chaque apelle :
unsigned int temps=10; ( par exemple 10 ms)

dans le main :
glutTimerFunc(temps,&,0);

la fonction :
void FctTimer(int value){
x+=0.1; / /translation de ton cube
glutTimerFunc(temps,&,0);
}

Il faut rapeler le timer afin de rapeler la fonction dans " temps" de ms. value permet d´envoyer une valeur d´un apel a l´autre ( je met 0 car je l´utilise pas)

MrGoTo
MrGoTo
Niveau 8
01 mars 2004 à 22:49:24

Comme à l´habitude voila mon code ( le programme merde biensur)

  1. include < windows.h>
  2. include < gl/gl.h>
  3. include < gl/glut.h>

void Display();
void Reshape(int,int);
void FctTimer(int value);
unsigned int temps=10;

float x=0.0;

int main(int argc,char **argv)
{
glutInit(&,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glutInitWindowSize(800,600);
glutInitWindowPosition(50,50);
glutCreateWindow("Pong");

glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutTimerFunc(temps,&,0);

glutMainLoop();
return 0;
}

void Display()
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();
glTranslatef(x,0.0,0.0);
glColor3d(255,255,255);
glBegin(GL_QUADS);
glVertex2d(390,290);
glVertex2d(410,290);
glVertex2d(410,310);
glVertex2d(390,310);
glEnd();
glPopMatrix();

glFlush();
}

void Reshape(int w,int h)
{
glViewport(0,0,w,h);
gluOrtho2D(0,w,0,h);
}

void FctTimer(int value)
{
x+=0.1;
glutTimerFunc(temps,&,0);
}

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment