C++ 将鼠标坐标转换为世界空间坐标

C++ 将鼠标坐标转换为世界空间坐标,c++,opengl,glfw,C++,Opengl,Glfw,我正在使用GLFW,我想通过鼠标在窗口上的坐标来获取世界空间坐标,以便在选定位置单击时绘制对象。首先,我试图只使用矩阵变换得到这个坐标,但结果我没有得到任何有意义的东西 glfwGetCursorPos(window, &xPos, &yPos); mat4 inverse_projection = glm::inverse(projection); mat4 inverse_view = glm::inverse(view); GLdouble normalized_coor

我正在使用GLFW,我想通过鼠标在窗口上的坐标来获取世界空间坐标,以便在选定位置单击时绘制对象。首先,我试图只使用矩阵变换得到这个坐标,但结果我没有得到任何有意义的东西

glfwGetCursorPos(window, &xPos, &yPos);
mat4 inverse_projection = glm::inverse(projection);
mat4 inverse_view = glm::inverse(view);

GLdouble normalized_coord2D_x = (2.0 * xPos / -1.0),
    normalized_coord2D_y = (2.0 * yPos / -1.0);

vec4 worldCoordNear;
vec4 worldCoordFar;

vec4 normalizedCoordNear = vec4(normalized_coord2D_x, normalized_coord2D_y, -1.0, 1.0);
vec4 clipCoordNear = normalizedCoordNear;
vec4 eyeCoordNear = inverse_projection * clipCoordNear;
worldCoordNear /= worldCoordNear.w;

vec4 normalizedCoordFar = vec4(normalized_coord2D_x, normalized_coord2D_y, 1.0, 1.0);
vec4 clipCoordFar = normalizedCoordFar;
vec4 eyeCoordFar = inverse_projection * clipCoordFar;
worldCoordFar = inverse_view * eyeCoordFar;
worldCoordFar /= worldCoordFar.w;
现在我放弃了这个解决方案,尝试在简单的2D场景中使用gluUnProject解决问题,我的函数如下所示:

void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods)
{
    if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
    std::cout << "Left button pressed" << std::endl;

    GLdouble xPos, yPos;
    glfwGetCursorPos(window, &xPos, &yPos);

    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16];
    GLfloat winX, winY, winZ;
    GLdouble posX, posY, posZ;

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
    glGetDoublev(GL_PROJECTION_MATRIX, projection);
    glGetIntegerv(GL_VIEWPORT, viewport);

    winX = (float)xPos;
    winY = (float)viewport[3] - (float)yPos;
    glReadPixels(xPos, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

    gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
    }
}
void mouseButtonCallback(GLFWwindow*窗口、int按钮、int操作、int mods)
{
如果(按钮==GLFW\u鼠标按钮\u左&&action==GLFW\u按下){

std::cout基本上,你的投影矩阵将顶点从相机/眼睛空间移到剪辑空间,然后进行透视分割以获得标准化的设备坐标。然后,你提到的任何使用窗口变换的视口都将应用到它上以获得屏幕坐标。GlunProject是按相反的顺序为你做的。所以休息吧基本上,你的投影矩阵将从相机/眼睛空间取顶点到剪辑空间,然后进行透视分割以获得标准化的设备坐标。然后,你提到的任何使用窗口变换的视口都将应用于它以获得屏幕坐标。GlunProject正在做这项工作n相反的顺序。所以请放心,它会提供好的值。

只是指出明显的问题。但是,由于这是一个链接器问题,您确定您正在链接并提供lib文件的正确路径吗?我在哪里可以找到glu32.lib?因为我找不到它,而且我看到gluUnProject需要glu32.lib,我只链接了opengl32.lib,glew32.lib,glfw3.libOk,我解决了这个问题,但是现在的问题是,如果我使用透视,GlunProject会返回好的值吗?只是指出明显的问题。但是由于这是一个链接器问题,你确定你正在链接并提供lib文件的正确路径吗?那么我在哪里可以找到glu32.lib?因为我找不到它,我看到GlunProject需要Glu32.lib,我只链接了opengl32.lib、glew32.lib、glfw3.libOk,我解决了这个问题,但现在的问题是,如果我使用透视,glunproject会返回好的值吗?
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <math.h>
#include <iostream>
#include <GL/GLU.h>
#include <Windows.h>