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 vers le point de vue bas loin proche 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 droite bas proche loin 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.
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);
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();