使用SharpGL三位点云图的绘制时,一般是将所有的数据处理好然后通过OpenGLDraw整体绘制出来。
我现在想要用线程来控制点云图的绘制,同时要是动态的。我试过用OpenGLDraw来动态绘制,将z轴数据固定加1,第一次画一个点,然后擦除,第二次两个点,擦除,这样循环直到绘制完成。
这个方法是可以的,然后我又试了用线程代替OpenGLDraw,将每次绘制擦除的代码放到一个while循环内,但是结果有问题,OpenGLControl控件上没有显示点。
请问能否给我提供一个思路,或者在我的思路上帮我解答一下问题。
以下是我线程上挂的方法代码。
private void DynamicShow()
{
for (int i = 0; i < xds; i++)//xds为总点数
{
dynamicZ.Add(maxz[i] + i);//准备Z轴数据
}
while (openFileReadyFlag)
{
gl.LoadIdentity();//重置当前指定的矩阵为单位矩阵
gl.Translate(_ZBx, _ZBy, _ZBz);//平移函数,参数为XYZ方向上的平移大小;最后一个参数为距离屏幕距离;
gl.Rotate(_x, 1.0f, 0.0f, 0.0f);//绕x轴旋转_x度,_x为正表示逆时针
gl.Rotate(_y, 0.0f, 1.0f, 0.0f);
gl.Rotate(_z, 0.0f, 0.0f, 1.0f);
gl.Begin(_model);
gl.Color(1.0f, 1.0f, 0.0f);
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
for (int i = 0; i < max; i++)//用max来控制使每次绘制比上一次多一个点
{
gl.Vertex((maxx[i] - _ZBxT) / _ZBv, (maxy[i] - _ZByT) / _ZBv, maxz[i] / _ZBzT);//数组为点云坐标数组,其他为坐标换算参数
}
max++;
Thread.Sleep(2);
gl.End();
if (max == xds)
{
break;
}
}
}