opengl 3d点云从x,y,z 2d数组渲染

时间:2012-10-10 06:14:01

标签: c++ opengl 3d point-clouds

在c ++(vs2008)中使用openGl在3d点云显示上需要一些方向。我正在尝试用纹理做一个3d点云显示。我有3个2D阵列(每个相同大小1024x512)代表每个点的x,y,z。

我认为我走在正确的轨道上
glBegin(GL_POINTS);
for(int i=0; i<1024; i++)
{
   for(int j=0; j<512; j++)
   {
       glVertex3f(x[i][j], y[i][j], z[i][j]);
   }
 }    
}    
glEnd();

现在这会加载缓冲区中的所有顶点(我认为)但是从这里我不知道如何继续。或者我在这里完全错误

然后我有另一个2D数组(相同大小),其中包含我想在3D点云和显示器上用作纹理的颜色数据(值为0-255)。

1 个答案:

答案 0 :(得分:2)

点绘图代码很好。

(从长远来看,如果你必须反复绘制这些点,可能会遇到性能问题,比如用户响应用户旋转视图。将3个数组中的数据重新排列为1,每个数据旁边都有x,y,z值其他允许你使用更快的顶点数组/维管组。但是现在,如果它没有破坏,就不要修复它。)

要为点着色,在每个glVertex之前需要glColor。它必须在之前,而不是之后,因为在OpenGL中,glVertex松散地意味着它是一个完整的顶点,然后绘制它。您已将数据描述为点云,因此请勿将glBegin更改为GL_POLYGON,将其保留为GL_POINTS。

好的,你有另一个带有一个字节颜色索引值的数组。您可以从使用

作为灰度级开始
glColor3ub(color[i][j], color[i][j], color[i][j]);

应该显示从黑色到白色的点。

要获得每个点的真实颜色,您需要一个颜色查找表 - 我假设其中包含数据附带的颜色,或者您正在创建的颜色。它应该被声明为类似

static GLfloat ctab[256][3] = {
    1.0, 0.75, 0.33,  /* Color for index #0 */
    ...
};

并在glVertex之前使用

glColor3fv(ctab[color[i][j]]);

我使用了浮点颜色,因为这是OpenGL目前在内部使用的内容。如果您喜欢0..255颜色值,请将数组更改为GLubyte,将glColor3fv更改为glColor3ub。

希望这有帮助。