Brique qui clignote

Signaler
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008
-
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008
-
Salut, j'ai encore un problème et comme d'habitude je trouve pas la solution : mon problème c'est que j'ai une brique qui clignote anormalement : de temps en temps elle semble s'éteindre !!!

Voici la source :
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
#define PI 3.14159265

int theta=50;
void changePerspective();
void display();
void brique(void);
void calcTableCosSin();
void rotation();
float ang=0;
float inca=4;
int rotation_act=1;

float Sin[360],Cos[360];

/* Paramètres de lumière */
GLfloat L0pos[]={-4.0,4.0,3.0};
GLfloat L0dif[]={ 1.0,1.0,1.0};
GLfloat L1pos[]={ 1.7,4.5,2.0};
GLfloat L1dif[]={ 1.0,1.0,1.0};
GLfloat Mspec[]={ 0.7,0.7,0.7};
GLfloat Mshiny=5;
/* Fin paramètres de lumière */

int main(int argc,char **argv) {

// Initialisation d'OpenGL
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPT
H);
glutInitWindowPosition(200,200);
glutInitWindowSize(640,480);
glutCreateWindow("essd");

calcTableCosSin();
glClearColor(0.0,0.0,0.0,0.0);
glPointSize(1.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);

/* Paramétrage des lumières */
glShadeModel(GL_SMOOTH);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE)
;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT0,GL_DIFFUSE,L0dif);
glLightfv(GL_LIGHT0,GL_SPECULAR,L0dif);
glLightfv(GL_LIGHT1,GL_DIFFUSE,L1dif);
glLightfv(GL_LIGHT1,GL_SPECULAR,L1dif);

/* Paramétrage du matériau */
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,Mspec);

glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,Mshiny)
;

changePerspective();
glMatrixMode(GL_MODELVIEW);

// Fonctions de rappel
glutDisplayFunc(display);

// Entrée dans la boucle principale
glutMainLoop();
return 0;
}

void changePerspective()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(theta,1.0,0.1,40.0);
glMatrixMode(GL_MODELVIEW);
}

void display()
{
/* effacement de l'image avec la couleur de fond */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

/*Application des transfos de visualisation */

/*CAMERA*/
glTranslatef(-0.5,-0.75,-4.0);
glRotated(20.0,0.60,-1.0,-0.06);
/*CAMERA FIN */

/*LUMIERES*/
glLightfv(GL_LIGHT0,GL_POSITION,L0pos);
glLightfv(GL_LIGHT1,GL_POSITION,L1pos);
/*LUMIERES FIN*/

glPushMatrix();

if(rotation_act==1)
glutTimerFunc(30,rotation,0);
/* Dessin de la brique tournante */
glLoadIdentity();
glPopMatrix();
glPushMatrix();
glRotatef(ang,0.0,1.0,0.0);
brique();

glFlush();

/* On echange les buffers */
glutSwapBuffers();
}

void brique(void) {
// Fonction permettant de dessiner une brique
float tl2=25/100+.2;

glBegin(GL_POLYGON);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2, 0.2, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2, 0.0, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2, 0.0, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2, 0.2, tl2);
glEnd();

glBegin(GL_POLYGON);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0.2, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0.0, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0.0,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0.2,-tl2);
glEnd();

glBegin(GL_POLYGON);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0.2,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0.0,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0.0,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0.2 ,-tl2);
glEnd();

glBegin(GL_POLYGON);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0.2 ,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0.0,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0.0, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0.2 , tl2);
glEnd();

glBegin(GL_POLYGON);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2, 0.2 ,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2, 0.2 , tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2, 0.2 , tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2, 0.2 ,-tl2);
glEnd();

glBegin(GL_POLYGON);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0,-tl2);
glColor3f(1.0,1.0,1.0); glVertex3f(-tl2,0, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0, tl2);
glColor3f(1.0,1.0,1.0); glVertex3f( tl2,0,-tl2);
glEnd();

}

void calcTableCosSin()
{
/* calcul du tableau des sinus et cosinus */
int i;
for (i=0;i<360;i++) {
Cos[i]=cos(((float)i)/180.0*PI);
Sin[i]=sin(((float)i)/180.0*PI);
}
}

void rotation()
{
ang=ang+inca;
if (ang>360)
ang=ang-360;
glutPostRedisplay();
}

Voila, merci de me dire où ca ne va pas et aussi dites moi si mon utilisation de gluttimerfunc est correcte <!--IBF.ATTACHMENT_6365611-->
<!-- THE POST -->

3 réponses

Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Salut, je ne sais pas si ca va resoudre ton problème mais :
glPushMatrix();
if(rotation_act==1)
glutTimerFunc(30,rotation,0);
/* Dessin de la brique tournante */
glLoadIdentity();
glPopMatrix();
glPushMatrix();
glRotatef(ang,0.0,1.0,0.0);
brique();
glPopMatrix();
Ce qui est en rouge est a virer, ce qui est en vert a rajouter

Pour glutTimerFunc, il faut passer au second parametre l'adresse d'une fonction :
void func(int)

KeniiyK
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

non, malheuresement ca ne résout rien. Une autre idée ?
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

J'ai peut etre trouvé : dans mon code source, j'ai oublié de dire les normales. Cependant, quand je fais ca il semble y avoir des prblèmes d'ombrage : chaque face est "unie" lorsque qu'une face est à moitié dans l'ombre, alors elle est totalement noire !