我有两个相似的点云,由一个在空间中给定位置(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();
但是,当我重叠两者时,生成的图像如下:
红色和蓝色云应该完美匹配。有没有办法“合并”积分?也就是说,考虑到点位置匹配,我可以改变匹配位置的颜色吗?仅使用点进行渲染,而不进行网格划分。
我尝试在渲染之前比较两个向量,但算法最终太慢了,因为点云太大了。
答案 0 :(得分:3)
您想要做的当然是可能的,但是使用OpenGL,您只能在图像中合并它们。 OpenGL仅仅是一个绘图API,它没有提供操作几何的高级方法。
如果纯图像空间合并足够,则可以使用模板缓冲区。渲染第一个点云而不执行颜色写入glColorMask(0,0,0,0)
并在模板缓冲区中设置一个位。然后渲染第二个点云,启用颜色写入,但仅在它通过模板测试的位置。
在屏幕图像空间中使用OpenGL做这么多。
但是我怀疑你想要几何合并点云。好的,这里是:由于点数无限小,两个点云的交点就是那些点,在其他点云中可以找到完全相同位置的点。这归结为最近邻搜索,使用Kd树可以在3维中很好地完成(对于更高维度,它变得指数级更难)。
但是我认为你实际上并不想要点云点,而是由它们创建的隐式表面。因此,假设每个点在其周围创建一个具有特定半径r
的标量场。一个点云的总场是其每个构成点的场的饱和和。通过乘以每个点云的字段,您可以获得交叉场。如果您为每个点云的每个点采样该字段并丢弃该字段低于阈值的所有点,则会得到两个点云的交点。
答案 1 :(得分:2)
如果你想直观地合并它们,那么重叠的部分用红色和蓝色(紫色)混合着色你可以启用alpha混合并使用适当的混合功能。有关提示,请参阅here。