Sujets et Corrections |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
TD n°1 : Premières scènes OpenGL Exercice n°1
(1) Programmer en OpenGL la scène suivante sous la forme d'une fonction C sans utiliser les fonctions glPushMatrix et glPopMatrix ailleurs
qu'en début et fin de fonction: (2) Reprogrammer en OpenGL la scène de la question (1) de telle manière que les cubes aient une de leurs faces orientée vers l'origine du repère. (3) Reprogrammer en OpenGL la scène de la question (2) en utilisant les fonctions glPushMatrix et glPopMatrix pour rendre les objets indépendants les uns des autres et simplifier l'écriture de la fonction scène.
(4) Programmer une scène OpenGL en plaçant 3 cubes de coté 2.0 aux 3 sommets d'un triangle équilatéral défini
avec les caractéristiques suivantes:
Exercice n°2
(1) Programmer la scène OpenGL modélisant un bras robot simplifié composé d'un avant-bras et d'un bras.
(2) Modifier la fonction OpenGL de l'exercice n°1 en remplaçant les parallélépipèdes par des cylindres de tailles équivalentes.
Exercice 3 a) Implanter en OpenGL une fonction de dessin d'une molécule de Benzène (C6H6).
Les atomes de carbone (atome centraux) ont un rayon égal à 0.5.
b) Modifier la modélisation de la molécule de benzène de la question précédente pour que les liaisons carbone-carbone
soient alternativement des liaisons simples et des liaisons doubles (voir figure ci-dessous).
Solutions
TD n°2 : Modélisation par facettes Exercice n°1
a) Modéliser par facettes un cube de coté c centré sur l'origine du repère de modélisation. On ne générera
pas les normales.
b) Modifier la modélisation de la question précédente pour ajouter la gestion des normales.
a) Modéliser par facettes un cylindre selon les caractéristiques suivantes:
b) Ajouter un découpage latéral (selon l'axe y) pour une valeur nl.
Solutions
TD n°3 : Paramètrage numérique de caméras Exercice n°1
a) On considère une caméra de visualisation en projection parallèle orthographique placée en position (0.0, 0.0, 0.0) orientée selon l'axe (0.0,
0.0, -1.0). On considère une scène centrée sur le point de coordonnées (0.0, 0.0, -100.0) et occupant un volume circulaire de rayon voisin de 10.0.
b) On considère une caméra de visualisation en projection en perspective placée en position (0.0, 0.0, 0.0) orientée selon l'axe (0.0, 0.0, -1.0).
On considère une scène centrée sur le point de coordonnées (0.0, 0.0, -100.0) et occupant un volume circulaire de rayon voisin de 10.0. Exercice n°2 Une caméra de visualisation en perspective OpenGL est obligatoirement placée en position (0.0, 0.0, 0.0) du repère de modélisation. Elle est obligatoirement orientée pour selon l'axe de projection (0.0, 0.0,-1.0).
a) On considère une scène modélisée au sein d'une fonction C de manière à être centrée autour de l'origine du repère de modélisation associé
à la fonction.
b) On considère la scène de la question (a).
c) On considère la scène de la question (a). Solutions
TP n°1 : Premières implantations OpenGL Exercice n°1
Télécharger le fichier archive 2013-2014.zip. Ce fichier archive contient une "solution" Visual Studio 2010.
La solution comprend un seul projet nommé Exemple. Ce projet inclut un seul fichier source Exemple.cpp et est configuré pour une compilation utilisant
OpenGL: a) Extraire l'archive IG-2013-2014. Lancer Visual Studio 2010 et charger la solution. Vérifier la compilation et l'exécution du projet Exemple. Les cylindres n'existent pas dans GLUt, on pourra utiliser le module suivant pour les modéliser: ModuleCylindres.h, ModuleCylindres.cpp. b) Implanter la question (4) de l'exercice n°1 du TD n°1. c) Implanter l'exercice n°3 du TD n°1.
TP n°2 : Scènes OpenGL, GLUT et caméras Exercice n°1 Implanter et tester le fonctionnement de l'exercice n°1 du TD n°1 (quatre cubes).
Exercice n°2 Tester les trois possibilités existant pour ajuster la taille des objets à l'écran de manière à voir la scène en gros plan:
Exercice n°3 a) Ajouter un contrôle clavier pour que les cubes de la scène puissent être remplacés par des sphères (et réciproque). La fonction void glutSolidSphere(double rayon, int n,int m) peut être utilisée pour modéliser une sphère. b) Ajouter un contrôle clavier pour que les objets puissent être affichés soit en mode plein, soit en mode fil de fer (fonction glPolygonMode d'OpenGL).
Exercice n°4 a) Tester les configurations de caméra définies aux 3 questions de l'exercice n°2 du TD n°3. b) Tester la configuration par gluLookAt d'une caméra placée en position (0.0, 100.0, 0.0), orientée vers l'origine et d'axe vertical (0.0, 1.0, 0.0). Solutions
TD n°4 : Lumières et matériaux en OpenGL Exercice n°1 a) Développer le code source OpenGL permettant de configuer la lumière n°0 en tant que lumière ponctuelle placée en position (0.0, 0.0, 2.5). Sa composante d'émission diffuse est rouge. Sa composante d'émission spéculaire est blanche.
b) Développer le code source OpenGL permettant de configuer la lumière n°1 en tant que lumière directionnelle de direction d'incidence (1.0, 0.0, 0.0). Sa composante d'émission diffuse est verte. Sa composante d'émission spéculaire est blanche.
c) Développer le code source OpenGL permettant de configuer la lumière n°2 en tant que spot placé en position (2.0, 10.0, 2.0), orienté vers le point de coordonnées (-2.0, 0.0, -2.0) et d'ouverture 20.0°. Sa composante d'émission diffuse est bleue. Sa composante d'émission spéculaire est blanche.
d) Ajouter au code de paramétrage la lumière n°0 les appels OpenGL permettant de configurer une atténuation de l'éclairage en fonction inversement proportionnelle du carré de la distance entre la source lumineuse et le point éclairé.
e) Proposer une solution permettant de choisir la position de placement de la lumière ponctuelle de la question (a) et la direction d'orientation de la lumière directionnelle de la question (b) par rotation d'une valeur d'angle autour de l'axe Oy.
Exercice n°2 a) Développer le code source OpenGL permettant de configurer le matériel pour qu'il adopte la couleur blanche en diffusion et la couleur noire en spéculaire, ambiant et émission.
b) Développer le code source OpenGL permettant de configurer le matériel pour qu'il adopte la couleur rouge en diffusion et la couleur noire en spéculaire, ambiant et émission.
c) Développer le code source OpenGL permettant de configurer le matériel pour qu'il adopte la couleur jaune en diffusion et la couleur noire en spéculaire, ambiant et émission.
d) Développer le code source OpenGL permettant de configurer le matériel pour qu'il adopte la couleur blanche en diffusion et spéculaire et la couleur noire en ambiant et émission. La réflectivité est configurée avec la valeur 64.0.
Solution
TP n°3 : Lumières et matériaux en OpenGL Implanter les exercice du TD n°4 sur la scène du TP n°2 constituée de 4 sphères. Solution
TP n°4 : Animation en OpenGL + GLUt
La scène OpenGL à utiliser pour ce TP est contenue dans le fichier Mobile.cpp et est décrite par le fichier
d'entête Mobile.h.
a) Intégrer cette scène dans un programme permettant de l'afficher. b) Déterminer l'orientation et la position du repère de modélisation associé à la fonction void mobile(void). c) Animer cette scène pour qu'elle tourne sur elle-même autour de l'axe y à raison de 1° de rotation entre chaque image.
d) Modifier la fonction void mobile(void) pour que les roues puissent tourner d'un nombre de degrés passé en paramètre. Le fichier Damier.cpp et son fichier d'entête associé Damier.h définissent un damier de 40 sur 40 cubes de coté 1.0 aternativement blanc et noir. Il est modélisé dans le plan xz, centré sur l'origine selon ces deux axes et avec la face supérieure des cubes en y = 0.0.
d) Développer un programme d'affichage OpenGL où le mobile semble se déplacer en roulant sur le damier sur une trajectoire circulaire de rayon 15.0 centrée sur l'origine selon les axes x et z, définie dans le plan xz, à raison de 1.0° de rotation entre chaque image. On s'efforcera d'implanter un mouvement de rotation des roues en accord avec le déplacement du mobile.
e) Modifier le programme de la question (d) pour déplacer la caméra en même temps que le mobile en la plaçant derrière et légèrement au dessus de lui selon les images ci-dessous.
Solutions
TD n°5 : Mathématiques de l'Informatique Graphique Exercice n°1 Proposer une méthode permettant de tester la planarité d'une facette à 4 sommets. Exercice n°2 a) Développer en C++ une classe CoordonneesHomogenes3D. b) Dériver de la classe CoordonneesHomogenes3D une classe Position3D pour le stockage de positions dans un espace à trois dimensions. c) Dériver de la classe CoordonneesHomogenes3D une classe Direction3D pour le stockage de directions dans un espace à trois dimensions. d) Développer une méthode de calcul du produit scalaire de deux Direction3D. e) Développer une méthode de calcul du produit vectoriel de deux Direction3D. f) Implanter une fonction ou une méthode de test de la planarité de facettes à 4 sommets.
Solutions
TP n°5 : Plaçage de texture bitmap
L'archive zip suivante contient les fichiers sources d'une librairie de gestion des fichiers png: Png.zip. a) Importer cette archive, en faire l'extraction, inclure l'ensemble des fichiers qu'elle contient dans un projet de développement, vérifier la compilation et l'exécution par importation d'une image png sous la forme d'un tableau de pixels (sans affichage). On pourra se servir de l'image Test.png qui est formée d'une matrice de 64x64 pixels dont la première ligne est bleue. b) Implanter un programme OpenGL de dessin d'un carré de coté 6.0 sur lequel est placée une image bitmap.
c) Implanter un programme OpenGL de modélisation d'un cylindre sur le tube duquel est placée une texture bitmap.
On pourra utiliser et adapter la fonction ci-dessous.
/* Modelisation par facettes d'un cylindre */ On pourra se reporter au chapitre sur le texturage pour une description plus précise des principes utilisés pour cette technique et à la partie 3 du chapitre sur OpenGL pour son application en OpenGL. Solution
TP n°6 : Mathématiques de l'Informatique Graphique Implanter l'exercice n°2 du TD n°5
Solution
TD n°6 : Mathématiques de l'Informatique Graphique Exercice n°1 a) Développer en C++ une classe TransformationGeometrique3D en coordonnées homogènes. b) Dériver de la classe TransformationGeometrique3D une classe Translation3D pour le stockage d'opérateurs de type translation de vecteur (tx, ty, tz). c) Dériver de la classe TransformationGeometrique3D une classe Rotation3D pour le stockage d'opérateurs de type rotation d'angle a autour de l'axe (ax, ay, az) passant par l'origine. d) Implanter une méthode de transformation d'une position ou d'une direction par une translation ou une rotation. e) Implanter une méthode de composition d'une transformation géométrique par une transformation géométrique.
Solutions
TP n°7 : Mathématiques de l'Informatique Graphique Implanter l'exercice n°1 du TD n°6
Solutions
TD n°7 : Tracé de courbes B-Splines Exercice n°1 Développer une classe permettant de modéliser une ligne polygonale. Exercice n°2 a) Reprendre la classe mère TransformationGeometrique3D pour la faire dériver d'une classe mère Matrice4x4. b) Reprendre la classe mère CoordonneesHomogenes3D pour la faire dériver d'une classe mère Vecteur4. c) Implanter un constructeur de calcul d'une ligne polygonale par lissage d'un quadruplet de sommets 3D au moyen d'une courbe B-Spline. d) Implanter un constructeur de calcul d'une ligne polygonale par lissage d'une ligne polygonale au moyen d'une courbe B-Spline par morceaux.
Solutions
TD n°8 : Remplissage d'une facette triangulaire Implanter une fonction de remplissage 2D d'un triangle.
Méthode: Remplir un triangle en 2D peut être réalisé en traçant toutes les lignes horizontales de pixels délimitées par ses bords gauche et droit. Il convient donc de déterminer les abscisses extrèmes de ces lignes horizontales pour chacun des y compris entre ymin et ymax où ymin (resp. ymax) est la valeur minimale (resp. maximale) des ordonnées des 3 sommets de définition du rectangle.
Ainsi, deux tableaux xd et xg sont calculés dont les indices correspondent aux ordonnées y des lignes de pixels.
Solutions
TP n°8 : Clipping par l'algorithme de Cohen-Sutherland
On considère les fichiers sources contenus dans le fichier zip suivant: ClippingCohenSutherlandVide.zip.
Ils constituent une application OpenGL de calcul et d'affichage d'un segment clippé dans un rectangle à bord horizontaux et verticaux au
moyen de l'algorithme de Cohen-Sutherland. Les méthodes correspondant aux questions (a), (b), (c) et (d) suivantes ont été "vidées".
Il convient de les complèter pour que l'application devienne compilable et exécutable. a) Développer une méthode permettant de déterminer le code de Cohen-Sutherland (valeur entière) d'une Position2D vis à vis d'un Rectangle2D. b) Développer une méthode permettant de déterminer l'abscisse de l'intersection entre un Segment2D et une droite horizontale (connue par son ordonnée). c) Développer une méthode permettant de déterminer l'ordonnée de l'intersection entre un Segment2D et une droite verticale (connue par son abscisse). d) Développer une méthode permettant de clipper un Segment2D dans un Rectangle2D (algorithme de Cohen-Sutherland).
Solutions
TP n°9 : Calcul de la quantité d'énergie diffusée en un point éclairé par une source lumineuse
On considère les classes Rvb, Couleur, Energie suivantes:
On considère les classes Lumiere et LumiereDirectionnelle suivantes: a) Développer une méthode permettant de calculer la quantité d'énergie diffusée sous l'éclairage d'une LumiereDirectionnelle en une Position3D extraite d'une surface où la normale est connue sous la forme d'une Direction3D. Les coefficients de diffusion de la surface sont définis par la donnée d'une Couleur. La formule de calcul à utiliser est la formule de Lambert.
Sphère éclairée par une lumière directionnelle
Pour cette question, il convient de développer une méthode virtuelle dans la classe Lumiere qui sera implantée concrètement dans la classe LumiereDirectionnelle.
Son prototype est:
On considère la classe LumierePonctuelle suivante: b) Développer une méthode permettant de calculer la quantité d'énergie diffusée sous l'éclairage d'une LumierePonctuelle en une Position3D extraite d'une surface où la normale est connue sous la forme d'une Direction3D. Les coefficients de diffusion de la surface sont définis par la donnée d'une Couleur.
Sphère éclairée par une lumière ponctuelle Pour cette question, il convient de développer une nouvelle implantation de la méthode de calcul de diffusion dans la classe LumierePonctuelle.
On pourra utiliser le programme DiffusionsLambertiennes.cpp et les classes mathématiques
MathematiquesIG.zip pour tester les deux méthodes développées. Remarque: Ce code source montre comment utiliser deux (plusieurs par extension) fenêtres ainsi que les menus popup. Solutions
TP n°10 : Lancer de rayons: Calcul des directions de réflexion et transmission
a) Concevoir deux méthodes de la classe Direction3D permettant de calculer la direction d'un rayon réfléchi lors d'une réflexion spéculaire.
Ces 2 méthodes réalisent les mêmes calculs mais possèdent des prototypes différents.
b) Concevoir une méthode de la classe Direction3D permettant de calculer la direction d'un rayon transmis à l'interface entre deux milieux
lors du passage entre ces deux milieux.
Rayon incident en jaune, normale en magenta, rayon réfléchi en rouge, rayon transmis en bleu
ni < nt -> Rayon transmis dévié vers le vecteur opposé au vecteur normal
Cas particulier: Pas de rayon transmis On pourra utiliser le programme RayTracingVide.zip (fonction main dans RayTracing.cpp) pour tester les 2 méthodes développées. Ce programme implante un calcul d'images par lancer de rayons.
Il s'appuie sur l'ensemble des classes développées depuis le début des séances de TD et de TP (voir ci-dessous). Solutions
TD n°9 : Lancer de rayons: Calculs d'intersection objet-rayon
On considère la classe Materiel suivante:
On considère la classe RayonLumineux suivante:
On considère les classes Objet et Sphere suivantes:
a) Implanter une méthode permettant de tester l'existence d'une intersection entre un rayon lumineux et une sphère.
b) Implanter une méthode permettant de déterminer la distance existant entre le point d'émission d'un rayon lumineux et une sphère. S'il
n'y a pas d'intersection, la distance -1.0 sera retournée. Solutions
Hiérarchie de classes
|