TD 5 : gestion des sources luminueuses selon le modèle de Phong

Introduction

Vous allez maintenant intégrer à votre programme la gestion des sources lumineuses selon le modèle de Phong étudié en cours. Dans un premier temps, laissez tomber la gestion de la couleur, supposez que objets et sources de lumières sont blanches. Ca tombe bien puisque on travaille en niveaux de gris pour le moment !!!

Cependant, gardez à l'esprit que dans une semaine ou deux vous devrez passer en couleur !!! Ne codez donc rien en dur qui vous empêche de passer en couleur par la suite !

Voici quelques exemples de ce que vous devrez faire, les couleurs et le lissage de la surface (dernière image) arriveront un peu plus tard...
 

Une seule lampe
Objet un peu moins diffus, un peu plus de relfets
Objet un peu plus diffus
Reflets moins directifs
3 lampes
4 lampes dont trois colorées, pour plus tard !

 Travail à faire

Dans object.h :
#define  DIRECTIONAL       0
#define  SPOT_LIGHT        1
#define  CONE_LIGHT        2
#define  ATTENUATED_LIGHT  3
typedef struct LightStruct {
    Matrix4 LocalToGlobal;  /* Une lampe est un vrai objet 3d avec une position
                               et une orientation */
    Matrix4 GlobalToLocal;
    
    int     Type;       /* type de la source lumieuse */
    double  angle;      /* sert pour la cone_light angle d'ouverture */
    double  intensite;  /* intensite de la lumiere comprise entre 0 et 1 */
    int     puissance;  /* puissance d attenuation des lumieres ponctuelles */
    double  attenuation; /* factuer d'attenuation */
    Color   color;
}
Dans object.c :
/*--------------------------------------*/
void ReadLight(char *filename, Light *Lumiere)
/*--------------------------------------*/
{
  FILE *fp;
  char  line[1024], command[1024];
  double x, y, z;
  int r, g, b;

  if ((fp = fopen (filename, "r")) == NULL) {
    fprintf (stderr, "Attention: file %s  can not open !!!\n", filename) ;
    exit(0);
  }

  SetMatrixToIdentity(&(Lumiere->LocalToGlobal));
  SetMatrixToIdentity(&(Lumiere->GlobalToLocal));

  while(fgets(line, 1024, fp) != NULL) 
    if((line[0] != '#') && (line[0] != 10)){
      if(sscanf(line, "%s", command) != 0) {

        if(!strcmp(command, "Position")) 
          /* Pos 3D du repere associe a la lumiere */
          dbl3par(line, x, y, z);

        if(!strcmp(command, "Type")) 
          intpar(line, Lumiere->Type);

        if(!strcmp(command, "Intensite")) 
          dblpar(line, Lumiere->intensite);

        if(!strcmp(command, "Angle")) 
          dblpar(line, Lumiere->angle);

        if(!strcmp(command, "Attenuation")) 
          dblpar(line, Lumiere->attenuation);
        if(!strcmp(command, "Color")) {
          /* Couleur de la lampe */
          int3par(line, r, g, b);
          Lumiere->color.r = (unsigned char) r;
          Lumiere->color.g = (unsigned char) g; 
          Lumiere->color.b = (unsigned char) b; 
        }
        if(!strcmp(command, "Puissance")) 
          intpar(line, Lumiere->puissance);

      }
    }
  fclose(fp);

  Lumiere->angle = cos(Lumiere->angle*M_PI/180);

  /* Positionne la camera dans l'espace */
  TranslateLight(Lumiere, x, y, z);
  
}
Voici un exemple de fichier décrivant une lumière : light_default.obj
 

Suite du travail à faire...

Conseils pour la bonne réalisation de ce TD