如何在opengl / pyglet中使用HUD缩放相机?

时间:2018-12-31 22:49:15

标签: python-3.x opengl pyglet

我正在用pyglet制作2D策略游戏,并使用glTranslatef函数实现了相机移动:

def background_motion(dt):
    if stars.left:
        pyglet.gl.glTranslatef(15, 0, 0)
        stars.translation[0] += 15
    if stars.right:
        pyglet.gl.glTranslatef(-15, 0, 0)
        stars.translation[0] -= 15
    if stars.up:
        pyglet.gl.glTranslatef(0, -15, 0)
        stars.translation[1] -= 15
    if stars.down:
        pyglet.gl.glTranslatef(0, 15, 0)
        stars.translation[1] += 15

并使HUD保持在这样的位置:

def on_draw():
    window.clear()
    stars.image.draw()
    for s in game.ships:
        s.draw()
    pyglet.gl.glTranslatef(-stars.translation[0], -stars.translation[1], 0)

    #HUD Start
    overlay.draw(stars.image.x,stars.image.y,game.ships,stars.scale,stars.image.width)
    if game.pause:
        pause_text.draw()
    #HUD End

    pyglet.gl.glTranslatef( stars.translation[0], stars.translation[1], 0)

我在缩放时尝试了类似的方法,并且在缩放有效时,HUD也已缩放:

def on_mouse_scroll(x, y, scroll_x, scroll_y):
    if scroll_y > 0:
        stars.scale += 0.01

    elif scroll_y < 0:
        stars.scale -= 0.01

@window.event
def on_draw():
    window.clear()
    pyglet.gl.glScalef(stars.scale,stars.scale, 0, 1)
    stars.image.draw()
    for s in game.ships:
        s.draw()
    scale_reverse = 1 + (1 - stars.scale)
    pyglet.gl.glScalef(scale_reverse, scale_reverse, 0, 1)
    pyglet.gl.glTranslatef(-stars.translation[0], -stars.translation[1], 0)

    #HUD Start
    overlay.draw(stars.image.x,stars.image.y,game.ships,stars.scale,stars.image.width)
    if game.pause:
        pause_text.draw()
    #HUD End

    pyglet.gl.glTranslatef( stars.translation[0], stars.translation[1], 0)
    pyglet.gl.glScalef(stars.scale, stars.scale, 0, 1)
    stars.scale = 1

我该如何做才能避免HUD缩放?

1 个答案:

答案 0 :(得分:1)

请注意,自数十年来以来,不赞成使用glBegin/glEnd序列进行绘制,并且不固定函数矩阵进行堆栈和固定。 阅读有关Fixed Function Pipeline的信息,并参阅Vertex SpecificationShader了解最新的渲染方式。


无论如何,我建议使用glPushMatrix/glPopMatrix来存储绘制HUD之前的矩阵,并在之后还原它。
因此,您可以在绘制HUD之前通过glLoadIdentity设置单位矩阵。
对于HUD,甚至可以使用完全不同的(平移和缩放)矩阵:

number