簡體   English   中英

當前設置的OpenGL C ++ Minimap

[英]OpenGL C++ Minimap of current setting

我正在尋找一種從當前3D場景的頂部創建第二個視圖的方法。 我想做到這一點盡可能容易。 基本思想是您有一個子窗口,它將顯示該設置的俯視圖。

我已經研究過openGL中的子窗口,但是問題是您必須重新繪制所有內容(基本上以2個場景的角度不同而結束=不好)。 另外,因為這將在稱為“塔箱堆疊”的3D游戲中使用(您必須將箱子彼此疊放並建造一個高塔),所以無法使用子窗口的方式進行操作(因為您將獲得2個場景具有不同的塊/位置/動作/ ...)

因此,如何在當前場景中添加“第二台攝像機”,然后將其放置在頂部。

我已經研究過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()

使用默認設置繪制場景一次。

然后應用不同的視圖變換(對應於您的第二個“相機”),使用glViewport選擇屏幕的子矩形並再次繪制場景。 (不要忘了重置glViewport再覆蓋整個屏幕)

如果您希望小地圖的寬高比(w / h)不同,則在第二遍過程中,您還需要更改透視圖轉換,以便一切正常。

免責聲明:我還沒有嘗試過,但這確實是一個建議。

因此,您說您的游戲是關於堆疊盒子的,並且您需要俯視圖。 為什么不“假裝”俯視圖? 基本上,您創建一個將游戲小地圖表示為正交視圖的紋理。 僅當堆疊新塊時,才需要更新紋理。 要在當前位置查看它,則必須設置“子窗口”或視口的適當紋理坐標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM