我正在寻找一种从当前3D场景顶部创建第二个视图的方法。我想尽可能简单地做到这一点。基本的想法是你有一个子窗口,它将显示设置的顶视图。
我已经查看了openGL中的子窗口,但问题是你必须重绘所有东西(基本上最终得到2个不同角度的场景=不好)。另外,因为这将用于称为“塔箱堆叠”的3D游戏(你必须将盒子放在彼此的顶部并形成高塔),所以不可能使用子窗口的方式来做它(因为你会得到2个场景用不同的块/位置/动作/...)
那么如何在当前场景中添加“第二台摄像机”,然后将其置于顶部。
答案 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)
免责声明:我没有尝试过,这是一个真正的建议。
所以你说你的游戏是关于堆叠盒子,你想要一个俯视图。为什么不“假装”头顶视图?基本上,您创建一个纹理,将游戏的小地图表示为正交视图。只有当新块被堆叠时,您才需要更新纹理。要在当前位置查看它,您必须设置“子窗口”或视口的相应纹理坐标。