2016-01-20 2 views
1

J'essaye de récupérer mes coordonnées de souris (dans un QGLWidget par Qt) pour estimer ses coordonnées 2D actuelles dans le monde virtuel (tous mes sommets ont z = 0).De coordonnées de souris aux coordonnées du monde par glUnproject

Pour ce faire, je l'ai écrit ceci:

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) 

Le matModel est toujours la matrice d'identité (numpy.eye (4)), tandis que les matrices matView et matProj sont calculés grâce à la lookat (oeil, cible , up) et perspective (fovy, aspect, near, far) méthodes. La matrice matView est la seule qui change à travers les événements de la souris dans mon application.

Je donne aussi mon vertex shader:

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; 

} 
""" 

Pour tester mon extrait de code, je dessine un carré avec des sommets (-1, -1), (-1,1), (1, -1) et (1,1). Mais quand je déplace ma souris dans un coin, je n'obtiens aucune coordonnée + -1.

Donc, je crois qu'il ya quelque chose de mal dans mon code ...

Répondre

1

J'ai finalement résolu le problème en utilisant ce code:

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