glm::unProject将鼠标位置转换为3个坐标
glm::unProject to convert mouse position to 3 coordinates
我使用OpenGL 3.2+GLM进行矩阵运算。以下是我的代码:
GLint viewport[4];
GLfloat winZ;
glGetIntegerv(GL_VIEWPORT,viewport);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);
glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&winZ);
glBindFramebuffer(GL_FRAMEBUFFER,0);
glm::vec3 screen=glm::vec3(x,viewport[3]-y,winZ);
glm::mat4 view=glm::lookAt(glm::vec3(camera.x,camera.y,camera.z),glm::vec3(0,0,0),glm::vec3(0,1,0));
glm::mat4 projection=glm::perspective(90.0f,(float)viewport[2]/(float)viewport[3],10.0f,500.0f);
glm::vec3 pos=glm::unProject(screen,view,projection,glm::vec4(0,0,viewport[2],viewport[3]));
return {pos.x,pos.y,pos.z};
winZ
正确。当我点击关闭模型时,它是1.0(zfar(,当我点击模型时,看起来与我期望的相似。然而,返回的值pos.z
不是我期望的。当鼠标在背景上时:如果它朝着中心,pos.z
会变小,而当它在屏幕边缘时,pos.z
会变小。有人能解释一下吗?
我遇到的实际问题是pos.x
和pos.y
没有返回我所期望的以太。我的模型有4.88个单位宽,但unProject
说它大约有20个单位宽?(如果我将悬停在左侧和右侧的值相加(。
哦,屏幕中心是0,0,正如预期的那样。
编辑:我还应该注意,返回的pos.z
取决于鼠标从屏幕中心的位置。当它位于模型顶部时,它确实会变为一个更高的数字。如果光标的Y位置在屏幕中心上方,则pos.z
为正。如果Y-pos低于,则pos.z
为负值。看起来真的很奇怪。
愚蠢的问题。unProject应该采用二维视图矩阵,而不是三维视图矩阵。问题解决了。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 比较两个节点坐标的最佳方法是什么?
- 最小二乘多项式拟合仅适用于偶数个坐标
- 从 3 个视点在 3 张图像上有 3 个点如何在 3D 空间中获取其坐标?
- 两个'rare'矩阵的总和,读取为坐标 X、坐标 Y 和一个值
- 如何使用 std::multimap 将整数键映射到两个用作多维数组坐标的整数值(对于井字)?
- 给定许多垂直或水平段及其终点的坐标(x1,x2,y1,y2),我们有多少个相交
- 如何计算有多少个带有坐标 (x;y) 的点在圆圈内/圈上/圈外
- 如何实现 std::map::查找包含两个结构'Pos'结构的比较逻辑,每个结构包含 x 和 y 坐标
- 输入坐标分为与文件故障的两个单独的数组
- C++:在 2D 数组中的 2 个坐标之间"Distance"
- 如何区分具有对象坐标的两个图像
- 在8个谜题|C++中寻找曼哈顿距离的目标坐标
- 我想使用C++映射,以存储一个矩形id的4个坐标,任何人都可以举一个例子吗
- 游戏 - 计算两个坐标之间的距离
- 使用c++从.txt中读取第三个坐标
- 匹配以空格分隔的多个坐标的正则表达式
- glm::unProject将鼠标位置转换为3个坐标