OpenGL gluUnProject对象部分

时间:2009-12-31 02:24:46

标签: opengl glut raytracing

我正在使用gluUnProject将光线投射到场景中并在那里添加基元。我正在尝试做的是现在准确地选择现有的基元,所以如果我有3个球体,我可以点击一个来删除它。

我认为解决方案会以某种方式检查光线是否与物体相交并检查它是否最接近铸造原点。到目前为止,我的解决方案是原始的,并且使用边界立方体围绕所有对象,无论如何只需要使用以下内容准确地执行此操作:

does the ray intersect with ( object)

returnRayIntersections(ray);

最后,我正在使用OpenGL和GLUT。

谢谢大家, 劳伦斯

2 个答案:

答案 0 :(得分:3)

使用OpenGL 选择模式是最好的方法,因为它可以处理任意复杂的渲染,而不仅仅是球体。您可以看到许多教程,但大致是:您首先在选择模式中设置GL:

glRenderMode (GL_SELECT);

然后,在设置选择缓冲区之后绘制场景,该缓冲区捕获正在渲染的片段的名称。这个article将帮助您入门。

Nehe的tutorial很长,但也很好。

答案 1 :(得分:1)

在OpenGL中实现选择的另一个好方法是:

将场景绘制到后台缓冲区中,使用您要选择的每个基元的唯一颜色。如果您使用的是24位模式,颜色可以简单地为#000001,#000002等。关闭灯光,雾等,以便您指定的颜色是像素将采用的确切颜色。

不要将后缓冲区blit到屏幕上(不要使用glSwapBuffers)。相反,使用glReadPixels将GL后缓冲区读入内存缓冲区。在此之后,您有一个内存位图,您可以从中读取像素值,对应于屏幕上鼠标的位置。您从中读出的颜色值可以很容易地映射到原语(因为它将是#000001,#000002等)。

这是关于这种选择方式的一些more信息。这就是我喜欢使用的,因为它比GL_SELECTION模式有一个优势。如果3D场景不变并且鼠标正在其上移动,我可以获得一个后缓冲区副本,然后通过简单地引用我的内存位图中的相应像素来快速估计鼠标下的实体。在场景发生变化之前,我根本不需要使用任何GL调用。由于我的应用程序有很多鼠标悬停在3D场景上,我需要快速知道鼠标悬浮在哪个实体上,我发现这个方法非常快。

相关问题