2012-10-10 87 views
10

需要在C++(vs2008)中使用openGl进行3d点云显示的某些方向。我正在尝试使用纹理进行3D点云显示。我有3个二维数组(每个大小都是1024x512),代表每个点的x,y,z。我觉得我是在正确的轨道上opengl 3D点云渲染从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(); 

现在这个加载所有顶点缓冲区(我认为),但在这里我不知道如何着手。或者我完全是这里错了

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

+0

我没有每个点的RGB,所以我不能使用glColor3 *(r,g,b)。我打算使用最后一个数组(具有0-255的值)作为3D点云的纹理。从glBegin(GL_POLYGON)我认为你建议创建一个网格?问题的另一个问题是如何从上面的内容中获得进展。或者我会完全错误的方向。 – user1733628

+0

那么,上面的代码将基本上从你的3个坐标数组中绘制一个点云。没有真正的“缓冲区”被填满,你直接进入即时模式。对于颜色:据我所知,每个顶点有一个无符号的字节值?所以你应该定义这些值如何代表一些颜色。你可以直接使用它们作为强度,或者你可以使用调色板,或者完全不同的东西。 – derhass

回答

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 */ 
    ... 
}; 

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

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

希望这会有所帮助。