| Question 1:
    Lumières animées 
      Une seule variable globale est utilisée: un compteur d'images.Les appels non récurrents à glLight (concernant les caractéristiques autres des
        positions ou des directions) peuvent être réalisés dans la fonction display ou mieux,
        dans une fonction init appelée une fois avant le glutMainLoop.Les appels récurrents à glLight (concernant les caractéristiques de position ou de
        direction) doivent être réalisés dans la fonction display avant l'appel à la fonction
        objets.L'animation portant sur la position de la lumière ponctuelle et la direction de la
        lumière directionnelle, les appels correspondant à glLight doivent être précédés des
        glTranslate et glRotate nécessaires. Chacun de ces appels doit en outre être encadré
        d'un glPushMatrix, glPopMatrix pour ne porter que sur la lumière et pas sur les
        définitions ultérieures.
La lumière numéro x est définie comme une lumière ponctuelle par un appel à
        glLightfv(GL_LIGHTx, GL_POSITION, pos). pos est un tableau à 4 valeurs de type float. Les
        trois premières donnent la position de la lumière. La dernière doit avoir 1.0F pour
        valeur.La lumière numéro x est définie comme une lumière directionnelle par un appel à
        glLightfv(GL_LIGHTx, GL_POSITION, pos). pos est un tableau à 4 valeurs de type float. Les
        trois premières donnent la direction de la lumière. La dernière doit avoir 0.0F pour
        valeur.Dans la fonction idle, on n'oubliera pas d'utiliser glutPostRedisplay ou
        glutPostWindowRedisplay pour poster un ordre de réaffichage de l'image après
        modification du compteur d'images.   
   
 LumieresAnimeesFichier source complet : LumieresAnimees.cpp
 Modules utilitaires: Modules.zip
 Question 2: Modélisation fil de fer d'un
    volume de révolution 
      Le volume de révolution est dessiné:(1) en traçant n fois le polygone avec une rotation de n/360.0F° autour de l'axe Oy
        entre chaque tracé (ci-dessous, tracés en rouge),
 (2) en reliant en cercle chacune des positions consécutives de chacun des points du
        polygone (ci-dessous, tracés en bleu).
Tant dans le cas (1) que dans le cas (2), les primitives graphiques utilisées sont des
        boucles de segments de droite : GL_LINE_LOOP.Pour optimiser les calculs numériques, les coordonnées de l'ensemble des sommets
        utilisés sont calculées dans un premier temps et stockées dans un tableau. Puis le
        tableau est utilisé pour modéliser les primitives graphiques.Les sommets de modélisation sont calculés par implantation de la matrice de
        transformation correspondant à chacune des rotations autour de l'axe y (en coordonnées
        homogènes) et produit de chaque sommet du polygone (casté en coordonnées homogènes)
        par chacune de ces matrices.     
 VolumeRevolutionFichier source complet : VolumeRevolution.cpp
 Modules utilitaires: Modules.zip
 Question 3: Variantes de l'algorithme de
    Bresenham pour le tracé de segments 
 
      Le motif de tracé est stocké dans un entier. Chaque bit caractérise une information
        booléen (vrai -> afficher, faux -> ne pas afficher). Les bits sont extraits par
        décalage des bits d'information vers la droite et utilisation du masque binaire 0x0001.La boucle générale de tracé itère sur i. le modulo 16 de cette valeur nous indique le
        bit à tester pour décider de tracer un pixel ou non.
 
 
      Au cours de l'exécution de l'algorithme, chaque fois qu'un décalage en x et en y sont
        réalisés au cours de la même itération pour aller tracer un pixel dans un des quatre
        coins d'un autre pixel, il faudra allumer en plus un second pixel pour obtenir la
        4-connexité.Si on considère la position (x, y) du pixel initial et la position (x+xi, y+yinc) du
        nouveau pixel tracé, deux positions candidates existent pour le pixel supplémentaire:
        (x+xi, y) et (x, y+yinc).
 Le choix entre ces deux positions est réalisé pour coller au plus près du segment
        continu. Pour cela, on utilise cumul qui, s'il est supérieur à la moitié de sa valeur
        d'incrément, conduira au choix d'une des positions candidates et à l'autre sinon.
 
 SegmentsBresenhamFichier source complet : SegmentsBresenham.cpp
 Modules utilitaires: Modules.zip
 Question 4: Calcul de l'équation cartésienne
    d'un plan 
      Si le vecteur a pour coordonnées (dx, dy, dz) et le point p a pour coodonnées (px, py,
        pz), alors, l'équation ax + by + cz + d = 0 définissant le plan doit vérifier a = dx, b
        = dy, c = dz et d = -(dxpx+dypy+dzpz).Démontration:Tout vecteur du plan peut être considéré comme allant du point p à un autre point du
        plan de coordonnées (x, y, z) vérifiant ax + by + cz + d = 0 (1)
 -> Ce vecteur a comme coordonnées (x-px, y-py, z-pz).
 Or, s'il appartient au plan, ce vecteur doit être orthogonal au vecteur normal au plan.
 -> le produit scalaire entre ces deux vecteurs doit être égal à 0.
 -> (x-px)dx + (y-py)dy + (z-pz)dz = 0
 -> dx x + dy y + dz z - (pxdx+pydy+pzdz) = 0
 -> Avec l'équation (1), a = dx, b = dy, c = dz et d =-(dxpx+dypy+dzpz)
   
   
 NormaleVersPlanFichier source complet : NormaleVersPlan.cpp
 Modules utilitaires: Modules.zip
 Question 5: Quantité d'énergie diffusée sous
    l'éclairage d'une lumière directionnelle 
      La structure de données direction est définie en coordonnées homogènes pour
        supporter les transformations géométriques.La structure de données couleur peut intégrer ou non un champs alpha. Ses champs r, v
        et b peuvent être de type entier ou réel avec un intervale de variabilité entre 0 et
        une valeur maximale donnée (255 en entier 8 bits, 1.0 en réel).La structure de données énergie lumineuse colorée comprend les mêmes champs que le
        structure couleur mais leurs intervales de variabilité courent de 0 à l'infini.La structure lumière directionnelle est caractérisée par une direction, une couleur
        et une intensité. On pourrait aussi la représenter par une direction et une énergie
        lumineuse colorée.Le matériel comporte un champ coefficient de diffusion de type couleur.L'énergie lumineuse diffusée en un point d'une surface soumis à l'éclairage d'une
        source lumineuse directionnelle calculé au moyen de la formule de Lambert dépend du
        coefficient de diffusion du matériel, de la source lumineuse et de la normale à la
        surface au point de diffusion.La position du point n'a pas d'importance car l'intensité lumineuse reçue depuis une
        lumière directionnelle est uniforme dans l'espace de la scène (la source est placée
        "à l'infini").
Un résultat négatif au calcul du produit scalaire de la formule de Lambert conduit à
        une intensité diffusée égale à 0.0 pour les composantes rouge, verte et bleue.   
   
 DiffusionSousLumiereDirectionnelleFichier source complet :
    DiffusionSousLumiereDirectionnelle.cpp
 Modules utilitaires: Modules.zip
 |