如何在pyglet / opengl中获得相对于矩阵比例的光标坐标?

时间:2019-01-01 11:29:27

标签: python-3.x opengl pyglet

我正在用pyglet制作2D游戏,并同时使用glTranslatef和glScalef:

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

@window.event
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, 1, 1)

    stars.image.draw()
    for s in game.ships:
        s.draw()

    pyglet.gl.glPushMatrix()
    pyglet.gl.glLoadIdentity()

    #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.glPopMatrix()
    stars.scale = 1

但是我还需要相对于背景的光标坐标。对于运动,我只是将平移添加到x y坐标上,但这仅在不缩放矩阵的情况下有效:

@window.event
def on_mouse_motion(x, y, dx, dy):
    if player.course_setting:
        player.projected_heading = (x - stars.translation[0],y -stars.translation[1])

如何获取光标坐标的比例尺?

1 个答案:

答案 0 :(得分:1)

您必须取消投影指针位置。投影发生如下:

p_eye = M · p
p_clip = P · p_eye

在这一点上,原语已被裁剪,但是我们暂时可以忽略它。修剪后出现均匀的划分,将坐标带入NDC空间,即视口被视为尺寸为[-1,1]×[-1,1]×[0,1]

的长方体。
p_NDC = p_clip / p_clip.w

从那里将其映射到像素尺寸。我将在这里省略此步骤。

取消投影正在反向执行这些操作。但是,关于均匀划分,有一个小技巧。这是一种“反对称”(不是恰当的术语,但它涉及到整个问题)操作,并且在每次投影和非投影的最后都发生。因此,未投影是

p_NDC.w = 1
p_eye' = inv(P)·p_NDC
p' = inv(M)·p_eye'
p = p' / p'.w

为了方便起见,所有这些都已通过GLU(如果您坚持使用固定函数矩阵堆栈)或GLM打包到了unproject函数中,但不是我的 linmath.h