【问题标题】:opengl 3d point cloud render from x,y,z 2d array从x,y,z 2d数组中渲染opengl 3d点云
【发布时间】:2012-09-30 13:17:19
【问题描述】:

在 c++ (vs2008) 中使用 openGl 显示 3d 点云需要一些指导。我正在尝试使用纹理进行 3d 点云显示。我有 3 个二维数组(每个相同大小 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)。

【问题讨论】:

  • 我没有每个点的 RGB,所以我不能使用 glColor3*(r,g,b)。我正在尝试使用最后一个数组(具有 0-255 值)作为 3D 点云的纹理。从 glBegin(GL_POLYGON) 我认为你建议创建一个网格????同样的问题是如何从我上面的内容中取得进展。还是我走错了方向。
  • 好吧,上面的代码基本上会从你的 3 个坐标数组中绘制一个点云。没有真正的“缓冲区”被填充,您直接在立即模式下绘制。对于颜色:据我了解,每个顶点都有一个无符号字节值?因此,您应该定义这些值如何表示某些颜色。您可以直接将它们用作强度,也可以使用调色板或完全不同的东西。

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


【解决方案1】:

点绘制代码就可以了。

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

要为点着色,您需要在每个 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。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多