3

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

我认为解决方案会以某种方式检查光线是否与物体相交并检查它是否最接近投射原点。到目前为止,我的解决方案是原始的,并用一个边界立方体包围所有对象,无论如何,是否可以简单地使用以下方法为球体准确地执行此操作:

does the ray intersect with ( object)

或者

returnRayIntersections(ray);

最后一件事,我使用 OpenGL 和 GLUT。

谢谢大家,劳伦斯

4

2 回答 2

3

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

glRenderMode (GL_SELECT);

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

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

于 2009-12-31T02:46:40.747 回答
1

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

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

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

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

于 2009-12-31T03:01:08.097 回答