OpenGL gluUnProject 对象部分

3
我正在使用gluUnProject将光线投射到场景中,并在那里添加原语。现在我想做的是准确地选择现有的基元,因此如果我有3个球,我可以单击一个来删除它。
我认为解决方案应该检查射线是否与对象相交,并检查它是否最接近投射起点。到目前为止,我的解决方案很原始,并且用一个边界立方体围绕所有对象,是否有办法使用例如球体,以简单而准确的方式完成这一点:
does the ray intersect with ( object)

或者

returnRayIntersections(ray);

最后一件事,我正在使用带有GLUT的OpenGL。
谢谢大家, Laurence
2个回答

3
使用OpenGL的选择模式是实现此目的的最佳方法,因为它可以处理任意复杂的渲染,而不仅仅是球体。您可以查看许多教程,但大致上:您可以通过设置GL选择模式来开始:
glRenderMode (GL_SELECT);

其次,在设置捕获正在渲染的片段名称的选择缓冲区后,您可以绘制场景。这篇文章将帮助您入门。

Nehe的教程也很长,但非常好。


1

在OpenGL中实现拾取的另一种好方法是这样的:

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

不要将后备缓冲区复制到屏幕上(不要使用glSwapBuffers)。相反,使用glReadPixels将GL后备缓冲区读入内存缓冲区。之后,您就有了一个内存位图,可以从中读取与屏幕上鼠标位置对应的像素值。然后,您可以轻松地将从中读取的颜色值映射到基元(因为它将是#000001、#000002等)。

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


啊哈,这个方法看起来很棒,在这里找到了一个很好的教程:http://www.lighthouse3d.com/opengl/picking/index.php3?color1 - Ljdawson

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