使用GLM unproject将鼠标位置转换为3d坐标

时间:2014-06-02 21:07:18

标签: c++ opengl glfw glew glm-math

我试图在鼠标后面的屏幕上画一个圆锥,使用OpenGL和GLM(也是GLEW和GLFW,但它们对于这个问题的细节并不重要)。

目前,我使用glfwGetCursorPos获取鼠标位置。然后我将它变成一个3向量,将z位置设置为0(出于测试目的,我可能稍后会改变它),并创建一个向量,指定左下角为0,0,宽度和高度为1024和768(这实际上是我创建的窗口的宽度和高度)。然后我将我的模型视图矩阵和投影矩阵传递给glm :: unProject方法,以获得投影的x和y坐标,并更新应该跟踪鼠标的锥体的适当顶点的位置(锥体被重置在每帧之后以0,0,0为中心)。我不使用投影的z坐标,因为使用它会使锥体消失。目前,代码运行良好,因为我将位置增量乘以200,我发现实验上的数字使锥形同步到我的鼠标。我不确定为什么只是添加投影坐标而不必将它们相乘也行不通,但事实并非如此 - 与我移动鼠标的距离相比,锥体的移动速度非常慢/小。我几乎肯定乘以随机数不是正确的方法,并且可能不会是可移植的,因为根据帧速率,窗口大小,操作系统或其他东西,这个数字可能会有所不同。有什么想法吗?

    double xpos, ypos;
    glfwGetCursorPos(window, &xpos, &ypos);

    glm::vec3 pos = glm::vec3(xpos, ypos, 0.0f);
    glm::vec4 viewportdata = glm::vec4(0.0f, 0.0f, 1024.0f, 768.0f);

    glm::vec3 un = glm::unProject(pos, View*Model, Projection, viewportdata);
    float xp = un[0], yp = un[1];

    for (int i = 0; i < 8*9; i++) { // update positions of vertices
        if (i % 3 == 0)
            g_vertex_buffer_data[i+size-8*9] += xp*200;
        else if (i % 3 == 1)
            g_vertex_buffer_data[i+size-8*9] += yp*200;
    }

0 个答案:

没有答案