我遇到了以下情况:
从Kinect传感器中检索空间数据后,在glpclview示例中,当前帧的绘制方式如下:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_SHORT, 0, xyz);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(3, GL_SHORT, 0, xyz);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, gl_rgb_tex);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 640, 480, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb);
glPointSize(2.0f);
glDrawElements(GL_POINTS, 640*480, GL_UNSIGNED_INT, indices);
其中
static unsigned int indices[480][640];
static short xyz[480][640][3];
char *rgb = 0;
short *depth = 0;
其中:
xyz 构造如下:
xyz [i] [j] [0] = j xyz [i] [j] 3 = i xyz [i] [j] 4 =深度[i * 640 + j]
indices 是(我猜只有)跟踪rgb /深度数据的数组,构造如下:
indices [i] [j] = i * 640 + j
到目前为止,这么好,但现在我需要渲染更多只有一帧(其中一些旋转并以一定的角度/偏移进行平移)。我怎样才能做到这一点? 我试图增加数组的大小并为每个新帧保留重新分配内存,但是我如何渲染它们呢? 我应该将此当前行更改为其他内容吗?
glTexImage2D(GL_TEXTURE_2D, 0, 3, 640, 480, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb)
如果是这样,我应该更改640和480,因为现在 xyz 和 rgb 是640x480x(帧数)的contiguos指针?
为了获得更好的想法,我最终尝试得到类似于this的东西(除了机器人:D)。
如果有人有更好的想法,请提示我应该如何处理这个问题,请告诉我。
答案 0 :(得分:1)
它并不像分配更大的数组那么简单。
如果您想将多个点云拼接在一起以制作更大的地图,您应该查看SLAM算法(这是他们在您链接的视频中运行的算法)。您可以在http://openslam.org找到许多实现。您还可以查看ICP算法(迭代最近点)和Microsoft的KinectFusion(以及PCL的开源KinFu实现)。