Correction examen
de TD n°1 2012-2013

RETOUR

3 novembre 2011 - 1h15

Question n°1

  • Question n°1a: Ry étant chronologiquement la première des 2 transformations, le produit matriciel à calculer est M = Rx.Ry.
    M = =
  • Question n°1b: Une direction D orientée selon l'axe y aura pour coordonnées .
    La direction transformée D' de cette direction par M est calculé par produit matriciel de M par D.
    D' = M.D = . = qui est bien une direction inscrite dans le plan yz car sa composante x est égale à 0.0.

Questions n°2, 3 et 4

  • Question n°2a: Utilisation d'une primitive graphique OpenGL de type GL_LINE_STRIP. Calcul et spécification des 10000 vertices au moyen du système d'équations paramétriques du cercle:
    x = r*cos(a)
    y = r*sin(a)
    avec a compris dans l'intervalle [0.0,2.0*p]
  • Question n°2b: Utilisation d'une primitive graphique OpenGL de type GL_LINE_STRIP. Calcul et spécification des 10000 vertices au moyen du système d'équations paramétriques du tore:
    x = (re+ri*cos(b))*cos(a)
    y = (re+ri*cos(b))*sin(a)
    z = ri*sin(b)
    avec a compris dans l'intervalle [0.0,2.0*p] et b compris dans l'intervalle [0.0,2.0*p]
    Modification de ce système d'équations paramétrique de surface en un système d'équations paramétriques de courbe par substitution du paramétre variable b par une expression dépendant de a: b = 50.0*a
    x = (re+ri*cos(50.0*a))*cos(a)
    y = (re+ri*cos(50.0*a))*sin(a)
    z = ri*sin(50.0*a)
    avec a compris dans l'intervalle [0.0,2.0*p]
  • Question n°3a: Pas de commentaire
  • Question n°3b: Modification de la fonction scène pour utiliser les variables globales r1 et r2 comme variables de définition des positions angulaires pour les 2 sphères. Ajout de la fonction idle qui modifie les variables r1 et r2 et poste un événement "redisplay".
  • Question n°3c: La fonction scene n'est pas modifiée. La fonction idle utilise les variables r1 et r2 pour détecter une éventuelle collision entre les 2 sphères. Dans ce cas, v1 et v2 sont négativés et r1 et r2 sont ajustés en fonction des déplacements angulaires réalisés. Si ce n'est pas le cas les variables r1 et r2 sont ajustés comme ils l'étaient dans la question 3b. Dans tous les cas un événement "redisplay" est posté.
  • Question n°4: La fonction glOrtho est utilisée pour configurer un volume de visualisation défini de -12.0 à 12.0 en z. En x et en y, les valeurs tx et ty sont comparées pour que, dans le cas où tx est plus grand que ty, le volume de visualisation soit défini de -12.0 à 12.0 en y et que les valeurs en x soient ajustées en conséquence du ratio tx/ty. Si ty est plus grand que tx, le volume de visualisation est défini de -12.0 à 12.0 en x et les valeurs en y sont ajustées en conséquence du ratio ty/tx.

Code source complet: Examen1.cpp

Fichier exécutable: Examen1.exe

/* Variables et constantes globales question 2  */

#ifndef M_PI
#define M_PI 3.14159
#endif

/* Question 2a                                  */

static void cercle(void) {
  int n = 10000;
  glPushMatrix();
  glBegin(GL_LINE_LOOP);
  for ( int i = 0 ; i < n ; i++ ) {
    double a = i*2.0*M_PI/n;
    float x = 10.0*cos(a);
    float y = 10.0*sin(a);
    glVertex2f(x,y); }
  glEnd();
  glPopMatrix();
}

/* Question 2b                                  */

static void enroulementToroidal(void) {
  int n = 10000;
  int m = 50;
  glPushMatrix();
  glBegin(GL_LINE_LOOP);
  for ( int i = 0 ; i < n ; i++ ) {
    double a1 = i*2.0*M_PI/n;
    float x = (10.0+sin(m*a1))*cos(a1);
    float y = (10.0+sin(m*a1))*sin(a1);
    float z = cos(m*a1);
    glVertex3f(x,y,z); }
  glEnd();
  glPopMatrix();
}

/* Scene question 3a                            */

static void sceneQuestion3a(void) {
  glPushMatrix();
  glutSolidTorus(0.3,10.0,18,72);
  glPushMatrix();
  glTranslatef(10.0F,0.0F,0.0F);
  glutSolidSphere(1.0,36,36);
  glPopMatrix();
  glPushMatrix();
  glTranslatef(-10.0F,0.0F,0.0F);
  glutSolidSphere(1.0,36,36);
  glPopMatrix();
  glPopMatrix();
}

/* Variables et constantes globales question 3  */

static float r1 = 0.0F;
static float r2 = 180.0F;

/* Scene questions 3b et 3c                     */

static void sceneQuestion3bEt3c(void) {
  glPushMatrix();
  glutSolidTorus(0.3,10.0,18,72);
  glPushMatrix();
  glRotatef(r1,0.0F,0.0F,1.0F);
  glTranslatef(10.0F,0.0F,0.0F);
  glutSolidSphere(1.0,36,36);
  glPopMatrix();
  glPushMatrix();
  glRotatef(r2,0.0F,0.0F,1.0F);
  glTranslatef(10.0F,0.0F,0.0F);
  glutSolidSphere(1.0,36,36);
  glPopMatrix();
  glPopMatrix();
}

/* Question 3b                                  */
/* Fonction executee lorsqu'aucun evenement     */
/* n'est en file d'attente                      */

static void idle3b(void) {
  r1 += 1.0F;
  r2 += -3.0F;
  glutPostRedisplay();
}

/* Variables et constantes globales question 3  */

static float v1 = 1.0F;
static float v2 = -3.0F;

/* Question 3c                                  */
/* Fonction executee lorsqu'aucun evenement     */
/* n'est en file d'attente                      */

static void idle3c(void) {
  static const float deltaMin = acos(0.98)*180.0/3.14159;
  float delta = (r2+v2)-(r1+v1);
  if ( ( delta < deltaMin ) || ( delta > 360.0-deltaMin ) ) {
    float dt;
    if ( delta < deltaMin )
      dt = fabs((r2-r1-deltaMin)/(v1-v2));
      else
      dt = fabs((r1-r2+360.0F-deltaMin)/(v1-v2));
    r1 += (2.0F*v1*dt-v1);
    r2 += (2.0F*v2*dt-v2);
    v1 = -v1;
    v2 = -v2; }
    else {
    r1 += v1;
    r2 += v2; }
  glutPostRedisplay();
}

/* Question 4                                   */
/* Fonction executee lors d'un changement       */
/* de la taille de la fenetre OpenGL            */

static void reshape(int tx,int ty) {
  glViewport(0,0,tx,ty); 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  if ( tx >= ty )
    glOrtho(-12.0*(double) tx/ty,12.0*(double) tx/ty,
            -12.0,12.0,
            -12.0,12.0);
    else
    glOrtho(-12.0,12.0,
            -12.0*(double) ty/tx,12.0*(double) ty/tx,
            -12.0,12.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

Quelques indications sur l'évaluation

Barème: 5, 6, 6 et 3

De gauche à droite sur chaque copie:
  - Numéro de copie
  - Note sur 20.0
  - Evaluation de l'exercice n°1 (sur 10 ramené sur 5)
    - Question (a) Formule de calcul (3 pts)
    - Question (a) Résultat du calcul (3 pts)
    - Question (b) Preuve par calcul en coordonnées homogènes (4 pts) 
  - Evaluation de l'exercice n°2 (sur 10 ramené sur 6)
    - Question (a) Utilisation correcte d'une primitive graphique et choix d'un GL_LINE_LOOP (2 pts)
    - Question (a) Formule de calcul des positions sur un cercle (1,5 pts)
    - Question (a) Construction globale de la fonction (1,5 pts)
    - Question (b) Formule de calcul des positions sur un enroulement toroïdal (3 pts)
    - Question (b) Construction globale de la fonction (2 pts)
  - Evaluation de l'exercice n°3 (sur 16 ramené sur 6 pts)
    - Question (a) Utilisation de glPushMatrix() et glPopMatrix() (1 pt)
    - Question (a) Syntaxe OpenGL (2 pts)
    - Question (a) Modélisation géométrique de la scène (2 pts)
    - Question (b) Conception de l'animation (1 pt)
    - Question (b) Modélisation géométrique de la scène (2 pts)
    - Question (b) Fonction idle (avec glutPostRedisplay) (2 pts)
    - Question (c) Fonction idle (6 pts)
  - Evaluation de l'exercice n°4 (sur 6 ramené sur 3)
    - Architecture et syntaxe de la fonction reshape (2 pts)
    - Utilisation de la fonction glOrtho et paramétrage (2 pts)
    - Gestion des ratios viewport plus grands et plus petits que 1.0 (2 pts)

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