C# SharpGL-ClipPlane应用

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测试范例

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值