【问题标题】:Draw Intersection between two point clouds in OpenGL在OpenGL中绘制两个点云之间的交点
【发布时间】:2014-04-11 08:22:16
【问题描述】:

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

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

红云和蓝云都应该完美匹配。有没有办法“合并”这些点?也就是说,考虑到点位置匹配,我可以更改匹配位置的颜色吗?渲染只用点完成,没有网格化。

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

【问题讨论】:

    标签: c++ opengl point-clouds


    【解决方案1】:

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

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

    在屏幕图像空间中使用 OpenGL 完成了这么多。


    但是我怀疑您想以几何方式合并点云。好的,这里是:由于点无限小,因此两个点云的交点就是那些点,对于这些点,在另一个点云中恰好可以找到相同位置的点。这归结为最近邻搜索,可以使用 Kd 树在 3 维中很好地完成(更高维度的搜索难度呈指数增长)。

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

    【讨论】:

      【解决方案2】:

      如果您只想在视觉上合并它们,因此重叠部分会混合红色和蓝色(紫色),您可以启用 Alpha 混合并使用适当的混合功能。有关一些提示,请参阅here

      【讨论】:

      • 现在我将您的答案标记为正确答案,因为它是我使用过的答案。不过,两者似乎都是正确的。
      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多