Teapot avec eclairage

Contenu du snippet


Source / Exemple :


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

#define PI 3.14159265

void affichage();
void clavier(unsigned char touche,int x,int y);
void reshape(int x,int y);
void calcTableCosSin();

int angle=45;
float Sin[360],Cos[360];
GLfloat L0pos[]={ 0.0,2.0,-1.0};
GLfloat L0dif[]={ 0.3,0.3,0.8};
GLfloat L1pos[]={ 2.0,2.0,2.0};
GLfloat L1dif[]={ 0.5,0.5,0.5};
GLfloat Mspec[]={0.5,0.5,0.5};
GLfloat Mshiny=50;

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(400,400);
  glutCreateWindow("light1");

  /* précalcul de la table des sinus et cosinus */
  calcTableCosSin();

  /* Initialisation d'OpenGL */
  glClearColor(0.0,0.0,0.0,0.0);
  glColor3f(1.0,0.0,00);
  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);
  
  /* Mise en place de la perspective */
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0,1.0,0.1,10.0);
  glMatrixMode(GL_MODELVIEW);
  
  /* Mise en place des fonctions de rappel */
  glutDisplayFunc(affichage);
  glutKeyboardFunc(clavier);
  glutReshapeFunc(reshape);

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

void affichage(){
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  gluLookAt(4.5*Cos[angle],2.0,4.5*Sin[angle],0.0,0.0,0.0,0.0,1.0,0.0);
  glLightfv(GL_LIGHT0,GL_POSITION,L0pos);
  glLightfv(GL_LIGHT1,GL_POSITION,L1pos);
  glutSolidTeapot(1.0);
  glutSwapBuffers();
}

void clavier(unsigned char touche,int x,int y)
{
   switch (touche)
    {
    case 'z' :   /* increment de l'angle de position */
      angle+=2;
      if (angle>=360)
	angle-=360;
      glutPostRedisplay();
      break;
    case 'a' :  /* decrement de l'angle de position */
      angle-=2;
      if (angle<0)
	angle+=360;
      glutPostRedisplay();
      break;
    case 'w' : /* Lampe 0 on */
      glEnable(GL_LIGHT0);
      glutPostRedisplay();
      break;
    case 'x' : /* Lampe 0 off */
      glDisable(GL_LIGHT0);
      glutPostRedisplay();
      break;
    case 'c': /* lampe 1 on */
      glEnable(GL_LIGHT1);
      glutPostRedisplay();
      break;
    case 'v': /* lampe 1 off */
      glDisable(GL_LIGHT1);
      glutPostRedisplay();
      break;
    case 'm': /* increment reflexion speculaire */
      Mspec[0]+=0.1;
      if (Mspec[0]>1)
	Mspec[0]=1;
      Mspec[1]+=0.1;
     if (Mspec[1]>1)
	Mspec[1]=1;
      Mspec[2]+=0.1;
     if (Mspec[2]>1)
       Mspec[2]=1;
     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,Mspec);
     glutPostRedisplay();
      break;
    case 'l': /* decrement reflexion speculaire */
      Mspec[0]-=0.1;
      if (Mspec[0]<0)
	Mspec[0]=0;
      Mspec[1]-=0.1;
     if (Mspec[1]<0)
	Mspec[1]=0;
      Mspec[2]-=0.1;
     if (Mspec[2]<0)
	Mspec[2]=0;
      glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,Mspec);      
      glutPostRedisplay();
      break;
    case 'j': /* increment de la brillance */
      Mshiny-=1;
      if (Mshiny<0)
	Mshiny=0;
      glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,Mshiny);
      glutPostRedisplay();
      break;
    case 'k': /* decrement de la brillance */
      Mshiny+=1;
      if (Mshiny>128)
	Mshiny=128;
      glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,Mshiny);
      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 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);
  }
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.