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,那就太好了。这些对我的问题的回答有点太模糊了。

非常感谢您的任何评论。

ps 另请注意,如果可能的话,我宁愿不使用像 CUDA 这样的任何资源,因此,在不需要我编写新着色器的情况下,获得使用尽可能多的 OpenGL 元素的东西。

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

4

4 回答 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”的意思是“绝对值”。如果您想知道为什么只阅读维基百科上有关标量产品的文章。

于 2008-09-17T08:35:49.133 回答
0

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

只有当您正在查看 1000 个点和可能的 100 个平面时,使用概述的方法才会有任何好处。相对于点和平面的点生成,正如我的下士 Touchy 所概述的那样。

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

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

于 2008-09-18T16:03:28.830 回答
0

IT seems to me you should be able to implement something similar to Corporal Touchy's method a a vertex program rather than in a for loop, right? Maybe use a C API to GPU programming, such as CUDA?

于 2008-09-22T19:23:51.257 回答
0

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

现在我的纯数学想法:

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

|n 。x - L| <= ε

. 是标量积和 | | 绝对值

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

也许这有帮助。

于 2008-09-16T21:50:14.443 回答