之前了解到,OpenGL的视景体定义了一个裁剪区域,只有区域内的物体,才可见。
OpenGL除了视景体可以裁剪外,还可以自己定义裁剪平面,对物体进行裁剪。
裁剪平面如何表示呢?通过一个方程:Ax + By + Cz + D = 0,然后我们只需要指定A,B,C,D的值,就可以表示一个平面了。
裁剪平面有多少个呢?所有OpenGL的实现,都必须支持至少6个其他的裁剪平面,有些实现可能允许超过6个的其他裁剪平面。可以用GL_MAX_CLIP_PLANES为参数调用glGetIntegerv()函数,查询自己使用的OpenGL实现所支持的其他裁剪平面的最大数量。
裁剪平面的使用
使用裁剪平面很简单,指定裁剪平面的4个系数,ABCD,然后启用裁剪平面即可,例子如下:
GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};
glClipPlane(GL_CLIP_PLANE0, eqn);
glEnable(GL_CLIP_PLANE0);
上述代码中, Ax + By + Cz + D = 0,其中A=0.0, B =1.0, C=0.0, D=0.0,所以表示的方程为 y = 0。上述代码,启用的是裁剪平面0,如果要启用裁剪平面1,则GL_CLIP_PLANE0 需要替换 为 GL_CLIP_PLANE1。
例子
#include <GL/glut.h>
#include <stdlib.h>
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display(void)
{
GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};
GLdouble eqn2[4] = {1.0, 0.0, 0.0, 0.0};
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glPushMatrix();
glTranslatef (0.0, 0.0, -5.0);
/* clip lower half -- y < 0 */
glClipPlane (GL_CLIP_PLANE0, eqn);
glEnable (GL_CLIP_PLANE0);
/* clip left half -- x < 0 */
glClipPlane (GL_CLIP_PLANE1, eqn2);
glEnable (GL_CLIP_PLANE1);
glRotatef (90.0, 1.0, 0.0, 0.0);
glutWireSphere(1.0, 20, 16);
glPopMatrix();
glFlush ();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode (GL_MODELVIEW);
}
/* ARGSUSED1 */
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}