查询点使用GPU在点云中接近切割平面

时间:2008-09-16 21:21:33

标签: opengl geometry cloud point

我正在尝试使用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

4 个答案:

答案 0 :(得分: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

显然,“标量产品”意味着“标量产品”而“绝对产品”意味着“绝对价值”。 如果你想知道为什么只是阅读维基百科的标量产品文章。

答案 1 :(得分:0)

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

现在我的纯粹数学思想:

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

| n。 x - L | < = epsilon

。作为标量产品和| |绝对值

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

也许这有帮助。

答案 2 :(得分:0)

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

只有当您查看1000个点和可能的100个飞机时,使用所概述的方法才会有任何好处。正如我的Corporal Touchy所描述的那样,点击产生点和平面。

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

如果您仍然想要这样做,我可以用C ++编写一个样本过剩程序,但是这对MATLAB有什么帮助我不知道,因为我对它不熟悉。

答案 3 :(得分:0)

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