glm
(同时我也在使用glfw
)来实现此目的。这是我的代码:
static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT) {
if(GLFW_PRESS == action){
int height = 768, width =1024;
double xpos,ypos,zpos;
glfwGetCursorPos(window, &xpos, &ypos);
glReadPixels(xpos, ypos, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zpos);
glm::mat4 m_projection = glm::perspective(glm::radians(45.0f), (float)(1024/768), 0.1f, 1000.0f);
glm::vec3 win(xpos,height - ypos, zpos);
glm::vec4 viewport(0.0f,0.0f,(float)width, (float)height);
glm::vec3 world = glm::unProject(win, mesh.getView() * mesh.getTransform(),m_projection,viewport);
std::cout << "screen " << xpos << " " << ypos << " " << zpos << std::endl;
std::cout << "world " << world.x << " " << world.y << " " << world.z << std::endl;
}
}
}
现在,我有两个问题。第一个问题是,从
glm::unProject
获取的世界向量的x、y和z非常小。如果我使用这些值来平移网格,则网格会发生微小的平移,并且不会跟随鼠标指针移动。第二个问题是,如在glm文档中所述(https://glm.g-truc.net/0.9.8/api/a00169.html#ga82a558de3ce42cbeed0f6ec292a4e1b3),结果以对象坐标返回。因此,为了将屏幕坐标转换为世界坐标,我应该使用来自一个网格的变换矩阵,但是如果我有许多网格并且想要从屏幕坐标转换为世界坐标怎么办?我应该将哪个模型矩阵乘以相机视图矩阵形成ModelView矩阵?
pixel_pos = pixel_pos + glm::vec2(0.5f, 0.5f); // shift to GL's center convention
),然后改变参考系统,最后强制类型转换为整型;这样会导致选取下面的像素。要解决这个问题,应该在 glReadPixels之后,在unproject之前才进行GL中心约定的偏移量移动。 - Tarquiscani[0,h)
窗口空间而不是[0,h-1]
整数像素空间,因此正确的y轴翻转是h-y
而不是h-1-y
。 - derhass