使用GPU在点云中查询靠近切平面的epsilon点

时间:2020-03-05 18:57:14  来源:igfitidea点击:

我正在尝试使用GPU功能解决当前问题:"给定点云P和一个由点和法线(Pp,Np)表示的定向平面,将返回点云中的点的距离等于或者小于EPSILON从飞机上"。

与我的一位同事交谈后,我趋向于达成以下解决方案:

1)准备带有添加的纹理坐标的点的顶点缓冲区,以使每个点都具有不同的顶点坐标
2)将投影状态设置为正交
3)旋转网格,使平面的法线与-z轴对齐,并使其偏移,以使x,y,z = 0对应于Pp
4)将z裁剪平面设置为z:[-EPSILON; + EPSILON]
5)渲染到纹理
6)从图形卡中检索纹理
7)从图形卡中读取纹理,并查看渲染了哪些点(根据其索引),这些点是所需距离范围内的点。

现在问题如下:
q1)我需要打开一个窗框才能执行此操作吗?我在MATLAB内工作并调用MEX-C ++。根据经验,我知道一旦我们打开一个新的框架,整个西装就会惨败!
q2)为GLPoint提供纹理坐标的原语是什么?
q3)我不太清楚如何实现纹理渲染?任何参考,教程都很棒...
q4)我们将如何从卡中检索此纹理?再次,任何参考资料,教程都会很棒...

我的时间很紧,因此,如果我们能指出我应该学习的技术名称,而不是像别人做的那样,指向GLSL规范文档和OpenGL API,那就太好了。这些对我的问题来说有点太模糊了。

非常感谢任何评论。

p.s.
另请注意,如果可能的话,我宁愿不使用任何诸如CUDA之类的资源,因此,获得了一些可以使用的资源
尽可能多的OpenGL元素,而无需我编写新的着色器。

注意:交叉张贴在
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=245911#Post245911

解决方案

回答

好的,首先要声明一点:我对3D编程一无所知。

现在我的纯粹数学想法:

给定一个平面,该平面具有法线N(单位长度)和平面到中心的距离L(点[0/0/0])。点X到平面的距离由N和X的标量乘以L到中心的距离得出。因此,我们只需要检查一下

| n。 x L | <= epsilon

。是标量产品| |绝对值

当然,我们必须先将平面与法线相交才能获得距离L。

也许这会有所帮助。

回答

这很简单:
令n为平面的法线,x为点。

n_u = n/norm(n)         //this is a normal vector of unit length
d   = scalarprod(n,x)   //this is the distance of the plane to the origin

for each point p_i
    d_i = abs(scalarprod(p_i,n) - d)  //this is the distance of the point to the plane

显然," scalarprod"表示"标量乘积"," abs"表示"绝对值"。
如果我们想知道为什么只阅读Wikipedia上有关标量产品的文章。

回答

我想问Andrea Tagliasacchi一个问题,为什么?

仅当我们查看1000个点并且可能查看100个平面时,使用概述的方法才会有任何好处。正如我的下士笔触所概述的那样,用于点积点和平面。

同样由于像素的有限性,我们经常会发现两个或者多个点将投射到纹理中的同一像素。

如果我们仍然想这样做,我可以用C ++编写一个示例glut程序,但是这对我不知道的MATLAB有什么帮助,因为我不熟悉它。

回答

在我看来,我们应该能够在顶点程序中而不是在for循环中实现类似于Corpory Touchy的方法的东西,对吧?也许使用C API进行GPU编程,例如CUDA?