OpenGL C ++当前设置的小地图

时间:2012-03-10 11:24:37

标签: c++ opengl

我正在寻找一种从当前3D场景顶部创建第二个视图的方法。我想尽可能简单地做到这一点。基本的想法是你有一个子窗口,它将显示设置的顶视图。

我已经查看了openGL中的子窗口,但问题是你必须重绘所有东西(基本上最终得到2个不同角度的场景=不好)。另外,因为这将用于称为“塔箱堆叠”的3D游戏(你必须将盒子放在彼此的顶部并形成高塔),所以不可能使用子窗口的方式来做它(因为你会得到2个场景用不同的块/位置/动作/...)

那么如何在当前场景中添加“第二台摄像机”,然后将其置于顶部。

3 个答案:

答案 0 :(得分:4)

  

我在openGL中查看子窗口,但问题是你必须重绘所有内容(基本上以2个场景结束不同的角度=不好)

这实际上是使用OpenGL执行此操作的唯一方法。

  

那么如何在当前场景中添加“第二台摄像机”,然后将其置于顶部。

OpenGL没有摄像头。它甚至没有场景。 OpenGL只是绘制非常简单的形状:点,线和三角形。在上面,OpenGL不了解几何或复杂的场景。

场景管理取决于您,并且您可以实现绘制场景的多个视图。


更新:伪代码

draw_scene:
    for o in objects:
        glPushMatrix()
        glMultMatrix(o.transform)
        o.draw()
        glPopMatrix()

render_main_view:
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(...)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glMultMatrix(main_camera_transform)

render_secondary_view:
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(...)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glMultMatrix(secondary_camera_transform)

scissor_viewport(x,y,w,h)
    glScissor(x,y,w,h)
    glViewport(x,y,w,h)

render:
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glEnable(GL_SCISSOR_TEST)
    scissor_viewport(main_viewport.x,main_viewport.y,main_viewport.w,main_viewport.h)
    render_main_view()

    glClear(GL_DEPTH_BUFFER_BIT)
    scissor_viewport(secondary_viewport.x,secondary_viewport.y,secondary_viewport.w,secondary_viewport.h)
    render_secondary_view()

答案 1 :(得分:3)

使用默认设置绘制场景一次。

然后应用不同的视图转换(对应于您的第二个“相机”),使用glViewport选择屏幕的子矩形并再次绘制场景。 (之后不要忘记重置glViewport以覆盖整个屏幕)

如果您希望迷你地图具有不同的宽高比(w / h),那么在第二次传递期间,您还需要更改透视转换,以使一切看起来都正常。

答案 2 :(得分:0)

免责声明:我没有尝试过,这是一个真正的建议。

所以你说你的游戏是关于堆叠盒子,你想要一个俯视图。为什么不“假装”头顶视图?基本上,您创建一个纹理,将游戏的小地图表示为正交视图。只有当新块被堆叠时,您才需要更新纹理。要在当前位置查看它,您必须设置“子窗口”或视口的相应纹理坐标。