将OpenGL渲染合并到一个视图中

将OpenGL渲染合并到一个视图中,opengl,Opengl,我有一个简单的实体建模应用程序,我想在其中实现几种“导航模式”,即用户通过3d空间导航相机的方式。其中之一是SketchUp、Blender等中普遍使用的“拖动和平移/旋转”。;我还想实现一些与我的特定应用程序更相关的东西。具体地说,我想实现一种模式,在这种模式下,摄影机漂浮在建模对象(建筑)上方的“环”上,并始终注视模型的中心;这样,用户可以轻松地围绕对象“旋转”,这是我的应用程序中的常见操作 因此,我要做的是在我的视图中渲染建筑,并在视图的右上角显示一个圆环,圆环上有一个小球体来表示摄影机的

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

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

看起来我应该做的是:渲染“主视图”,即建筑;然后将圆环体和球体(使用不同的透视设置和照明)渲染到屏幕外的缓冲区,并从那里将其blit到我的主视图

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

所以,我的问题是:

  • 如何渲染到屏幕外缓冲区并将blit渲染到另一个OpenGL上下文中(使用类似于圆环中心的alpha混合和透明)
  • 如何在所描述的场景中进行命中测试

    • 我认为您不需要为此进行屏幕外渲染。您应该能够在主场景之后重新设置摄影机并渲染覆盖。您可能在Z排序和/或缓冲方面有问题,但可能“子场景”足够简单,因此不重要,或者您当然可以在渲染之前清除Z缓冲区。

      我同意@unwind;你不需要屏幕外的缓冲区。如果仍要继续,请搜索“渲染到纹理”


      至于命中测试,它有一个条目。它描述了几种解决方案:使用GL_选择渲染模式,使用gluUnproject()获取3D碰撞光线,以及使用唯一颜色的简单2D解决方案。

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

      然后只需在主绘图方法中调用myRing.draw(),就可以得到一个球体和圆环体

      如果您的意思是希望在窗口右上角的2D中渲染一个圆/环(这可能更容易),那么同样的想法也适用于hitbox帖子(除了没有烦人的投影计算!)


      <>最后,我会考虑使用函数键和鼠标拖动来实现你想要的功能…例如,用户按住“shift”键,然后单击将鼠标拖动到屏幕上。捕捉这些鼠标事件,并使用x-delta计算旋转角度。相机的位置会随着这种情况而更新,你会得到一个平滑的滑动运动:)

      谢谢,为了给未来的读者提供完整的信息,这里是你提到的帖子的链接:。我认为在这里重复一下就足够有用了,尽管我现在的想法是渲染3d圆环:)