ClipPlane是指定一个空间裁剪平面,对几何图形进行裁剪,ClipPlane(uint plane, double[] equation):
其中,plane是指定的裁剪平面,包括OpenGL.GL_CLIP_PLANE0、GL_CLIP_PLANE1、GL_CLIP_PLANE2、GL_CLIP_PLANE3、GL_CLIP_PLANE4、GL_CLIP_PLANE5 六个。
equation是指定的一个裁剪平面,equation主要包含四个参数:
1、四个参数依次指向平面方程:equation[0]x+equation[1]y+equation[2]z+equation[3]=0;
2、前三个参数(equation[0],equation[1],equation[2])可以理解为裁剪平面法线,及只有才裁剪平面法线方向的才会显示保留,其他豆浆被裁剪掉。
3、ClipPlane裁剪平面设置完成后,需要开启裁剪功能:gl.Enable(OpenGL.GL_CLIP_PLANEi),i:对应设置0~5裁剪平面。若要关闭裁剪平面功能,可以设定对应的gl.Disable(OpenGL.GL_CLIP_PLANEi)。
上程序,看效果:
private void openGLControl1_Resized(object sender, EventArgs e)
{
SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.LoadIdentity();
gl.Perspective(60, (double)(this.Width / this.Height), 0.01, 100);
gl.LookAt(0, -3, 3, 0, 0, 0, 0, 0, 1);
gl.MatrixMode(OpenGL.GL_MODELVIEW);
}
绘制一个椎体,不同面设置不同颜色,方便裁剪后的视觉效果观测:
private void Draw(SharpGL.OpenGL gl)
{
gl.Begin(OpenGL.GL_POLYGON);
gl.Color(1.0f, 0.0f, 0.0f);
gl.Vertex(0, 0, 0);
gl.Vertex(1, 0, 0);
gl.Vertex(1, 1, 0);
gl.Vertex(0, 1, 0);
gl.End();
gl.Begin(OpenGL.GL_TRIANGLES);
gl.Color(0f, 1f, 0f);
gl.Vertex(0, 0, 0);
gl.Vertex(0.5, 0.5, 1);
gl.Vertex(1, 0, 0);
gl.Color(0f, 0f, 1f);
gl.Vertex(1, 0, 0);
gl.Vertex(0.5, 0.5, 1);
gl.Vertex(1, 1, 0);
gl.Color(1f, 1f, 0f);
gl.Vertex(1, 1, 0);
gl.Vertex(0.5, 0.5, 1);
gl.Vertex(0, 1, 0);
gl.Color(0f, 1f, 1f);
gl.Vertex(0, 1, 0);
gl.Vertex(0.5, 0.5, 1);
gl.Vertex(0, 0, 0);
gl.End();
}
设置裁剪前,视图效果如下:
设置一个裁剪平面equation[]={1,0,0,0},及一个X=0的YZ平面,法向(1,0,0),也就是说裁减掉X=0平面左侧的几何图形,并设置一个按键操作,用于增减equation[3],及在X轴上左右平移这个裁剪平面,直接上代码:
private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
{
SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
gl.ClearColor(0, 0, 0, 0);
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
gl.LoadIdentity();
gl.Rotate(Roate_Angle_X, 1, 0, 0);
gl.Rotate(Roate_Angle_Y, 0, 1, 0);
gl.ClipPlane(OpenGL.GL_CLIP_PLANE0, equation);//裁剪平面设置
gl.Enable(OpenGL.GL_CLIP_PLANE0);//开启GL_CLIP_PLANE0裁剪平面
Draw(gl);//绘制几何图形
gl.Flush();
}
裁剪平面按键平移操作:
public Form1()
{
InitializeComponent();
equation[0] = 1;
equation[1] = 0;
equation[2] = 0;
equation[3] = 0;
}
private void Key_Press(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a')//平移裁剪平面
equation[3] = equation[3] - 0.1;//右移裁剪平面
else if (e.KeyChar == 'd')
equation[3] = equation[3] + 0.1;//左移裁剪平面
if (e.KeyChar == 'l')//旋转几何图形
Roate_Angle_Y = Roate_Angle_Y + 0.5;
else if (e.KeyChar == 'j')
Roate_Angle_Y = Roate_Angle_Y - 0.5;
else if (e.KeyChar == 'i')
Roate_Angle_X = Roate_Angle_X - 0.5;
else if (e.KeyChar == 'k')
Roate_Angle_X = Roate_Angle_X + 0.5;
}
最终效果如下:
测试程序在这里:SharpGL测试范例