Pavé tournant

Résolu
Signaler
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008
-
Messages postés
237
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
22 juillet 2011
-
Bonjour, je désirais pour commencer en OpenGL sous devc++ faire un programme simulant un pavé tournant autour de l'axe y : voici mon code source :

#include <GL/glut.h>
#include <stdlib.h>


/* Notre structure point */
int i,j;
typedef struct
{
float x;
float y;
float z;
float r;
float g;
float b;
} point;


point p[8]={
{-0.3,-0.15, 0.3,1.0,0.0,0.0},
{-0.3, 0.15, 0.3,0.0,1.0,0.0},
{ 0.3, 0.15, 0.3,0.0,0.0,1.0},
{ 0.3,-0.15, 0.3,1.0,1.0,0.0},
{-0.3,-0.15,-0.3,1.0,0.0,1.0},
{-0.3, 0.15,-0.3,0.0,1.0,1.0},
{ 0.3, 0.15,-0.3,0.0,0.0,0.0},
{ 0.3,-0.15,-0.3,1.0,1.0,1.0}};

int f[6][4]={
{0,1,2,3},
{3,2,6,7},
{4,5,6,7},
{0,1,5,4},
{1,5,6,2},
{0,4,7,3}};





float a=0;
float inca=0.45;


/* Prototype des fonctions */
void affichage();
void clavier(unsigned char touche,int x,int y);
void reshape(int x,int y);
void idle();


int main(int argc,char **argv)
{
/* initialisation de glut et creation
de la fenetre */
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(200,200);
glutInitWindowSize(500,500);
glutCreateWindow("transf");


/* Initialisation d'OpenGL */
glClearColor(1.0,1.0,1.0,0.0);
glColor3f(1.0,1.0,1.0);
glPointSize(2.0);


glEnable(GL_DEPTH_TEST);


/* enregistrement des fonctions de rappel */
glutDisplayFunc(affichage);
glutKeyboardFunc(clavier);
glutReshapeFunc(reshape);
glutIdleFunc(idle);


/* Entree dans la boucle principale glut */
glutMainLoop();
return 0;
}


void affichage()
{


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();


glRotatef(a,0.0,1.0,0.0);
glRotatef(10,1.0,0.0,0.0);
/* Dessin du cube */
for (i=0;i<6;i++)
{
glBegin(GL_POLYGON);
for (j=0;j<4;j++)
{
glColor3f(p[f[i][j]].r,p[f[i][j]].g,p[f[i][j]].b);
glVertex3f(p[f[i][j]].x,p[f[i][j]].y,p[f[i][j]].z);
}
glEnd();
}

glFlush();
glutSwapBuffers();
}


void clavier(unsigned char touche,int x,int y)
{
switch (touche)
{
case 'a':
inca++;
if (inca>10)
inca=10;
glutPostRedisplay();
break;
case 'A':
inca--;
if (inca<-10)
inca=-10;
glutPostRedisplay();
break;
case 'q' :
exit(0);
}
}


void reshape(int x,int y)
{
if (x<y)
glViewport(0,(y-x)/2,x,x);
else
glViewport((x-y)/2,0,y,y);
}


void idle()
{
a+=inca;
if (a>360)
a-=360;
glutPostRedisplay();
}

Le programme marche et simule ce que je veux, le seul petit problème est le fait que quand on a une face de face :) et bien on a l'impression que l'image saute. Cet effet se fait-il aussi chez vous, et si oui, comment l'éviter ?

Merci d'avance

NC

7 réponses

Messages postés
237
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
22 juillet 2011
2
Salut :)

Normalement, si tu utilises GL_FLAT au lieu de GL_SMOOTH, ca sera légèrement plus rapide, mais le gain sera tellement minime que ca vaut pas le coup... Surtout que tu envoies exactement le même nombre de points a OpenGL avec les deux méthodes...
Si tu as encore des questions, ici ou sur MSN (c'est peut-être plus simple en direct :p) : platonman1758@hotmail.com

Voilà, @+
Messages postés
237
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
22 juillet 2011
2
Salut

Je viens de tester ton programme sous dev-cpp, aucun souci apparemment, le cube tourne bien comme il faut, et je n'ai pas l'impression que l'image "saute"... En rajoutant une temporisation dans la fonction idle, c'est bien visible, il n'y aucun souci, le code est correct
Peut-être des drivers graphiques a mettre à jour ?

Bonne journée
@+
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

merci. pourtant mes drivers sont à jour mais en fait j'ai l'impression que ca saute quand le pavé est de profil et donc au moment ou on ne voit plus qu'une seule face, entre ce moment là et celui où les autres faces réapparaissent.


Ce n'est pas grave, mais sinon sauriez vous comment faire pour teinter chaque face du pavé d'une couleur différente (car là je débute et je n'arrive qu'à faire des 'dégradés'), et si c'est possible 'd'écrire un texte' sur une des faces du pavé ?
Messages postés
237
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
22 juillet 2011
2
Re :)

Pour qu'une face ait une couleur unique, tu dois donner la même couleur à tous les coins de cette face, sinon OpenGL réalise une interpolation entre les couleurs, comme tu peux t'en rendre compte toi-même...

Sinon, pour afficher du texte sur une face, tu peux créer une texture qui contient le texte, et l'utiliser pour la mapper sur une des faces...Pour un très bon tuto sur les textures : http://nehe.gamedev.net. C'est a mon avis la solution la plus simple...

Bonne journée @+
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

d'accord pour le texte, mais deux petites questions encore : comment faire un texte en 3d ?
et si je mets la meme couleur aux 4 points d'une face, par exemple rouge, alors une autre face ayant une arete commune avec cette face aura 2 points de la couleur de la 1ère face, meme si je veux la faire d'une autre couleur (bleue par exemple) ! d'où la question : comment résoudre le problème ? :-)
Messages postés
237
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
22 juillet 2011
2
Salut... :)

Pour le texte en 3D sous Windows, encore retour sur le site de Nehe, tout y est expliqué dans la liste de tutos à gauche....

En ce qui concerne la couleur des faces, le probleme ne se pose meme pas en réalité. Tu dois en effet toujours fournir tous les points d'une face... Si on prend l'exemple d'affichage de quadrilateres, tu definis quatre points d'une couleur :

glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 0.0f); // Couleur rouge
glVertex3f(0.0f, 0.0f, 0.0); // Les quatre points qui composent ton quadrilatere
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 1.0f);

Ca c'est ta premiere face de couleur rouge ok ? Donc pour la face suivante, tu definis quatre autres points d'une couleur quelconque, même si plusieurs points sont confondus, c'est pas grave, c'est comme ca que ca fonctionne, par exemple :

glColor3f(0.0f, 1.0f, 0.0f); // Couleur verte

glVertex3f(1.0f, 0.0f, 0.0); // Les quatre points qui composent ton quadrilatere...

glVertex3f(2.0f, 0.0f, 0.0f);

glVertex3f(2.0f, 0.0f, 1.0f);

glVertex3f(1.0f, 0.0f, 1.0f);

glEnd();

Dans le petit exemple d'au-dessus, tu auras un carré rouge, avec un carré vert à sa droite, avec deux points confondus entre les deux quadrilateres... Note que tu es pas obligé de mettre un couple glEnd() / glBegin(quelque_chose) pour changer de couleur...

Bonne soirée @+
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

ok c'est tout simple en fait, mais j'avais trouvé aussi (pour conserver ma structure de faire ainsi : glShadeModel(GL_FLAT), et de triturer un peu le début du code ou je mettais maintenant :
int f[6][4]={
{0,1,2,3},
{3,2,6,7},
{4,5,6,7},
{5,4,0,1},
{1,5,6,2},
{7,3,0,4}};

est-ce exactement le meme effet, ou l'un des 2 scripts est plus performant que l'autre ?