【问题标题】:Combining OpenGL renderings into one view将 OpenGL 渲染合并到一个视图中
【发布时间】:2009-05-07 02:25:42
【问题描述】:

我有一个简单的实体建模应用程序,我想在其中实现几种“导航模式”,即用户通过 3d 空间导航相机的方式。其中之一是在 SketchUp、Blender 等中使用的无处不在的“拖动和平移/旋转”;我还想实现与我的特定应用程序更相关的东西。具体来说,我想实现一种模式,其中相机漂浮在被建模对象(建筑物)上方的“环”上,并始终注视模型的中心;这样,用户可以轻松地围绕对象“转圈”,这是我的应用程序中的常见操作。

所以,我要做的是在我的视图中渲染建筑物,并在视图的右上角显示一个圆环,圆环上有一个小球体来表示相机位置。圆环中会有一个指北针,用户可以通过拖动球体来围绕模型对象拖动相机;移动球体将重新定位相机并重绘场景。

看起来我应该做的是:渲染“主视图”,即建筑物;然后将环面和球体(具有不同的透视设置和光照)渲染到屏幕外缓冲区,然后将其从那里传送到我的主视图。

然后我开始进行命中测试。我想检测用户是点击球体还是圆环;根据我对 OpenGL 拾取的理解(这似乎是一个很难的主题:/),所有拾取方法仅适用于在一个“场景”中进行选择。除此之外,很明显,我仍然想检测建筑模型中的“正常”拾取操作。

所以,我的问题:

  • 如何渲染到屏幕外缓冲区并进入另一个 OpenGL 上下文(像圆环中心一样使用 alpha 混合和透明度)?
  • 如何在所述场景中进行命中测试?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    我认为您不需要为此进行屏幕外渲染。您应该能够重新设置相机和viewport 并在主场景之后渲染叠加层。您可能会遇到 Z 排序和/或缓冲问题,但也许“子场景”足够简单,这无关紧要,或者您当然可以在渲染之前清除 Z 缓冲区。

    【讨论】:

      【解决方案2】:

      就绘制环面/球体而言,为此创建一个单独的类并实现“绘制”方法。让类包含球体和圆环的位置,并让 draw() 在屏幕上渲染这些东西。

      然后只需在您的主要绘图方法中调用 myRing.draw(),您将拥有一个球体和圆环!

      如果你的意思是你想在窗口的右上角以 2D 呈现一个圆圈/环(这可能更容易),那么你的 hitbox 帖子中的同样的想法将适用(除非没有那个烦人的投影计算!)

      最后,我会考虑结合使用功能键和鼠标拖动来实现您想要的功能......例如用户按住“shift”,然后在屏幕上单击并拖动鼠标。这些鼠标事件被捕获,x-delta 用于计算旋转角度。发生这种情况时,相机的位置会更新,您会获得平滑的滑动动作:)

      【讨论】:

      • 感谢您为将来的读者提供完整性,这是您提到的帖子的链接:stackoverflow.com/questions/829786/…。我认为在这里重复一遍就足够有用了,尽管我现在的想法是渲染一个 3d 圆环 :)
      【解决方案3】:

      我同意@unwind;您不需要屏幕外缓冲区。无论如何,如果你想,搜索“render-to-texture”。

      至于命中测试,The OpenGL FAQ 上有一个条目。它描述了几种解决方案:使用 GL_SELECTION 渲染模式、使用 gluUnproject() 获取 3D 碰撞光线和使用独特颜色的简单 2D 解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 2013-08-02
        • 2013-05-06
        • 2012-06-20
        • 2011-08-28
        • 1970-01-01
        • 2012-06-24
        相关资源
        最近更新 更多