在OpenGL中绘制两个点云之间的交点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在OpenGL中绘制两个点云之间的交点相关的知识,希望对你有一定的参考价值。

我有两个相似的点云,由一个在空间中给定位置(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();

但是,当我重叠两者时,生成的图像如下:

红色和蓝色云应该完美匹配。有没有办法“合并”积分?也就是说,考虑到点位置匹配,我可以改变匹配位置的颜色吗?仅使用点进行渲染而不进行网格划分。

我尝试在渲染之前比较两个向量,但算法最终太慢了,因为点云太大了。

答案

如果你想直观地合并它们,那么重叠的部分用红色和蓝色(紫色)混合着色你可以启用alpha混合并使用适当的混合功能。有关提示,请参阅here

另一答案

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

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

在屏幕图像空间中使用OpenGL做这么多。


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

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

以上是关于在OpenGL中绘制两个点云之间的交点的主要内容,如果未能解决你的问题,请参考以下文章

找到两个弧之间的交点

OpenGL没有将最近的片段绘制到相机

OpenGL仅从顶点数组中绘制一些索引

Qt中的OpengL glDrawBuffers()?

绘制三角形的OpenGL程序给出了一个黄色的屏幕

OpenGL 片段着色器未写入 fbo 颜色缓冲区