C++ 在OpenGL中绘制两点云的交点

C++ 在OpenGL中绘制两点云的交点,c++,opengl,point-clouds,C++,Opengl,Point Clouds,我有两个相似的点云,由一个向量定义,它们在空间中的给定位置(x,y,z),我想同时渲染两个云,并计算它们之间的差异。这是我第一个使用OpenGL的应用程序,所以我还没有掌握如何使用它 通过分别处理每个向量,我成功地渲染了它们,例如: glBegin(GL_POINTS);GLfloat green[] = { 0.f, 1.0f, .0f, alpha[1]/10 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, green);

我有两个相似的点云,由一个向量定义,它们在空间中的给定位置(x,y,z),我想同时渲染两个云,并计算它们之间的差异。这是我第一个使用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();
glBegin(GL_点);GLfloat-green[]={0.f,1.0f,.0f,alpha[1]/10};
GLMATERIALV(GL_前部和后部,GL_漫反射,绿色);
GLMATERIALV(GLU前、后、GLU反光度、低反光度);
//GLMATERALEV(GL_前部和后部、GL_镜面反射、mat_镜面反射);
对于(std::vector::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);
}
}
格伦德();
但是,当我将两者重叠时,生成的图像如下所示:

在那里,红云和蓝云被认为是完美匹配的。有没有办法“合并”这些点?也就是说,考虑到点位置匹配,我可以更改匹配位置的颜色吗?渲染仅使用点而不使用网格


我尝试在渲染前比较两个向量,但由于点云太大,算法速度太慢。

您想要做的当然是可能的,但是使用OpenGL,您只能在图像中合并它们。OpenGL仅仅是一个绘图API,它不提供操作几何图形的高级方法

如果纯图像空间合并足够,则可以使用模具缓冲区。渲染第一个点云,而不执行颜色写入
glColorMask(0,0,0,0)
和在模具缓冲区中设置位。然后在启用颜色写入的情况下渲染第二个点云,但仅在其通过模具测试的情况下渲染

在屏幕图像空间中使用OpenGL完成这项工作就到此为止


但是,我怀疑您希望几何合并点云。好的,这里是:因为点是无限小的,两个点云的交点就是这些点,对于这些点,可以在另一个点云中找到完全相同位置的点。这可以归结为最近邻搜索,使用Kd树可以在3维空间中很好地进行搜索(对于更高维空间,搜索难度会成倍增加)


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

您想要做的当然是可能的,但是使用OpenGL,您只能在图像中合并它们。OpenGL仅仅是一个绘图API,它不提供操作几何图形的高级方法

如果纯图像空间合并足够,则可以使用模具缓冲区。渲染第一个点云,而不执行颜色写入
glColorMask(0,0,0,0)
和在模具缓冲区中设置位。然后在启用颜色写入的情况下渲染第二个点云,但仅在其通过模具测试的情况下渲染

在屏幕图像空间中使用OpenGL完成这项工作就到此为止


但是,我怀疑您希望几何合并点云。好的,这里是:因为点是无限小的,两个点云的交点就是这些点,对于这些点,可以在另一个点云中找到完全相同位置的点。这可以归结为最近邻搜索,使用Kd树可以在3维空间中很好地进行搜索(对于更高维空间,搜索难度会成倍增加)


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

如果要直观地合并它们,则重叠部分会使用红色和蓝色(紫色)的混合色可以启用alpha混合并使用适当的混合函数。请参阅以获取一些提示。

如果您希望仅在视觉上合并它们,以便使用红色和蓝色(紫色)的混合对重叠部分进行着色,则可以启用alpha混合并使用适当的混合功能。请参阅以获得一些提示。

现在我将您的答案标记为正确答案,因为这是我使用的答案。这两个答案似乎都是对的。现在我把你的答案标记为正确答案,因为这是我用过的答案。但两者似乎都是正确的。