Formation OpenGL |
|
La matrice suivante, matProj, donne les 16 coefficients qui permettent de calculer la projection sur le plan :
-lum[0].a+ps | -lum[1].a | -lum[2].a | -lum[3].a |
-lum[0].b | -lum[1].b+ps | -lum[2].b | -lum[3].b |
-lum[0].c | -lum[1].c | -lum[2].c+ps | -lum[3].c |
-lum[0].d | -lum[1].d | -lum[2].d | -lum[3].d+ps |
La projection matProj est composée avec la matrice de transformation courante par un glMultMatrixf( matProj);
Voici un extrait du programme ombre.cpp
qui affiche l'ombre de la scène sur un miroir d'équation x
= 0.
Notez que le miroir peut-être placé et tourné à
volonté dans la scène. Sa matrice de transformation Mmiroir
est intégralement prise en compte.
void ombre(GLfloat t){ //Ombre sur le miroir (plan 1.x + 0.y + 1.z + 0 = 0) GLdouble eq[4]={1, 0, 0, 0}; glEnable(GL_CLIP_PLANE1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); { glLoadIdentity(); //On applique la transformation Mmiroir : // Ici deux rotations et une translation //On contrôle à la souris la rotation du miroir glRotatef(spin_y, 1, 0, 0); glRotatef(spin_x, 0, 1, 0); glTranslatef(-t, 0, 0); //Centré en -t, 0, 0 glClipPlane(GL_CLIP_PLANE1, eq); //On place le plan de clipping glGetClipPlane(GL_CLIP_PLANE1, eq); //Et on récupère son équation transformée !! } glPopMatrix(); glDisable(GL_CLIP_PLANE1); GLfloat ps = 0; for (int i=0 ; i<4 ; i++) ps += lum[i]*eq[i]; GLfloat projMat[16]; //Colonne 1 projMat[0] = - lum[0] * eq[0] + ps; projMat[4] = - lum[0] * eq[1]; projMat[8] = - lum[0] * eq[2]; projMat[12] = - lum[0] * eq[3]; //Colonne 2 projMat[1] = - lum[1] * eq[0]; projMat[5] = - lum[1] * eq[1] + ps; projMat[9] = - lum[1] * eq[2]; projMat[13] = - lum[1] * eq[3]; //Colonne 3 projMat[2] = - lum[2] * eq[0]; projMat[6] = - lum[2] * eq[1]; projMat[10] = - lum[2] * eq[2] + ps; projMat[14] = - lum[2] * eq[3]; //Colonne 4 projMat[3] = - lum[3] * eq[0]; projMat[7] = - lum[3] * eq[1]; projMat[11] = - lum[3] * eq[2]; projMat[15] = - lum[3] * eq[3] + ps; glMatrixMode(GL_MODELVIEW); glPushMatrix(); { glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glEnable(GL_BLEND); //Projection à l'aide de la matrice d'ombre glMultMatrixf(projMat); scene(true); } glPopMatrix(); } |
![]() La théière, son reflet, son ombre, et la sphère rouge qui matérialise la lampe ponctuelle. ![]() La scène après rotation du plan. |
Modifiez le programme précédent pour gérer au moins
deux lampes.