目前在做一个线结构光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); //异步调用
(如果各位看官觉得有用,请个小弟一个赞,也是给我一点鼓励,让我有信心继续写下去,万分感谢!)