Vous êtes sur la page 1sur 6

Découpage des objets

selon le volume de vue


Découpage des objets
Dans OpenGL, lorsque les objets de la scène ont été transformés à partir des
matrices « MODEL-VIEW » et « PROJECTION », n’importe quel objet qui n’est
pas complètement à l’intérieur du volume de vue est découpé.

Le volume de vue qui correspond aussi au volume de découpage est défini à


partir de six plans de découpage.

Ces 6 plans de découpage sont définis grâce à l’une des 2 fonctions suivantes :

glOrtho(GLdouble gauche, GLdouble droite,


GLdouble bas, GLdouble haut,
GLdouble proche, GLdouble loin);
haut
gauche
droite
Direction
bas
vers le loin
point de vue proche
2
Projection parallèle orthographique
Découpage des objets
glFrustum( GLdouble gauche, GLdouble droite,
GLdouble bas, GLdouble haut,
GLdouble proche, GLdouble loin);

haut
gauche

caméra
bas droite

proche

loin
3
Projection en perspective
Plans de découpage additionnels
Nous pouvons définir jusqu’à 6 plans supplémentaires pour réduire davantage
le volume de vue.

Chaque plan est défini par les coefficients A, B, C et D de son équation


Ax + By + Cz + D = 0. Le demi-espace considéré comme faisant partie du volume
de vue est de la forme Ax + By + Cz + D ≥ 0.

Le volume de découpage devient l’intersection entre le volume de vue et l’ensemble


des demi-espaces définis par ces plans de découpage additionnels.

Les polygones découpés font l’objet d’une reconstruction automatique de leurs


bordures par OpenGL.

Pour définir un plan de découpage, nous avons la fonction suivante :

void glClipPlane(GLenum plan, const GLdouble * equation);

où le paramètre « equation » pointe vers les 4 coefficients A, B, C et D,


le paramètre « plan » correspond à GL_CLIP_PLANEi, 0  i  5.
4
Plans de découpage additionnels
Pour vous permettre d’utiliser un plan de découpage additionnel, vous devez
l’activer :
glEnable(GL_CLIP_PLANEi);

Si vous désirez rendre ce plan inutilisable, vous devez le désactiver en procédant


ainsi :
glDisable(GL_CLIP_PLANEi);

5
Exemple
GLuint No_sphere;
void Initialisation(void)
{
No_sphere = glGenLists(1);
glNewList(No_sphere, GL_COMPILE);
glutWireSphere(1.0, 20.0, 16.0);
glEndList();
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void affichage( void )
{
GLdouble eqn1[4] = {0.0, 1.0, 0.0, 0.0};
GLdouble eqn2[4] = {1.0, -1.0, 0.0, 0.0};
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
glClipPlane(GL_CLIP_PLANE0, eqn1); glEnable(GL_CLIP_PLANE0);
glClipPlane(GL_CLIP_PLANE1, eqn2); glEnable(GL_CLIP_PLANE1);
glCallList(No_sphere);
glPopMatrix();
glFlush(); 6
}

Vous aimerez peut-être aussi