Universit´
e de Sherbrooke
D´
epartement d’informatique
Automne 2012
IMN528 – Synth`ese d’images
TP1 (Fondations d’un lanceur de rayons)
Mise en contexte
Le rendu par lancer de rayon est un algorithme de rendu simple et populaire permettant d’atteindre un
niveau ´elev´e de r´ealisme dans l’affichage de sc`enes virtuelles. Le lancer de rayon repose sur les lois de la
physique optique et simule le parcours inverse de la lumi`ere lors de la composition d’une image. De plus,
contrairement aux m´ethodes de rendu polygonales, le lancer de rayon ne se limite pas au rendu de triangles
et utilise plutˆot des primitives math´ematiques pour d´efinir le contenu d’un sc`ene.
Le lancer de rayon reposant sur la simulation de la lumi`ere et des primitives g´eom´etriques, il devient
primordial de savoir calculer l’intersection entre ceux-ci afin de d´eterminer quand et o`u un rayon de lumi`ere
touche `a une surface. Ce travail pratique vise `a vous familiariser avec les bases d’un lanceur de rayons, soit
la manipulation de rayons et le calcul d’intersections.
Objectifs acad´emiques
1. Savoir manipuler des droites math´ematiques born´ees dans un contexte de lancer de rayon.
2. Savoir manipuler des matrices de transformation et de projection pour la cr´eation d’images par lancer
de rayon.
3. Int´egrer des algorithmes de calcul d’intersections entre des primitives g´eom´etriques diverses et un rayon.
4. Savoir manipuler des primitives g´eom´etriques dans un contexte de lancer de rayon.
5. Savoir impl´ementer efficacement des processus ou algorithmes math´ematiques complexes.
Description du travail
Dans ce travail pratique, vous devrez mettre en place les ´el´ements suivants :
La boucle de lancer de rayon, qui consiste `a utiliser les matrices de transformation (mod`ele-vue et
projection) pour cr´eer votre image finale.
Le parcours d’une sc`ene contenant des primitives g´eom´etriques, afin de pouvoir tester les intersections
entre un rayon et les objets de la sc`ene.
Le calcul des intersections et de la normale `a l’intersection entre un rayon et les primitives g´eom´etriques
suivantes : une sph`ere,un cube,un plan fini,un cylindre et un cˆone. Le calcul d’intersections
doit tenir compte des transformations g´eom´etriques appliqu´ees `a ces primitives. Le calcul d’intersection
pour le tore peut aussi ˆetre impl´ement´e pour avoir des points bonus.
Le rendu OpenGL des primitives pour lesquelles le calcul d’intersections doit ˆetre effectu´e.
1
Dans le cadre de ce travail, un moteur de lancer de rayon partiellement programm´e vous sera fourni.
Toutes les composantes p´eriph´eriques du moteur qui ne sont pas directement reli´ees au lancer de rayon ont
d´ej`a ´et´e programm´ees pour vous. Votre tˆache, tout au long de la session, consistera `a impl´ementer certaines
m´ethodes ou fonctions laiss´ees vides touchant au processus du lancer de rayon et correspondant `a la mati`ere
vue en classe.
Dans ce premier travail, vous devrez vous concentrer sur le lancer des rayons `a partir de la cam´era vers
la sc`ene et le calcul des intersections avec la g´eom´etrie. `
A la fin du premier travail, vous verrez apparaˆıtre la
g´eom´etrie avec une couleur unie, sans effet d’´eclairage. Lors du deuxi`eme travail pratique, vous construirez
sur le code du premier TP afin d’ajouter des effets d’illuminations avanc´es.
Globalement, le moteur de lancer de rayon poss`ede une fenˆetre de pr´evisualisation OpenGL o`u vous
pouvez contrˆoler la cam´era `a l’aide de la souris et pr´evisualiser votre sc`ene. Lorsque vous ˆetes satisfait de
l’angle de vue, vous pouvez appuyer sur la touche rde votre clavier afin de lancer le rendu de votre sc`ene.
`
A ce moment, une deuxi`eme fenˆetre apparaˆıtra et le rendu par lancer de rayons s’y affichera. Bien entendu,
vous n’avez pas encore programm´e le lancer de rayon ni l’affichage des primitives sous OpenGL. Vous ne
verrez donc probablement qu’une sc`ene vide !
Trois classes distinctes forment la base du syst`eme, et la majorit´e de votre travail sera effectu´e dans ces
classes : la classe Scene, la classe Camera et les classes qui h´eritent de Object.
Classe Object :La classe Object est la classe parente de tous les objets affichables contenus dans la
sc`ene. C’est donc dire que les classes dont vous devez impl´ementer l’intersection, soit Sphere,Cylinder,
Plane et Cone d´erivent de cette derni`ere. (La classe Torus peut aussi optionnellement ˆetre impl´ement´ee
pour avoir des points en bonus.) Lors du rendu de la sc`ene dans le pr´evisualisateur OpenGL, la m´ethode
virtuelle glRender() est appel´ee. Vous devrez impl´ementer cette m´ethode en utilisant les commandes OpenGL
vues dans le cours d’infographie (IMN428). Lors du rendu par lancer de rayons, la m´ethode intersects()
est appel´ee pour v´erifier si un rayon intersecte avec l’objet g´eom´etrique. Cette m´ethode doit retourner un
bool´een indiquant si une intersection s’est produite. Si c’est le cas, vous devrez aussi assigner des valeurs aux
param`etres interPos (position du point d’intersection), normal (normale de l’objet au point d’intersection),
distance (distance entre l’origine du rayon et le point d’intersection) et hitColor (couleur de l’objet au
point d’intersection). La couleur est obtenue avec la m´ethode getColor(). Notez que la classe Cube est d´ej`a
impl´ement´ee, tant pour le rendu OpenGL que le calcul d’intersections. Vous pouvez donc vous en inspirer
pour l’impl´ementation des autres classes. La classe Object et les classes en h´eritant sont situ´ees dans le dossier
Raytracer/source/renderables.
Classe Camera :La classe cam´era est situ´ee dans le dossier Raytracer/source/scene de votre travail
pratique. Cette classe sert `a d´efinir les caract´eristique de la cam´era utilis´ee pour le rendu OpenGL et le
rendu par lancer de rayon. La m´ecanique de cam´era sous OpenGL ´etant d´ej`a programm´ee, vous n’aurez
qu’`a vous concentrer sur le lancer de rayon. Lorsque le logiciel demande `a la cam´era de rendre la sc`ene
en utilisant le lancer de rayon, la m´ethode renderRayTracedImage() est appel´ee. Dans cette m´ethode, vous
devrez impl´ementer une boucle lan¸cant des rayons `a travers la sc`ene de mani`ere `a remplir chaque pixel
de l’image `a rendre. Les dimensions de l’image `a rendre sont donn´ees par les param`etres de la m´ethode.
Pour lancer les rayons dans votre sc`ene, vous devrez construire les matrices de transformation mod`ele-
vue et projection de votre cam´era. Ces derni`eres peuvent ˆetre respectivement construites en utilisant les
fonctions cameraModelViewMatrix et perspectiveProjectionMatrix fournies dans le fichier vision helpers.h
situ´e dans le dossier Raytracer/source/base. Ces fonctions requi`erent les caract´eristiques de votre cam´era,
disponibles via les m´ethodes pr´evues `a cet effet dans la classe Camera. Lorsque votre rayon a correctement
´et´e initialis´e, vous pourrez le soumettre `a votre sc`ene (param`etre scene) en utilisant les m´ethodes pr´evues `a
cet effet dans la classe Scene. (Plus de d´etail sur ces m´ethodes dans le paragraphe qui suit.) Les m´ethodes en
question de la classe Scene retourneront une couleur, que vous devrez ´ecrire dans l’image de sortie du lanceur
de rayon. Des informations sur l’´ecriture des couleurs dans un pixel de l’image de sorties sont fournies dans
l’impl´ementation de la m´ethode renderRayTracedImage.
2
Classe Scene :La classe sc`ene est la classe contenant tous les objets de type Object qui constituent la
sc`ene. Cette classe poss`ede deux m´ethodes importantes `a impl´ementer, soit la m´ethode performRayScene-
Search() et la m´ethode performHitTestSearch(). La premi`ere, performRaySceneSearch() re¸coit un rayon en
param`etre et doit it´erer `a travers tous les objets de la sc`ene afin de v´erifier si un de ceux-ci intersecte avec
le rayon. Faites attention cependant, plusieurs objets peuvent intersecter avec un mˆeme rayon, il faut donc
conserver le point d’intersection le plus pr`es. Lorsque le point d’intersection a ´et´e trouv´e, la fonction doit
retourner la couleur de l’objet intersect´e. Dans les travaux `a venir, vous devrez effectuer un calcul d’illumi-
nation afin de d´eterminer la couleur. Pour ce travail, vous n’avez qu’`a retourner la couleur contenue dans le
param`etre hitColor retourn´e par la m´ethode intersects() des objets Objects. La m´ethodes performHitTest-
Search() doit aussi ˆetre impl´ement´ee en pr´evision des travaux futurs. Elle ne sera cependant pas utilis´ee
directement dans le travail courant. Globalement, cette m´ethode re¸coit un rayon et un seuil de longueur.
Elle doit simplement retourner true si un objet intersecte le rayon `a une distance inf´erieure au seuil, et false
autrement. La classe Scene est situ´ee dans le dossier Raytracer/source/scene.
Outre les trois classes importantes, une s´eries de classes math´ematiques utiles vous est fournie dans
le dossier Raytracer/source/base. Ce dossier contient tous les outils math´ematiques n´ecessaires `a la
r´ealisation d’un rendu par lancer de rayon (Matrices de transformation, couleur, vecteur, rayon, etc.). Il est
donc fortement recommand´e d’utiliser ces derni`eres pour faciliter la r´ealisation du travail pratique.
Finalement, notez que vous pouvez sauvegarder vos images rendues par lancer de rayons en cliquant sur
la fenˆetre du rendu puis en appuyant sur la touche sde votre clavier. Une image sera sauvegard´ee dans votre
r´epertoire de travail sous le nom rendered image.bmp.
D´efinition de la sc`ene 3D
Le moteur de lancer de rayon poss`ede un syst`eme de d´efinition de sc`ene 3D. Il est donc possible de charger
diff´erentes sc`enes 3D pour varier vos tests. La sc`ene 3D `a charger est sp´ecifi´ee dans le fichier main.cpp `a la
ligne 15. Vous pouvez y inscrire un nom de sc`ene diff´erent pour charger une autre sc`ene (les sc`enes disponibles
sont situ´ees dans le r´epertoire RayTracer/resources du TP.)
Si vous ˆetes curieux, vous pouvez aussi modifier les sc`enes affich´ees en ´editant directement les fichiers de
sc`ene. Une liste des commandes disponibles et de leurs param`etres est disponible dans le fichier scene reader const.h
situ´e dans le dossier Raytracer/source/utilities. Prenez cependant note que certaines fonctionnalit´es des
sc`enes (comme l’´eclairage par exemple) ont ´et´e d´esactiv´ees pour le premier travail pratique. Certaines com-
mandes n’auront donc pas d’effet sur la sc`ene.
Strat´egie d’impl´ementation
Pour faciliter l’impl´ementation, il est recommand´e d’utiliser la sc`ene de test Scene Cubes.sce pour
commencer. Cette sc`ene ne contient que des cubes, vous pourrez donc d`es le d´ebut visualiser cette derni`ere
dans la fenˆetre OpenGL puisque l’impl´ementation de la classe Cube est d´ej`a fournie.
`
A partir de cette sc`ene, vous pourrez impl´ementer les m´ethodes des classes Camera et Scene en ayant
l’assurance qu’il n’y a pas d’erreur dans le calcul d’intersection ou les transformations g´eom´etriques des
cubes. Si ces m´ethodes sont bien impl´ement´ees, l’image r´esultante devrait ˆetre pratiquement identique `a
l’image de la fenˆetre OpenGL.
Une fois l’impl´ementation des m´ethodes manquantes dans Camera et Scene compl´et´ee, vous pourrez
poursuivre avec l’impl´ementation des autres primitives. Des sc`enes de test pour chaque types de primitives
sont pr´evues dans le dossier RayTracer/resources.
Finalement, puisque l’´eclairage n’a pas encore ´et´e impl´ement´e, il ne sera pas possible de directement
valider les normales. Une fa¸con de v´erifier si votre normale est dans la bonne direction est de prendre les
trois composantes (X, Y, Z) normalis´ees de la normale et de les ´ecrire comme ´etant les trois composantes
de la couleur `a afficher lors du rendu par trac´e de rayon (R, G, B). L’image r´esultante sera une image o`u
3
chaque couleur correspond `a la normale, une couleur rouge serait donc une normale ayant la valeur (1,0,0).
G´en´erer une image des normales est une pratique courante en infographie et l’image r´esultante s’appelle une
carte de normales (normal map). Vous pourrez ainsi temporairement visualiser vos normales et les valider.
Assurez-vous de remettre les couleurs initiales avant de remettre votre TP !.
Bonus
Pour ce travail pratique, il est possible d’obtenir jusqu’`a 3 (sur 15) points en bonus. Pour obtenir le bonus,
vous devrez impl´ementer un test d’intersections et calculer la normale pour un tore. Pour ce faire, vous devrez
compl´eter l’impl´ementation de la classe Torus, situ´ee dans le fichier torus.h/.cpp que vous trouverez avec
les autres primitives g´eom´etriques. Une sc`ene de test Scene Bonus Torus.sce est aussi fournie pour tester
votre tore.
Bar`eme de correction
Ce travail est not´e sur 15 points et offre la possibilit´e d’obtenir 3 points en bonus. Les points sont r´epartis
selon les pourcentages suivant :
Lancer de rayons dans la sc`ene 25%
Exploration de la sc`ene pour les intersections 10%
Calcul des intersections et des normales 50%
Qualit´e de la programmation 15%
La qualit´e de la programmation est d´etermin´ee notamment par la qualit´e de sa pr´esentation (indenta-
tion, noms de variable, commentaires, clart´e), et par la qualit´e algorithmique de votre code (complexit´e
algorithmique, efficacit´e de l’impl´ementation).
La validit´e des normale sera v´erifi´ee `a l’aide de cartes de normales tel qu’expliqu´e pr´ec´edemment.
Lors de la correction, votre programme sera valid´e `a l’aide de sc`enes ne figurant pas dans la batterie de
sc`enes fournie avec le travail pratique. La performance de votre impl´ementation n’est pas ´evalu´ee directement
mais un programme anormalement lent sera p´enalis´e.
Modalit´es de remise
Seulement les fichiers .h et .cpp des classes Scene,Camera,Cone,Cube,Cylinder,Plane et Torus doivent
ˆetre remis. Les autres fichiers ne seront pas consid´er´es lors de la correction et celle-ci sera effectu´ee avec la
version originale des autres fichiers. Les modifier pourrait donc empˆecher votre programme de compiler.
Vous avez jusqu’au 28 septembre `a minuit, pour remettre ce travail. La remise peut se faire par turnin
ou par courriel. Dans tous les cas, assurez-vous de vous prendre un peu `a l’avance, afin de ne pas avoir de
surprise d´esagr´eable au moment de soumettre. N’oubliez pas d’inscrire votre nom et celui de vos co´equipiers
dans la remise pour ´eviter toute confusion. Le travail doit s’effectuer en ´equipe de deux ou trois
´etudiants.
Advenant un retard, une p´enalit´e de 25% par jour sera appliqu´ee sur la note du travail pratique. Ce
travail compte pour 15% de la note finale avec un bonus optionnel valant 3%. Un travail ne compilant pas
sur les ordinateur des laboratoires se voit automatiquement donn´e la note 0.
4
Annexe : un peu d’encouragement !
Les rendus pour ce travail seront ´evidemment peu spectaculaires. Ils forment cependant la base pour
votre prochain travail pratique, qui fournira des r´esultats beaucoup plus int´eressants !
5
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !