请高手指点迷津,不胜感激啊
本文中编制的软件显示部分主要是利用OpenGL与Visual C#.NET完成。此软件可在窗口中对三维重构算法生成的点云进行旋转、平移、放缩、切线、排序、曲面重构等操作。本文利用此软件以重构SMT焊点模型为例,在三角网格化后对OpenGL 的命令功能进行有效组合利用,以得到实际SMT焊点的三维重建对象[2][3]。
2.1 Visual C#.Net中使用OpenGL 的方法
微软对于和他们竞争的东西,比如CORBA(COM的竞争对手)和OpenGL(DirectX的竞争对手)提供较少的标准支持。不过在C#中实现OpenGl也并非没有可能,有很多很好的第3方库可以使用。下载库CSOpenGL.2.1-1.2并且安装。在工程中添加命名空间CsGL.OpenGL,并且在工程中引用CSGL.DLL,这样就可以在C#.NET工程下使用OPENGL。
2.2 离散点的三角网格化
根据SMT焊点的二维图像利用三维重构算法计算出来的SMT焊点的高度是离散点云数据。而运用OPENGL来进行SMT焊点表面的三维重建需要将这些点有序的三角网格化[5]。利用传统三维测量仪测出的大量离散点,由于这些点往往是杂乱点,没法从数据存储结构上得到一个点的邻近点信息[4],因此,从这些杂乱离散点得到三角网格是个难题。而采用本文方法得到的离散点云是有一定规律性的,可以有效的利用这些规律将点云三角网格化。
本文中用一个二维数组Zn[,]来存储表面数据点云数据。二维数组Zn[i,j]中的(i,j)和SMT焊点二维图像的象素(x,y)的相对应位置是一一对应的,所以可以根据右手定则使用如下图1代码循环构筑三角网格化。如图1所示首先利用右手定则用(i,j), ( i+1,j+1), ( i+1,j)三个点构筑一个三角形,然后再根据右手定则用(i,j), ( i,j+1), ( i+1,j+1)构筑一个另三角形,这样的话每一个离散点就可以构筑两个三角形。本文采集的SMT焊点的二维图像的大小是128×128个象素。所以可以构筑出(128-1)×(128-1)×2=32258个三角形。利用如上规则,可以方便的完成三角网格化。在C#中的OpenGl程序如下:
GLUT.glBegin(GL.GL_TRIANGLES);
for(i=0;i<127;i++)
{
for(j=0;j<127;j++)
{
GLUT.glVertex3f(i, j, tsai[i,j]);
GLUT.glVertex3f(i, j, tsai[i,j+1]);
GLUT.glVertex3f(i+1, j, tsai[i+1,j]);
GLUT.glVertex3f(i+1, j, tsai[i+1,j]);
GLUT.glVertex3f(i, j+1, tsai[i,j+1]);
GLUT.glVertex3f(i+1, j+1, tsai[i+1,j+1]);
}
}
GLUT.glEnd(); // 正方形绘制结束