在C#中使用Tao.OpenGL框架下的simpleOpenGlControl控件的一些问题

目前在做一个线结构光3维重建的实验项目,用C#的winform做UI,其中使用的是Tao框架的simpleOpenGlControl控件来显示3维图像,现在将我在做的过程遇到的一些问题及解决方法写下来,一方面给我自己做一个总结,另一方面给遇到此类问题的朋友们一个思路:
1.怎样添加simpleOpenGlControl控件到工具箱?
   在文件夹里找到Tao.Platform.Windows.dll,用鼠标将其拖到工具箱里,不出意外的话应该是可以了,因为这也算最暴力的手段了吧~
2.怎样使用simpleOpenGlControl控件来显示3维图像?
   1>在使用控件之前进行初始化(例如在Form1_Load中):simpleOpenGlControl1.InitializeContexts();
   2>进行视场角设置:
    public void reshape(int w, int h)
    {
        Gl.glViewport(0, 0, w, h);//set viewpoint
        Gl.glMatrixMode(Gl.GL_PROJECTION);//specify which matrix is the current matrix
        Gl.glLoadIdentity();//replace the current matrix with the identity matrix
        Glu.gluPerspective(60, (float)w / (float)h, 1.0, 100.0);
        Gl.glMatrixMode(Gl.GL_MODELVIEW);
        Gl.glLoadIdentity();
    }
    在使用控件显示前调用这个函数:
    reshape(simpleOpenGlControl1.Width,simpleOpenGlControl1.Height);
    3>在simpleOpenGlControl的Paint事件处理函数中写显示代码:
         Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
        Gl.glLoadIdentity();
        Glu.gluLookAt(0.0, -5.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
        Gl.glRotated(ry, 0, 1, 0);
        Gl.glRotated(rx, 1, 0, 0);
        Gl.glRotated(rz, 0, 0, 1);
        Gl.glRotated(50, 1, 0, 0);
        Gl.glTranslated(0.5, 6.0, -9.0);
        float L_UX, L_UY, L_UZ;  //四边形左上
        float L_DX, L_DY, L_DZ;   //左下
        float R_UX, R_UY, R_UZ;    //右上
        float R_DX, R_DY, R_DZ;     //右下
        Gl.glBegin(Gl.GL_QUADS);
        Gl.glColor3f(1.0f, 0.5f, 0.5f);
        for (int i = 0; i < pointslist.Count - 1; i++)
        {
            for (int j = 0; j < array.GetLength(0) - 1; j++)
            {
                float[,] head_array = (float[,])pointslist[i];      //前一行数据
                float[,] back_array = (float[,])pointslist[i + 1];   //后一行数据
                L_UX = head_array[j, 0]; L_UY = head_array[j, 1]; L_UZ = head_array[j, 2];
                R_UX = head_array[j + 1, 0]; R_UY = head_array[j + 1, 1]; R_UZ = head_array[j + 1, 2];
                L_DX = back_array[j, 0]; L_DY = back_array[j, 1]; L_DZ = back_array[j, 2];
                R_DX = back_array[j + 1, 0]; R_DY = back_array[j + 1, 1]; R_DZ = back_array[j + 1, 2];
                Gl.glVertex3f(L_UX, L_UY, L_UZ);
                Gl.glVertex3f(R_UX, R_UY, R_UZ);
                Gl.glVertex3f(L_DX, L_DY, L_DZ);
                Gl.glVertex3f(R_DX, R_DY, R_DZ);
            }
        }    
        Gl.glEnd();
        Gl.glFlush();
        (PS:偷个懒,直接把代码贴出来了~)
        
3.当采集到下一个物体的数据时怎样才能刷新画面:
   利用simpleOpenGlControl的Refresh()方法进行强制刷新。

4.使用Refresh()方法时会跳转到Paint事件处理函数中,怎样保证不会堵塞数据的采集?
   使用委托的异步调用:
   1>   delegate void tempdele();    //定义一个委托
   2>   tempdele Atempdele;   //定义一个委托实例
   3>   Atempdele = simpleOpenGlControl1.Refresh;      //绑定
   4>   Atempdele.BeginInvoke(null, null);       //异步调用

(如果各位看官觉得有用,请个小弟一个赞,也是给我一点鼓励,让我有信心继续写下去,万分感谢!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值