Colle n°1
Lundi 27 janvier 2014
40 minutes

Sujet pdf

Tous les documents sont autorisés.

On rappelle les prototypes des fonctions OpenGL usuelles:
- void glTranslatef(GLfloat tx,GLfloat ty,GLfloat tz);
- void glRotatef(GLfloat a,GLfloat ax,GLfloat ay,GLfloat az);
- void glScalef(GLfloat rx,GLfloat ry,GLfloat rz);
- void glPushMatrix();
- void glPopMatrix();
- void glutSolidCube(double c);
- void myCylindre(float h,float r,int ns);

La fonction GLUt permettant de modéliser une sphère est définie par le prototype suivant:
- void glutSolidSphere(double r,int n,int m);
où r est le rayon, n et m sont les valeurs de facettisation longitudinale et latitudinale.

Question 1

Développer une fonction C permettant de modéliser la scène composée de 8 sphères de rayon 2.0 et 12 cylindres de hauteur 10.0 et de rayon 1.0 placés de telle manière que les cylindres et les sphères matéria­lisent respectivement les arêtes et les sommets d'un cube virtuel de coté 10.0 centré sur l'origine du repère de modélisation.

Question 2

Un bras robot en forme de tentacule est composé de n segments succes­sifs formés d'un cylindrique de hauteur 1.0 et de rayon 1.0 et d'une sphère "articulation" de rayon 0.5 (voir dessin ci-contre pour n = 3).

Les centres des sphères et des cylindres alternés sont distants de 0.8. Chaque segment possède 2 degrés de liberté par rapport au segment qui le précède: une rotation autour de l'axe y passant par le centre de la sphère articulation suivi d'une rotation autour de l'axe x passant par le centre de la sphère articulation. Deux tableaux tRy et tRx de n-1 réels définissent les valeurs de ces rotations. Le dessin ci-dessous présente un tentacule de 20 segments soit donc 2x19 angles de rotation qui sont responsables de sa courbure.

Développer une fonction C de modélisation d'un tel bras robot répondant au prototype suivant:
void tentacule(int n,float *tRy,float *rRx);

Le premier cylindre du tentacule est centré sur l'origine du repère de modélisation et est orienté en y dans ce repère.

Exercice n°1

On recherche les composants élémentaires du cube pouvant être reproduits. On détermine que la structure élémentaire la plus adéquate est formée de 2 sphères et 3 cylindres qui peut être modélisée 4 fois avec une rotation de 90° entre chaque élément. Il est probablement préférable de modéliser chaque élément en "absolu": 0°, 90°, 180° et 270° plutôt qu'en relatif par accumulation de rotations de 90°.

Le code source ci-dessous inclut les instructions OpenGL permettant d'afficher chaque structure élémentaire avec une couleur différente.

L'exécutable

Fichier source : CubeDeSpheresEtCylindres.cpp
Modules utilitaires

void element() {
  glPushMatrix();
  glTranslatef(-5.0F,0.0F,5.0F);
  solidCylindre(1.0F,10.0F,10,5);
  for ( int i = 0 ; i < 2 ; i++ ) {
    glTranslatef(0.0F,5.0F,0.0F);
    glutSolidSphere(2.0,24,24);
    glRotatef(-90.0F,0.0F,0.0F,1.0F);
    glTranslatef(0.0F,5.0F,0.0F);
    solidCylindre(1.0F,10.0F,10,5); }
  glPopMatrix();
}

void solidScene() {
  glPushMatrix();
  for ( int i = 0 ; i < 4 ; i++ ) {
    glPushMatrix();
    glRotatef(90.0F*i,1.0F,0.0F,0.0F);
    switch (i) {
      case 0 : glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurRouge()) ;
               break;
      case 1 : glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurVert()) ;
               break;
      case 2 : glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurBlanc()) ;
               break;
      case 3 : glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurBleu()) ;
               break; }
    element();
    glPopMatrix(); }
  glPopMatrix();
}

Exercice n°2

Chaque élement (composé d'un cylindre et d'une sphère) étant implanté au bout de l'élément le précédant dans le tentacule et étant donc assujetti à ses déplacements, il est nécessaire de réaliser une modélisation relative des éléments successifs les uns par rapport aux autres.

L'exécutable

Fichier source : Tentacule.cpp
Modules utilitaires

void element() {
  solidCylindre(1.0F,1.0F,20,5);
  glTranslatef(0.0F,0.8F,0.0F);
  glutSolidSphere(0.5F,15,15);
}

void tentacule(int n,float *tRy,float *tRx) {
  glPushMatrix();
  element();
  for ( int i = 0 ; i < n-1 ; i++ ) {
    glRotatef(tRy[i],0.0F,1.0F,0.0F);
    glRotatef(tRx[i],1.0F,0.0F,0.0F);
    glTranslatef(0.0F,0.8F,0.0F);
    element(); }
  glPopMatrix();
}

RETOUR