Correction
examen de TD 2003-2004

RETOUR

Jeudi 15 avril 2004 - 1h25

Exercice 1: Calculs d'illumination

a) Une lumière ponctuelle est caractérisée par une position dans l'espace (implantation en coordonnées homogènes), une énergie (flottant compris entre 0 et l'infini) et une couleur RVB (flottants compris entre 0 et 1). On pourra éventuellement ajouter un champ alpha à la couleur.

b) La lumière étant colorée, l'énergie reçue est, elle-même, colorée.
La fonction développée prend en paramètre une source lumineuse ponctuelle et une position et rend une énergie.
Une fonction distance2 est développée pour calculer le carré de la distance entre deux positions.

c) La formule de Lambert fait appel à un coefficient de diffusion qui prendra une valeur pour le rouge, une valeur pour le vert et une valeur pour le bleu (plus éventuellement une valeur pour le canal alpha). Ces valeurs sont des coefficients et sont donc compris entre 0 et 1. Pour l'implantation des coefficients de diffusion, je crée une structure Matérial avec un champ Kd de type couleur.
La fonction développée prend en paramètre une position, une direction (la normale à la surface), un matériau et une source lumineuse ponctuelle et rend une énergie.
Une structure Direction (en coordonnées homogènes) est utilisée pour représentée les directions.
Une fonction produitScalaire est développée pour calculer le produit scalaire entre deux directions.
Une fonction calculVecteurNorme est développée pour calculer la direction normée entre deux positions.
Au cours de l'implantation, l'obtention d'un produit scalaire négatif conduit à une énergie diffusée nulle car la surface se masque elle-même vis à vis de la source lumineuse.

Fichier source complet : Exam-TD-2003-2004-Exo1.cpp
Modules utilitaires: Modules.zip

Exercice 2: Lancer de rayons

La fonction programmée prend en paramètre les deux directions et considérées comme normées. Elle rend comme résultat le rayon réfléchi calculé et un booléen.Elle utilise la fonction produitScalaire écrite pour l'exercice 1.
Si le produit scalaire donne une valeur inférieure à 0. La fonction ne calcule pas le rayon réfléchi et rend faux sinon elle calcule le rayon réfléchi et rend vrai.

Fichier source complet : Exam-TD-2003-2004-Exo2.cpp
Modules utilitaires: Modules.zip

Exercice 3: Programmation OpenGL

On s'efforce de programmer cet exercice selon les caractéristiques suivantes:
- Les appels de fonction OpenGL sont réalisés uniquement dans les fonctions init et display et pas dans les fonctions idle et key.
- On place dans init les appels de fonction OpenGL devant être réalisés une fois pour toutes (pour le calcul de la première image et de toutes les suivantes) et dans display les appels de fonction OpenGL correspondant à des changements entre chaque image.
- GLUT ne boucle pas sur une fonction idle (même vide) s'il n'y a pas d'animation en cours -> La consommation CPU du programme est optimisée.
- La fonction display n'intègre pas de fonctionnalité de gestion de l'animation (elle ne boucle pas pour calculer plusieurs images, elle ne se lance pas elle-même, elle ne teste pas la fin de l'animation, ...). La fonction idle gère les aspects de la programmation liés à l'animation.
- On utilise le minimum de variables globales (nécessaires avec le idle de GLUT).
- On fait attention aux divisions entières.
- La fonction display intègre tous les appels OpenGL nécessaires (glClear, glFlush, ...).
- Les fonctions idle et key postent les redisplay à bon escient.

Fichier source complet : Exam-TD-2003-2004-Exo3.cpp
Modules utilitaires: Modules.zip

Exercice 4: Algorithmique

L'algorithme développé pour la 3D répondra aux mêmes caractéristiques essentielles que la version 2D:
- Tout voxel (pixel) du segment discret est traversé par le segment continu.
- Tout voxel du segment discret touche au moins un autre voxel soit par l'une de ses faces, soit par une de ses arêtes, soit par l'un de ses sommets (26-connexité).
- On trace le moins possible de voxels.

L'algorithme fait appel à 3 portions de code similaires:
- une où l'on itère en x car l'axe x est l'axe où la différence entre les coordonnées des deux extrémités est maximum,
- une où l'on itère en y car l'axe y est l'axe où la différence entre les coordonnées des deux extrémités est maximum,
- une où l'on itère en z car l'axe z est l'axe où la différence entre les coordonnées des deux extrémités est maximum.

Dans chacune de ces portions, on utilise deux variables d'accumulation: une pour chacune des deux autres coordonnées. Les incréments sont gérés via et sur ces variables comme dans la version 2D (un if simple, surtout pas de while).

Fichier source complet : Exam-TD-2003-2004-Exo4.cpp
Modules utilitaires: Modules.zip

Quelques indications sur l'évaluation

Chaque exercice a été évalué sur 20 (ligne horizontale entre chaque exercice).

Les notes des exercices ont été rapportées à 8.25, 6.75, 8.25 et 7.5, soit un total de 30.75, par multiplication des notes sur 20 par les coefficients 0.275, 0.225, 0.275 et 0.25.

J'ai bien entendu évalué la qualité des réponses fournies aux questions. J'ai aussi été sensible aux explications données, à la structuration des données et à la cohérence globale des différentes réponses aux questions d'un même exercice.

Remarques, erreurs
nicolas.janey@univ-fcomte.fr