首页 > 解决方案 > GLM unprojects 返回错误的结果

问题描述

在我的项目中,我使用了一个相当复杂的相机玻璃,它使轨迹球/轨迹球围绕中心旋转。到目前为止效果很好。为了创建 MVP 矩阵,我使用:

// Get a handle for our "MVP" uniform
GLuint MatrixID = glGetUniformLocation(shaderProgram, "MVP");

// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 <-> 100 units
glm::mat4 projection = glm::perspective(glm::radians(45.0f), 4.0f / 3.0f, 0.1f, 50.f);
// Camera matrix
glm::mat4 view = camera->getMatrix();
// Model matrix -> identity matrix (origin)
glm::mat4 model = glm::mat4(1.0f);

// our ModelViewProjection : multiplication of our 3 matrices
glm::mat4 MVP = projection * view * model;

VertexShader 也不足为奇(这里只展示了一部分)v_position = MVP * vec4(vPos,1); 并且到目前为止运行良好。

为了获得鼠标指向的标准化方向,我使用以下代码: direction = glm::normalize( glm::unProject(glm::vec3(mouseX,700 - mouseY, 1), model, projection, glm::vec4(0.0f, 0.0f, 700, 700)));- 这里 700 是屏幕的宽度和高度。

在其他一些时候,我尝试使用 glm intersectRayTriangle 函数进行交叉点测试: glm::intersectRayTriangle(cameraPosition, direction , v0, v1, v2, intersectionPos, dist) 问题是:我没有得到正确的结果,所以我猜 unProject 代码中的某个地方存在错误。也许有人对此有想法。

标签: c++openglglm-math

解决方案


显然,每个像素的视野光线将取决于view矩阵,但在这里:

direction = glm::normalize( glm::unProject(glm::vec3(mouseX,700 - mouseY, 1), model, projection, glm::vec4(0.0f, 0.0f, 700, 700))); 

您根本没有考虑view矩阵。

您需要view * model用作model参数。或者也许只是view如果你想要世界空间坐标。

函数的参数名称glm::unProject实际上在这里具有误导性。让我引用glm 的参考页面

GLM_FUNC_DECL tvec3<T, P> glm::unProject  (   tvec3< T, P > const &   win,
                                              tmat4x4< T, P > const & model,
                                              tmat4x4< T, P > const & proj,
                                              tvec4< U, P > const & viewport) 

使用以下描述(强调我的):

model指定模型视图矩阵

由于 glm 试图模仿旧的遗留 GL 函数,并且 GL 中的固定函数管道始终用于将总变换保持为分解形式ModelViewProjection矩阵,这对于任何了解旧gluUnproject函数的人来说都是可以理解的......


推荐阅读