Sujets et Corrections |
||||||||||||||||||||||||||||||||||||||||||
TD n°1 TP n°1 TD n°2 TP n°2 TD n°3 TP n°3 TD n°4 TP n°4 TD n°5 TP n°5 TD n°6 TP n°6 TD n°7 TP n°7 TD n°8 TP n°8 TD n°9
Dernière modification |
TD n°1: Création de scènes VRML 1.0 Se référer à VRML 1.0, objets et nuds pour la description des nuds à utiliser. (1) Programmer en VRML la scène suivante sans utiliser le nud Separator ailleurs que pour le Separator d'encadrement global du fichier: Quatre sphères de rayon 1.0 aux positions (2.0,0.0,2.0), (2.0,0.0,-2.0), (-2.0,0.0,2.0) et (-2.0,0.0,-2.0). (2) Reprogrammer en VRML la scène de la question (1) en utilisant le nud Separator pour rendre les objets indépendants les uns des autres. (3) Reprogrammer en VRML la scène en apportant les modifications suivantes:
Solutions TP n°1: Prise en mains d'un environnement de programmation VRML Les viewers disponibles sont:
Travail demandé:
Solutions
TD n°2: Création de scènes OpenGL Exercice n°1 Réaliser l'implantation OpenGL du bras robot du TP n°1. Exercice n°2 Soit la scène composée de huit sphères de rayon 1.0 centrées sur les
sommets d'un cube virtuel de coté 4 lui-même centré sur O, et de 12 cylindres de rayon
0.25 et de longueur 4.0 joignant ces 8 sommets entre eux pour matérialiser les arêtes du
cube de coté 4. Fichiers sources pour dessiner des cylindres Solutions TP n°2: Prise en mains d'un environnement de programmation OpenGL
Exécutable compilé avec Visual C++ et l'OpenGL de Visual C++ Exécutable compilé avec Visual C++ et l'OpenGL Mesa3D
Fichiers sources pour dessiner des cylindres Solutions TD n°3: Utilisation des contrôles clavier et souris sous GLUT 1) Implanter les contrôles clavier GLUT suivants permettant de faire bouger le bras robot des TD et TP n°2:
2) Implanter les contrôles souris permettant de faire tourner le bras robot au moyen de la souris par rotation autour des axes Oy et Ox en corrélation avec les déplacements de la souris en x et en y dans la fenêtre bouton gauche appuyé. Solutions TP n°3: Utilisation des contrôles clavier et souris sous GLUT Fin du TP n°2 et implantation du TD n°3. TD n°4: Les primitives graphiques en OpenGL Exercice n°1 a) Ecrire une fonction de modélisation d'une boite cubique de coté c
centrée sur l'origine du repère. b) Modifier la fonction précédente pour y inclure la spécification des normales aux facettes (utilisées par OpenGL pour les calculs d'éclairage) (cubes gris ombrés sur l'image ci-dessous). Exercice n°2 a) Ecrire une fonction de modélisation d'un cylindre de rayon r, de
hauteur h, possédant n sections radiales, centré sur l'origine et d'axe y. b) Modifier la fonction précédente pour y inclure la spécification des normales aux facettes (utilisées par OpenGL pour les calculs d'éclairage) (cylindres avec ombrage gris sur l'image ci-dessous). Solution TP n°4: Gestion des caméras en OpenGL Les programmes suivants implantent la gestion de caméras OpenGL selon différentes caractéristiques (différents types de caméras avec des paramétrages différents). Ils serviront de base de travail pour l'exercice de TP.
Exercice n°1 Le fichier DeplacementCameraScene.cpp (décrit par le fichier d'entête DeplacementCameraScene.h) contient une fonction void scene(int l) de modélisation d'une scène composée d'une surface plane carrée de diagonale (-10.0, 0.0, -10.0) - (10.0, 0.0, 10.0) sur laquelle sont posés aléatoirement 100 "poteaux" parallélipipédiques. L'éclairage de cette scène est activé/désactivé par le paramètre booléen l. Implanter le dessin de cette scène par une caméra de visualisation en perspective placée en position (0.0, 0.5, 0.0) orientée dans la direction (0.0, 0.0, 1.0). L'ouverture verticale de la caméra est de 60°. Les plans cmin est cmax sont aux distances 0.1 et 100.0. La taille de la fenêtre d'affichage est 450 sur 200 pixels. Exercice n°2 Modifier le programme précédent pour autoriser le déplacement de la caméra au moyen des touches up et down de manière à avancer et reculer dans la scène dans l'axe de la caméra. Exercice n°3 Modifier le programme précédent pour autoriser l'utilisation des touches right et left de manière à faire tourner la caméra vers la droite et vers la gauche tout en continuant à pourvoir utiliser les touches up et down pour avancer et reculer. Solution TD n°5: Animation automatique en OpenGL et GLUT Exercice n°1 On considère une scène quelconque modélisée au sein de la fonction void
scene(void). void display(void) { Modifier cette fonction display et écrire la fonction idle réalisant l'animation automatique de la scène par rotation sur elle-même autour de l'axe Ox à raison de 1° de rotation entre chaque image. Implanter un contrôle clavier utilisant la touche espace pour activer/désactiver cette animation.
Exercice n°2 Modifier la fonction display de l'exercice n°1 pour implanter une animation de caméra de telle manière que celle-ci se déplace sur une trajectoire circulaire d'"altitude" constante y = 7.0, de rayon 20.0 et de centre (0.0, 7.0, 0.0) à raison de 0.1° de rotation entre chaque image. La caméra est orientée en direction du point de coordonnées (0.0, 1.0, 0.0) Exercice n°3 On souhaite implanter un système de particules modélisant un des objets en rotation autour d'un point d'attraction gravitationnelle. La formule définissant la période de révolution T d'un objet en orbite circulaire autour d'un autre objet (2ème loi de Kepler) est T = C*r1.5. r est le rayon de l'orbite. C est une constante qui dépend de la constante d'attraction universelle et de la masse centrale dans le cas d'une orbite circulaire. On utilisera C en tant que variable d'ajustement de la vitesse de rotation. a) Développer un programme OpenGL permettant d'animer une seule particule sphèrique
de rayon 1.0 par rotation autour de O dans le plan xOy selon une trajectoire orbitale
circulaire de rayon r avec une vitesse calculée en accord avec la loi de Kepler (définie
ci-dessus).
b) Modifier le programme précédent pour animer 25000 particules au lieu d'une seule. c) On souhaite maintenant implanter une décroissance au cours du temps du rayon de
l'orbite des particules de manière que cette décroissance soit réalisée selon la
formule récurrente suivante ri+1 = 0.99*ri où i est le numéro
l'image. Solutions TP n°5: Matériaux et lumières en VRML Dans les exercices suivants, on s'attachera à tester les diverses options de rendu relatives à la gestion des ombrages proposée par le viewer VRML utilisé. Exercice n°1 a) Ecrire une scène VRML composée d'une sphère possédant les
caractéristiques suivantes: b) Modifier la scène précédente pour que le matériel intègre une composante de réflexion spéculaire dans le vert. Tester différentes réflectivités. c) Modifier la scène précédente pour y intégrer un éclairage sous la forme d'une source lumineuse directionnelle blanche éclairant depuis la droite. Désactiver la lampe frontale. d) Modifier la scène précédente pour y inclure une seconde sphère de rayon 2 placée en position (10.0, 0.0, 0.0) possédant le même matériel que la première ainsi qu'une seconde source lumineuse ponctuelle blanche placée à l'origine. e) Modifier la scène précédente pour y inclure une source lumineuse
spot blanche placée en position (0.0, 0.0, 10.0) orientée vers l'origine et éclairant
partiellement la grosse sphère. Solutions
Exercice n°2 On considère le matériel suivant: Material {diffuseColor 0 1 0 specularColor 0 0 1 shininess 0.25 ambientColor 1 0 0 emissiveColor 0.2 0.2 0.2 transparency 0 } Analyser les contributions respectives des différentes caractéristiques de ce matériel en l'utilisant dans le cadre de l'exercice n°1. Solution
Exercice 3 On souhaite vérifier le fonctionnement de la gestion des transparences
dans les matériaux vrml. TD n°6: Calcul mathématique de la diffusion au moyen de la formule de Lambert Le travail est à réaliser en langage java. Exercice n°1 a) Définir une classe position dans un espace à 3 dimensions b) Définir une classe direction dans un espace à 3 dimensions c) Définir une classe couleur RVB. d) Définir une classe destinée à modéliser un matériel générant des réflexions diffuses. e) Définir une classe destinée à modéliser une lumière directionnelle f) Définir une classe énergie RVB. g) Implanter une méthode de calcul de l'énergie colorée diffusée au niveau d'un point d'une surface munie d'un matériel sous l'éclairage d'une lumière directionnelle. La normale au point vis à vis de la surface est connue. Exercice n°2 a) Définir une classe destinée à modéliser une lumière ponctuelle b) Implanter une méthode de calcul de l'énergie colorée diffusée au niveau d'un point d'une surface munie d'un matériel sous l'éclairage d'une lumière ponctuelle. La normale au point vis à vis de la surface est connue. TP n°6: Matériaux et lumières en OpenGL
Solutions TD n°7: Mathématiques pour l'Informatique Graphique Ce TD reprend et complète le TD n°6. a) Développer une méthode de calcul du produit vectoriel de deux objets Direction. b) Ecrire une méthode de calcul de la norme d'une Direction. c) Ecrire une méthode normalisation d'une Direction. d) Ecrire un constructeur de la classe Direction pour calculer la direction normée définie par deux objets Position. e) Définir une classe facette à 4 sommets. f) Ecrire une méthode de test de la planarité d'une facette à 4 sommets. g) Ecrire une méthode de test de la convexité du bord d'une facette considérée comme plane. h) Définir une classe de définition géométrique d'un rayon lumineux issu d'une source ponctuelle. g) Définir une classe sphère. i) Ecrire une méthode de test de l'intersection entre un rayon lumineux et une sphère. j) Ecrire une méthode de calcul de (ou des) intersection(s) entre un rayon lumineux et une sphère. TP n°7: Mathématiques matricielles TP à réaliser en Java. a) Définir une classe transformation géométrique en coordonnées homogènes 3D. b) Dériver de cette classe une identite. c) Dériver une classe translation de la classe de la question (a). d) Dériver une classe rotation de la classe de la question (a). e) Dériver une classe scale de la classe de la question (a). f) Définir une classe coordonnées homogènes 3D. g) Dériver de cette classe une classe Position. h) Dériver une classe Direction de la classe de la question (e). i) Implanter le produit matrice.vecteur pour la réalisation de transformations géométriques sur des coordonnées homogènes 3D. j) Implanter le produit matrice.matrice pour la composition de transformations géométriques 3D. TD n°8: Introduction au plaçage de texture TP n°8: Plaçage de texture Exercice n°1: Le texturage en VRML Le fichier VRML Sphere.wrl implante l'affichage d'une sphère non texturée. Modifier ce fichier pour texturer la sphère au moyen de l'image Terre-02048.png en utilisant le noeud propriété Texture2.
Exercice n°2: Le texturage en OpenGL Le but de cet exercice est d'obtenir le même résultat que l'exercice n°1 dans le
cadre de la programmation d'une application C + OpenGL en Visual C++. L'importation d'une image png pourra être réalisé au moyen de la fonction unsigned char *chargeImagePng(char *,int *,int *)
décrite dans le fichier d'entête ChargePngFile.h.
Le résultat de cette fonction est un tableau d'"unsigned char" alloué au sein
de la fonction et rempli avec les composantes r, v, b de chaque pixel de l'image lue. Si
la lecture n'a pas pu être effectuée, la fonction rend NULL. Le premier paramètre
d'entête est la chaine de caractères contenant le nom du fichier png à importer. Le
deuxième paramètre est un pointeur sur int destiné à retourner la résolution rx en x
de l'image lue. Le troisième paramètre est un pointeur sur int destiné à retourner la
résolution ry en y de l'image lue. -> Le tableau rendu contiendra 3 * rx * ry octets. ATTENTION, la génération d'une cible en configuration "Debug" n'est pas possible au moyen de ces librairies. La compilation en configuration "Release" est nécessaire. ATTENTION, l'exclusion de la librairie libc.lib pourrait être nécessaire lors de l'édition de lien de manière à éviter la duplication de certaines fonctions entre librairies par défaut. Le fichier SphereTexturee.cpp contient un programme C + OpenGL qui utilise la fonction chargeImagePng pour importer une image dans un tableau puis utilise ce tableau (de pixels) en tant que texture. Le code correspondant à ces opérations est à la fin de la fonction init. Une fois le plaçage de texture activé via l'exécution de
glEnable(GL_TEXTURE_2D) tout objet dessiné le sera avec texturage.
a) Développer le fichier ModuleSphere.cpp contenant une fonction nommée mySolidSphere possédant un prototype identique à celui de glutSolidSphere. Cette fonction réalisera le dessin d'une sphère et assurera la génération des coordonnées de texturage de cette sphère. On pourra utiliser la fonction suivante: Solution TD n°9: Clipping par l'algorithme de Cohen-Sutherland L'implantation est réalisée en langage java. a) Définir trois classes de stockage pour: b) Implanter une méthode permettant de calculer le code de Cohen-Sutherland associé à une position vis à vis d'un rectangle. c) Implanter une méthode permettant de calculer l'abscisse de l'intersection d'une droite horizontale avec la droite supportée par un segment. d) Implanter une méthode permettant de calculer l'ordonnée de l'intersection d'une droite verticale avec la droite supportée par un segment. e) Implanter une méthode de calcul du segment clippé d'un segment vis à vis d'un rectangle. TP n°9: L'algorithme de Bresenham pour le tracé de segments 3D et le remplissage d'une facette triangulaire 2D Le programme Bresenham.cpp utilise la version de l'algorithme de Bresenham dédié au dessin d'un segment sur une écran bitmap. a a) Généraliser cet algorithme 2D au dessin de segments 3D. b) Utiliser cet algorithme pour développer un algorithme de remplissage des facette triangulaire 2D. Solutions TD n°10: Calcul de l'intersection entre une sphère et un rayon, des rayons réfléchi et transmis dans le cadre de l'implantation d'un algorithme de lancer de rayons Le TD est réalisé en langage C. Les structures suivantes devront être utilisées:
a) Implanter une fonction permettant de tester l'existence d'une intersection entre un rayon lumineux et une sphère. b) Implanter une fonction permettant de déterminer, si elle existe, la distance entre le point d'émission d'un rayon lumineux et l'intersection entre ce rayon et une sphère. c) Implanter une fonction permettant de calculer la direction du rayon réfléchi créé par un rayon incident à l'interface entre deux milieux. d) Implanter une fonction permettant de calculer la direction du rayon transmis créé par un rayon incident à l'interface entre deux milieux. TP n°10: Calcul de l'intersection entre une sphère et un rayon, des rayons réfléchi et transmis dans le cadre de l'implantation d'un algorithme de lancer de rayons a) Implanter les 4 questions du TD n°10 sous la forme de fonctions respectant les prototypes suivants:
b) Implanter les 4 fonctions de la question a) dans le programme MiniRayTracingIncomplet.cpp qui les utilise dans le cadre d'un algorithme de lancer de rayons pour le dessin de scènes constituées de sphères éclairées par des sources lumineuses ponctuelles ou directionnelles. La même scène affichée avec l'algorithme de rendu intégré La même scène affichée avec l'algorithme de rendu intégré Solution Le TD est réalisé en langage C. Les structures suivantes devront être utilisées:
Ainsi que les matrices de base suivantes:
Implanter une fonction de dessin d'une courbe B-Spline définie sur 4 points de contrôle.
B-Splines de Bezier
B-Splines non rationnelles uniformes et de Catmull-Rom TP n°11: Implantation du dessin de courbes B-Spline a) Implanter le TP n°11. b) Utiliser la fonction de la question a) pour implanter le dessin d'une courbe B-Spline par morceaux définie sur n points de contrôle (n >= 4). On pourra utiliser la structure suivante pour implanter une ligne polygonale:
On pourra aussi utiliser la ligne polygonale suivante:
B-Splines de Catmull-Rom: B-Splines non rationnelles uniformes: B-Splines de Bézier: Solution |