2016-01-20 164 views
1

我想通過QT檢索我的鼠標座標(在QGLWidget中)來估計它在虛擬世界中的當前2D座標(我所有的頂點都有z = 0)。從鼠標座標到世界座標通過glUnproject

爲此,我寫這樣的:

modelViewMatrix = np.asarray(matView*matModel) 
     viewport = glGetIntegerv(GL_VIEWPORT) 

     z = 0 

     x, y, z = GLU.gluUnProject(float(self.mouseX), float(self.mouseY), float(z), model = modelViewMatrix, 
          proj = np.asarray(matProj), view = viewport) 

的matModel始終是單位矩陣(numpy.eye(4)),同時matView和matProj矩陣計算得益於LOOKAT(眼睛,目標,up)和透視(fovy,aspect,near,far)方法。 matView矩陣是唯一一個通過我的應用程序中的鼠標事件進行更改的矩陣。

我也提供我的頂點着色器:

VERTEX_SHADER = """ 
#version 440 core 

uniform float scale; 
uniform mat4 Model; 
uniform mat4 View; 
uniform mat4 Projection; 

in vec2 position; 
in vec4 color;  

out vec4 v_color; 


void main() 
{ 
    gl_Position = Projection*View*Model*vec4(scale*position, 0.0, 1.0); 
    v_color = color; 

} 
""" 

爲了測試我的代碼片段,我繪製頂點的正方形(-1,-1),(1,1),(1,-1 )和(1,1)。但是當我將鼠標移動到一個角落時,我沒有獲得任何+1座標。

所以,我想有一些錯誤在我的代碼...

回答

1

我終於使用此代碼解決了這個問題:

depth = glReadPixels(self.mouseX, self.height()-self.mouseY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT) 
z = 2*depth -1 

mouseWorld = (self.viewport*self.matProj*self.matView*self.matModel).I*np.matrix([[self.mouseX, self.mouseY, z, 1]]).T