2014-04-11 52 views
1

我有两个相似的点云,由向量在空间中给定位置(x,y,z)定义,我想同时渲染两个云并评估它们之间的差异。这是我第一次使用OpenGL的应用程序,所以我仍然没有太多的把握。在OpenGL中绘制两个点云之间的交点

我已经设法通过分别处理每个载体,例如以使两者:

glBegin(GL_POINTS);GLfloat green[] = { 0.f, 1.0f, .0f, alpha[1]/10 }; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, green); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, low_shininess); 
    //glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); 
    for (std::vector<Point3D>::iterator moit = morig_cloud.begin(); moit != morig_cloud.end(); ++moit){ 
     if ((moit - f_cloud.begin()) % (ptd[1]) == 0){ 
      glVertex3f(moit->x, moit->y, moit->z); 
     } 
    } 
    glEnd(); 

然而,当我都重叠,所得到的图像如下: 1

在哪里红色和蓝色的云都应该完美匹配。有什么办法可以“合并”这些观点吗?也就是说,考虑到点位置匹配,我可以改变匹配位置的颜色?只有点才能完成渲染而不需要网格划分。

我试着在渲染前比较两个矢量,但算法速度太慢,因为点云太大。

回答

2

如果你想合并它们只是视觉上,所以重叠的部分用红色和蓝色(紫色)的混合着色,你可以启用alpha混合并使用适当的混合函数。有关提示,请参阅here

+0

现在我将你的答案标记为正确的答案,因为它是我用过的答案。两者似乎都是正确的。 – Ishida

3

你想要做什么肯定是可能的,但是使用OpenGL你可以只在图像中合并它们。 OpenGL是一个简单的绘图API,它不提供操作几何的高级方法。

如果纯图像空间合并足够了,那么你可以使用模板缓冲区。渲染第一个点云而不执行颜色写入glColorMask(0,0,0,0)并在模板缓冲区中设置一个位。然后使用颜色写入启用第二个点云,但只在通过模板测试的位置渲染。

非常适合在屏幕图像空间中使用OpenGL。


但是我怀疑你想几何合并点云。好吧,这里是:由于点无限小,所以两点云的交点就是那些点,对于这些点,在正好是的位置可以在另一个点云中找到。这归结为最近的邻居搜索,这可以使用Kd树在三维中相当好地完成(对于更高维度它变得指数级更难)。

但是,我认为你实际上并不想交叉点云,而是由它们创建的隐式曲面。因此,假设每个点以一定的半径在其周围创建一个标量字段r。一个点云的总场是每个组成点的场的饱和总和。通过乘以每个点云的场,您可以获得相交场。如果您为每个点云的每个点对该域进行采样,并丢弃该域位于阈值以下的所有点,则可以得到两个点云的交点。