gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:42 30 4
gpt4 key购买 nike

我正在使用 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);
}
}

我收到错误:

LNK2019 unresolved external symbol _gluUnProject@48 referenced in function "void __cdecl mouseButtonCallback(struct GLFWwindow*,int,int,int)" (?mouseButtonCallback@@YAXPAUGLFWwindow@@HHH@Z)

我正在开发 VS2015,这是我的内容:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <math.h>
#include <iostream>
#include <GL/GLU.h>
#include <Windows.h>

值得指出的是,我用NuGet Packages下载的glu库

我将非常感谢所有的帮助和关于如何解决问题的解释。

最佳答案

基本上,您的投影矩阵将从相机/眼睛空间获取顶点到裁剪空间,然后进行透视划分以获得规范化的设备坐标。然后,您提到的使用该窗口变换的任何视口(viewport)都将应用于它以获得屏幕坐标。 gluUnProject 正在以相反的顺序为您执行此操作。所以请放心,它会带来良好的值(value)。

关于c++ - 将鼠标坐标转换为世界空间坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571403/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com