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.