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

时间:2009-05-06 13:55:32

标签: opengl

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

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

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

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

所以,我的问题:

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

如果你的意思是你希望在窗口的右上角有一个2D(可能更容易)渲染的圆圈/圆环,那么同样的想法将适用于你的hitbox帖子(除非没有那么讨厌投影计算!)

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

答案 2 :(得分:0)

我同意@unwind;你不需要屏幕外的缓冲区。无论如何你想要搜索“渲染到纹理”。

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

相关问题