Première session 2002-2003

RETOUR

Vendredi 13 Juin 2003 - 2h

Tous les documents sont autorisés.
Question 1

Dans un programme OpenGL, on souhaite créer l'animation de caméra consistant à la faire se déplacer selon une trajectoire tout en la maintenant braquée sur le point de coordonnées (10.0, 5.0, 0.0).

On dispose d'une fonction void position(float t, Coord *p) permettant de calculer la position p de chacune des étapes de l'animation. Le paramètre t est susceptible de varier entre 0.0 et 1.0. Chaque valeur de t définit donc une position particulière de la caméra au cours de l'animation.

Coord est la structure C suivante:

struct Coord {
  float x,y,z,t ; } ;

On dispose d'une fonction void scene(void) dessinant la scène à afficher.

La caméra définie réalise une visualisation en perspective avec une ouverture verticale de p/6 radians, un ratio d'ouverture égal à celui de la fenêtre d'affichage, des plans de clipping near et far à 0.2 et 100.0.

a) Ecrire la fonction idle réalisant cette animation pour t variant uniformément et cycliquement entre 0.0 et 1.0 par pas de 0.01.

b) Ecrire la fonction reshape réalisant cette animation.

c) Ecrire la fonction display réalisant cette animation.

d) Soit la fonction position suivante:

float m[4][4] = { { -0.5F, 1.5F,-1.5F, 0.5F },
                  {  1.0F,-2.5F, 2.0F,-0.5F },
                  { -0.5F, 0.0F, 0.5F, 0.0F },
                  {  0.0F, 1.0F, 0.0F, 0.0F } } ;
Coord g[4] = { … };
void position(float t,Coord *p) {
int j,k ;
float tt[4],ttt[4],x,y,z ;
tt[0] = t*t*t ;
tt[1] = t*t ;
tt[2] = t ;
tt[3] = 1.0F ;
for ( j = 0 ; j < 4 ; j++ )
  for ( k = 0,ttt[j] = 0 ; k < 4 ; k++ )
    ttt[j] += tt[k] * m[k][j] ;
    p->x = p->y = p->z = 0.0F ;
    for ( j = 0 ; j < 4 ; j++ ) {
      p->x += ttt[j] * g[j].x ;
      p->y += ttt[j] * g[j].y ;
      p->z += ttt[j] * g[j].z ; }
}

Quel type de position calcule-t-elle?

Correction

Question 2

On souhaite dessiner un hexagone régulier en VRML. Celui-ci est centré sur l'origine et est plongé dans le plan xOz. Les sommets de l'hexagone sont matérialisés par des sphères de rayon 1.0. Les arêtes sont matérialisées par des cylindres de rayon 0.2 et de longueur 10.0.

Ecrire le fichier VRML en utilisant le DEF et le USE.

Correction

Question 3

a) On considère les deux lignes brisées (A,B,C,D) et (D,E,F,G). Chacune est lissée par une courbe de Bézier à 4 sommets. Les 7 sommets ont pour coordonnées:

A(0,1), B(-1,3), C(2,4), D(3,2), E(4,-1), F(2,-2) et G(0,-1)

Peut-on relier ces deux courbes de Bézier ?

b) On considère les deux courbes du plan c1(t) = (t, t2) et c2(t) = (2t+1, t3+4t+1) pour 0 <= t <= 1

1) Donner les coordonnées du point de jonction des deux courbes.

2) Déterminer si c1(t) et c2(t) ont en ce point la même tangente.

Correction

Question 4

On considère la portion de code OpenGL suivante:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHT2);
Glfloat c1[] = { 1.0F,0.0F,0.0F,1.0F };
Glfloat c2[] = { 0.0F,0.0F,0.0F,1.0F };
Glfloat c3[] = { 1.0F,0.0F,1.0F,1.0F };
Glfloat c4[] = { 0.0F,1.0F,0.0F,1.0F };
GLfloat l_pos[] = { 1.0F,0.0F,1.0F,0.0F };
glLightfv(GL_LIGHT0,GL_POSITION,l_pos);
glLightfv(GL_LIGHT0,GL_DIFFUSE,c1);
glLightfv(GL_LIGHT0,GL_SPECULAR,c1);
glLightfv(GL_LIGHT0,GL_AMBIENT,c2); }
GLfloat l_pos[] = { -10.0F,0.0F,10.0F,1.0F };
glLightfv(GL_LIGHT1,GL_POSITION,l_pos);
glLightfv(GL_LIGHT1,GL_DIFFUSE,c3);
glLightfv(GL_LIGHT1,GL_SPECULAR,c3);
glLightfv(GL_LIGHT1,GL_AMBIENT,c2); }
GLfloat l_pos[] = { 0.0F,10.0F,10.0F,1.0F };
GLfloat l_dir[] = { 0.0F,-1.0F,-1.0F,0.0F };
glLightfv(GL_LIGHT2,GL_POSITION,l_pos);
glLightfv(GL_LIGHT2,GL_DIFFUSE,c4);
glLightfv(GL_LIGHT2,GL_SPECULAR,c4);
glLightfv(GL_LIGHT2,GL_AMBIENT,c2);
glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,l_dir);
glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,15); }

a) Quelles sont les opérations réalisées par ces lignes?

b) On considère une sphère de rayon 5.0 placée à l'origine du repère. Cette sphère diffuse dans le blanc et réfléchit spéculairement dans le blanc. Décrire le résultat à l'affichage.

Correction

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