我正在用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])
如何获取光标坐标的比例尺?
答案 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 。