Colle n°1
Lundi 27 janvier 2014
40 minutes
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érialisent 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 successifs 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.
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.
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();
}