使用GPU在点云中查询距离切割平面epsilon以内的点

4
我正在尝试使用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,那就太好了。对我的问题来说,这些答案有点太模糊了。
感谢任何评论。
附:同时发布在http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=245911#Post245911
4个回答

1
很简单: 设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”意味着“绝对值”。 如果你想知道为什么,请阅读维基百科上关于标量积的文章。


0

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

只有当你处理数千个点和可能的数百个平面时,使用所述方法才会有任何好处。与Corporal Touchy所述的点和平面的点积相比。

此外,由于像素的有限性质,您经常会发现两个或更多点将投影到纹理中的同一像素。

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


我还是不明白它为什么会更快,计算仍然必须进行。:) 或许你知道内部是如何完成的? - Sarien

0

在我看来,你应该能够实现类似于Corporal Touchy的方法作为一个顶点程序而不是在for循环中,对吧?也许可以使用C API进行GPU编程,比如CUDA


0

首先,作为一个小免责声明:我对3D编程一无所知。

现在是我的纯数学想法:

给定一个平面的法线N(单位长度)和平面到中心点(点[0/0/0])的距离L。点X到平面的距离由N和X的数量积减去到中心点的距离L得出。因此,您只需要检查

|n . x - L| <= epsilon

其中“.”表示数量积,“| |”表示绝对值

当然,您必须先将平面与法线相交,以获取距离L。

也许这可以帮助您。


如果您投票反对,请留下评论说明原因。我想知道。 - Sarien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接