代码之家  ›  专栏  ›  技术社区  ›  floflo29

通过glUnproject从鼠标坐标到世界坐标

  •  1
  • floflo29  · 技术社区  · 9 年前

    我正在尝试检索我的鼠标坐标(在QGLWidget到Qt中),以估计它在虚拟世界中的当前2D坐标(我的所有顶点都有z=0)。

    为此,我写道:

    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(eye,target,up)和perspective(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 回复  |  直到 9 年前
        1
  •  1
  •   floflo29    9 年前

    我最终用以下代码解决了这个问题:

    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