L'exécutable

TD02-01a.png TD02-01b.png
Lumières colorées et lumières blanches sur cubes sans normales

TD02-02a.png TD02-02b.png
Lumières colorées et lumières blanches sur cubes avec normales

TD02-03a.png TD02-03b.png
Cylindres par facette

TD02-04.png
Cylindre par facette (peu de facettes)

Fichier source : EnsembleFacettesCubeCylindre.cpp
Modules utilitaires

/* Scenes dessinees                             */

static void mySolidCubeSansNormales(double ct) {
  float c =(float) ct/2.0F;
  glPushMatrix();
  glBegin(GL_QUADS);
  { glVertex3f(-c, c,-c);
    glVertex3f(-c,-c,-c);
    glVertex3f( c,-c,-c);
    glVertex3f( c, c,-c); }
  { glVertex3f( c, c, c);
    glVertex3f(-c, c, c);
    glVertex3f(-c,-c, c);
    glVertex3f( c,-c, c); }
  { glVertex3f(-c, c,-c);
    glVertex3f(-c,-c,-c);
    glVertex3f(-c,-c, c);
    glVertex3f(-c, c, c); }
  { glVertex3f( c, c, c);
    glVertex3f( c,-c, c);
    glVertex3f( c,-c,-c);
    glVertex3f( c, c,-c); }
  { glVertex3f(-c,-c, c);
    glVertex3f(-c,-c,-c);
    glVertex3f( c,-c,-c);
    glVertex3f( c,-c, c); }
  { glVertex3f( c, c, c);
    glVertex3f( c, c,-c);
    glVertex3f(-c, c,-c);
    glVertex3f(-c, c, c); }
  glEnd();
  glPopMatrix();
}

static void mySolidCubeAvecNormales(double ct) {
  float c =(float) ct/2.0F;
  /* Protection contre la modification de la normale */
  /* et du flag normalisation                        */
  GLboolean nm = glIsEnabled(GL_NORMALIZE);
  if ( !nm )
    glEnable(GL_NORMALIZE);
  float normale[4];
  glGetFloatv(GL_CURRENT_NORMAL,normale);
  /* Modelisation geometrique */
  glPushMatrix();
  glBegin(GL_QUADS);
  { glNormal3f(0.0F,0.0F,-1.0F);
    glTexCoord2f(0.0F,0.0F);
    glVertex3f( c, c,-c);
    glTexCoord2f(0.0F,1.0F);
    glVertex3f( c,-c,-c);
    glTexCoord2f(1.0F,1.0F);
    glVertex3f(-c,-c,-c);
    glTexCoord2f(1.0F,0.0F);
    glVertex3f(-c, c,-c); }
  { glNormal3f(0.0F,0.0F,1.0F);
    glTexCoord2f(0.0F,0.0F);
    glVertex3f( c, c, c);
    glTexCoord2f(0.0F,1.0F);
    glVertex3f(-c, c, c);
    glTexCoord2f(1.0F,1.0F);
    glVertex3f(-c,-c, c);
    glTexCoord2f(1.0F,0.0F);
    glVertex3f( c,-c, c); }
  { glNormal3f(-1.0F,0.0F,0.0F);
    glTexCoord2f(0.0F,0.0F);
    glVertex3f(-c, c,-c);
    glTexCoord2f(0.0F,1.0F);
    glVertex3f(-c,-c,-c);
    glTexCoord2f(1.0F,1.0F);
    glVertex3f(-c,-c, c);
    glTexCoord2f(1.0F,0.0F);
    glVertex3f(-c, c, c); }
  { glNormal3f(1.0F,0.0F,0.0F);
    glTexCoord2f(0.0F,0.0F);
    glVertex3f( c, c, c);
    glTexCoord2f(0.0F,1.0F);
    glVertex3f( c,-c, c);
    glTexCoord2f(1.0F,1.0F);
    glVertex3f( c,-c,-c);
    glTexCoord2f(1.0F,0.0F);
    glVertex3f( c, c,-c); }
  { glNormal3f(0.0F,-1.0F,0.0F);
    glTexCoord2f(0.0F,0.0F);
    glVertex3f(-c,-c, c);
    glTexCoord2f(0.0F,1.0F);
    glVertex3f(-c,-c,-c);
    glTexCoord2f(1.0F,1.0F);
    glVertex3f( c,-c,-c);
    glTexCoord2f(1.0F,0.0F);
    glVertex3f( c,-c, c); }
  { glNormal3f(0.0F,1.0F,0.0F);
    glTexCoord2f(0.0F,0.0F);
    glVertex3f( c, c, c);
    glTexCoord2f(0.0F,1.0F);
    glVertex3f( c, c,-c);
    glTexCoord2f(1.0F,1.0F);
    glVertex3f(-c, c,-c);
    glTexCoord2f(1.0F,0.0F);
    glVertex3f(-c, c, c); }
  glEnd();
  glPopMatrix();
  /* Restoration de la normale et du flag normalisation */
  glNormal3f(normale[0],normale[1],normale[2]);
  if ( !nm )
    glDisable(GL_NORMALIZE);
}

static void mySolidCylindre(double hauteur,double rayon,int ns) {
  /* Protection contre la modification de la normale */
  /* et du flag normalisation                        */
  GLboolean nm = glIsEnabled(GL_NORMALIZE);
  if ( !nm )
    glEnable(GL_NORMALIZE);
  float normale[4];
  glGetFloatv(GL_CURRENT_NORMAL,normale);
  /* Modelisation geometrique */
  glPushMatrix();
  hauteur /= 2.0F;
  glBegin(GL_QUAD_STRIP);
  forint i = 0 ; i <= ns ; i++ ){
    float a = (2*M_PI*i)/ns;
    float cs = cos(a);
    float sn = -sin(a);
    glNormal3f(cs,0.0F,sn);
    float x = rayon*cs;
    float z = rayon*sn;
    glVertex3f(x,hauteur,z);
    glVertex3f(x,-hauteur,z); }
  glEnd();
  glPopMatrix();
  /* Restoration de la normale et du flag normalisation */
  glNormal3f(normale[0],normale[1],normale[2]);
  if ( !nm )
    glDisable(GL_NORMALIZE);
}

static void mySolidCylindre(double hauteur,double rayon,int ns,int nl) {
  GLboolean nm = glIsEnabled(GL_NORMALIZE);
  if ( !nm )
    glEnable(GL_NORMALIZE);
  float normale[4];
  glGetFloatv(GL_CURRENT_NORMAL,normale);
  glPushMatrix();
  for ( int j = 0 ; j < nl ; j++ ) {
    float hi = hauteur/2-j*hauteur/nl;
    float hf = hi-hauteur/nl;
    glBegin(GL_QUAD_STRIP);
    forint i = 0 ; i <= ns ; i++ ) {
      float a = (2*M_PI*i)/ns;
      float cs = cos(a);
      float sn = -sin(a);
      glNormal3f(cs,0.0F,sn);
      float x = rayon*cs;
      float z = rayon*sn;
      glVertex3f(x,hi,z);
      glVertex3f(x,hf,z); }
    glEnd(); }
  glPopMatrix();
  glNormal3f(normale[0],normale[1],normale[2]);
  if ( !nm )
    glDisable(GL_NORMALIZE);
}

static void mySolidCylindre(double hauteur,double rayon,int ns,int nl,int bases) {
  GLboolean nm = glIsEnabled(GL_NORMALIZE);
  if ( !nm )
    glEnable(GL_NORMALIZE);
  float normale[4];
  glGetFloatv(GL_CURRENT_NORMAL,normale);
  glPushMatrix();
  for ( int j = 0 ; j < nl ; j++ ) {
    float hi = hauteur/2-j*hauteur/nl;
    float hf = hi-hauteur/nl;
    glBegin(GL_QUAD_STRIP);
    forint i = 0 ; i <= ns ; i++ ) {
      float a = (2*M_PI*i)/ns;
      float cs = cos(a);
      float sn = -sin(a);
      glNormal3f(cs,0.0F,sn);
      float x = rayon*cs;
      float z = rayon*sn;
      glVertex3f(x,hi,z);
      glVertex3f(x,hf,z); }
    glEnd(); }
  if ( bases ) {
    glBegin(GL_POLYGON);
    glNormal3f(0.0F,1.0F,0.0F);
    forint i = 0 ; i < ns ; i++ ) {
      float a = (2*M_PI*i)/ns;
      float cs = cos(a);
      float sn = -sin(a);
      float x = rayon*cs;
      float z = rayon*sn;
      glVertex3f(x,hauteur/2.0F,z); }
    glEnd();
    glBegin(GL_POLYGON);
    glNormal3f(0.0F,-1.0F,0.0F);
    forint i = 0 ; i < ns ; i++ ) {
      float a = (2*M_PI*i)/ns;
      float cs = cos(a);
      float sn = sin(a);
      float x = rayon*cs;
      float z = rayon*sn;
      glVertex3f(x,-hauteur/2.0F,z); }
    glEnd(); }
  glPopMatrix();
  glNormal3f(normale[0],normale[1],normale[2]);
  if ( !nm )
    glDisable(GL_NORMALIZE);
}

RETOUR