c++ - 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 代码中的某个地方存在错误。也许有人对此有想法。
解决方案
显然,每个像素的视野光线将取决于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 中的固定函数管道始终用于将总变换保持为分解形式ModelView
和Projection
矩阵,这对于任何了解旧gluUnproject
函数的人来说都是可以理解的......
推荐阅读
- reactjs - 是否有适用于 gatsby-image 的良好反应轮播组件?
- c# - 如何从 .dyn 文件中获取底层代码
- python - 在 Python 中将一个数组与自身网格化 n 次
- python - 如何以有效的方式迭代字典的值?
- python - 从匹配索引的字符串中计算单词的实例
- javascript - 有哪些易于使用的资源和/或技术来追踪 Web javascript 错误?
- php - 无法在 SQLite3 模块中加载扩展,PHP
- c - 用 popen 创建的 C 进程不打印它的输出
- java - Futronic指纹读取器FS80H,同一台PC中有2个读取器,如何区分它们
- c# - 查找大于 3X3 C# 的矩阵的行列式