【问题标题】:OpenGL gluUnProject object sectionOpenGL gluUnProject 对象部分
【发布时间】:2009-12-31 11:01:08
【问题描述】:

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

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

does the ray intersect with ( object)

returnRayIntersections(ray);

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

谢谢大家, 劳伦斯

【问题讨论】:

    标签: opengl glut raytracing


    【解决方案1】:

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

    glRenderMode (GL_SELECT);
    

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

    Nehe 的tutorial 很长,但也很好。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-09
      • 2012-06-21
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2019-05-20
      • 2017-08-24
      • 2019-05-22
      相关资源
      最近更新 更多