Exercice 1

a) La création d'une roue dentée est réalisée par l'utilisation de 2 types de primitives graphiques: un GL_TRIANGLES _FAN pour chacune des 2 faces d'une roue et des GL_QUADS pour chacune des deux faces d'une dent. Il n'est pas possible d'utiliser des GL_POLYGON pour générer en une seule fois chacune des faces car celles-ci ne sont pas convexes. Il n'est pas possible d'utiliser un Gl_QUAD_STRIP pour les faces des dents car il faut pouvoir spécifier une normale identique aux quatre sommets de chaque face de chaque dent pour être certain de réaliser un ombrage plat.
Une autre méthode moins optimisée consiste à utiliser un GL_POLYGON pour modéliser une partie de chacune des deux faces d'une roue puis à modéliser chaque dent au moyen de 2 triangles (un GL_TRIANGLES) et de deux rectangles (un GL_QUADS).

Quelle que soit la méthode utilisée, il faut éviter de modéliser des facettes dont on sait qu'elles seront dans la roue dentée et donc forcément invisibles. Il faut aussi éviter de modéliser deux fois la même surface sous peine d'obtenir un affichage aléatoire car l'élimination des parties cachées risque d'en être perturbée.

b) Idées directrices de la phase de modélisation:
- La grande roue comporte 2 fois plus de dents que la petite -> Elle tourne donc deux fois moins vite.
- Si la roue entraineuse tourne dans un sens, la roue entrainée tourne dans l'autre.
- En première approximation, les deux roues seront distantes de 9.0. C'est à dire la somme du rayon extérieur de l'une et du rayon intérieur de l'autre. Remarque: Cela marche mieux avec une distance de 9 + e.
- Pour gérer l'animation, une seule variable globale est nécessaire pour définir l'angle de rotation d'une des roues. L'autre angle de rotation sera directement calculé par multiplication à partir de cette valeur. Dans ce cadre, attention à l'utilisation de modulo.
- Il est nécessaire de décaler l'angle de l'une des roues par rapport à l'angle de l'autre pour qu'elles s'imbriquent correctement.

Exercice 2

a) Lorsqu'une texture doit être placée sur un objet, une opération généralement nécessaire consiste à indiquer pour chaque sommet définissant l'objet, la coordonnée correspondant dans la texture placée. Les coordonnées correspondant aux points (pixels) de l'objet générés pendant la phase dessin sont calculées à partir de ces coordonnées (généralement par interpolation).
Cette opération peut être réalisée en 1D, 2D ou 3D suivant le type de texture manipulée.
La spécification des coordonnées de texture permet de contrôler des aspects tels que la taille de la texture, son orientation, sa déformation sur les objets à surface courbe ou facettisée,...

b) La fonction OpenGL à utiliser pour spécifier les coordonnées de texturage est l'une des variantes de glTexCoord. Son prototype est glTexCoord{1234}{sifd}{v}(TYPE coords);. Elle admet 1, 2, 3 ou 4 paramètres GLshort, GLint, GLfloat ou GLdouble données en entête sous la forme d'une liste ou d'un tableau. Le nombre de paramètres donnés devrait correspondre à la dimension de la texture (1D,2D ou 3D). Ces paramètres peuvent être à valeur arbitraire mais OpenGL les rapportera à une valeur comprise entre min et max soit par seuillage soit par modulo pour obtenir la véritable coordonnée au sein de la texture.
Exemple: En float, min et max valent respectivement 0.0 et 1.0. -> Une valeur de coordonnée égale à 1.4 pourra prendre comme valeur réelle 0.4 (texture répétée) ou 1.0 (texture seuillée).
Bien que pouvant être appelée à n'importe quel moment, les coordonnées de texture spécifiées par un appel à glTexCoord ne sont réellement affectées à un sommet que lors de la création de ce sommet via la fonction glVertex (obligatoirement entre un glBegin et un glEnd).

OpenGL propose aussi la possibilité de générer "automatiquement" les coordonnées de texture mais cette possibilité n'entre pas dans le cadre de cet exercice.

c) Une surface paramétrique bicubique est une surface paramétrique classique -> Il s'agit d'une surface dont l'équation paramétrique fait appel à deux paramètres numériques s et t. En l'occurence, la définition classique d'une surface bicubique stipule que s et t varient entre 0.0 et 1.0 qui sont justement les bornes de l'intervalle dans lequel sont à définir les coordonnées de texture.
-> On utilisera directement le couple de valeurs (s,t) utilisé pour générer chaque sommet Pij de la surface comme coordonnées de texture pour Pij.

Exercice 3

a) Une courbe paramétrique cubique définie sur 4 sommets fait appel, en plus de ces quatre sommets, à une matrice de base de 4x4 coefficients numériques réels. Chaque position sera calculée à partir d'un paramètre réel t compris entre 0 et 1. La valeur de t pour la ième image est obtenu en divisant i par (n-1) en réel. La fonction demandée prendra donc en paramètre la valeur réelle t, la matrice de base et un tableau des 4 points de contrôle. Elle rend une position.

b) La fonction demandée possède des paramètres d'entrée identiques à celle du a). En revanche, elle rend une direction. Pour calculer la tangente à une courbe paramétrique cublique, il suffit de dériver le vecteur (t3,t2,t,1) pour obtenir (3t2,2t,1,0) et à utiliser ce second vecteur en lieu et place du premier dans la formule de calcul de la courbe.

c) La fonction reshape contient toutes les définitions de paramétrage de la caméra qui ne changent pas entre deux images. C'est à dire que la fonction reshape contiendra uniquement la définition du type de caméra et les paramètres associés. Elle ne contiendra pas le placement et l'orientation de la caméra.

d) La fonction display contient la modélisation de la scène qui ne change pas entre deux images ainsi le placement et l'orientation de la caméra qui changent entre deux images. Pour cette opération, on utilise la fonction gluLookAt en lui passant en paramètre la position de la caméra, un point qu'elle regarde (position+tangente) et la direction de la verticale (0.0, 1.0, 0.0).