L'exécutable

Images en lancer de rayons (à gauche) et en Z-Buffer sous OpenGL (à droite)

Fichier source principal : RayTracing.cpp

Classes de l'application : RayTracing.zip
Classes mathématiques : Mathematiques.zip

Fichier source : Dir3D.h

    /* Methode de calcul de la direction        */
    /* de reflexion speculaire a partir         */
    /* de la direction d'incidence i            */
    /* et de la normale n au point d'incidence  */
    /* Affectation du resultat a this           */

    bool reflexion(Dir3D *i,Dir3D *n);

    /* Methode de calcul de la direction        */
    /* de transmission a partir                 */
    /* de la direction d'incidence i,           */
    /* de la normale n au point d'incidence     */
    /* et du rapport niSurNt calcule entre      */
    /* les coefficients de refraction           */
    /* des milieux d'incidence                  */
    /* et de transmission                       */
    /* Affectation du resultat a this           */

    bool transmission(Dir3D *i,Dir3D *n,float niSurNt);

Fichier source : Direction3D.cpp

/* Methode de calcul de la direction            */
/* de reflexion speculaire a partir             */
/* de la direction d'incidence i                */
/* et de la normale n au point d'incidence      */
/* Affectation du resultat a this               */

bool Dir3D::reflexion(Dir3D *i,Dir3D *n) {
  float ps = i->produitScalaire(n);
  if ( ps < 0.0 ) return(false);
  x = 2.0F*ps*n->x-i->x;
  y = 2.0F*ps*n->y-i->y;
  z = 2.0F*ps*n->z-i->z;
  return(true);
}

/* Methode de calcul de la direction            */
/* de transmission a partir                     */
/* de la direction d'incidence i,               */
/* de la normale n au point d'incidence         */
/* et du rapport niSurNt calcule entre          */
/* les coefficients de refraction               */
/* des milieux d'incidence et de transmission   */
/* Affectation du resultat a this               */

bool Dir3D::transmission(Dir3D *i,Dir3D *n,float niSurNt) {
  float ps = i->produitScalaire(n);
  float v = 1.0F-(niSurNt*niSurNt*(1.0F-ps*ps));
  if ( v < 0.0 ) return(false);
  v =(float) (niSurNt*ps-sqrt(v));
  x = v*n->x - niSurNt*i->x;
  y = v*n->y - niSurNt*i->y;
  z = v*n->z - niSurNt*i->z;
  return(true);
}

RETOUR