Opengl 使用GLSL通过鼠标单击确定三维位置

Opengl 使用GLSL通过鼠标单击确定三维位置,opengl,3d,glsl,Opengl,3d,Glsl,我想知道从2D位置获取3D位置的问题。在我的应用程序中,我设置了所有内容(mvp矩阵、鼠标的屏幕位置) 我们通过以下变换从3D转换到2D gl_位置=投影*视图*模型*顶点 然后将这些剪辑坐标除以w到NDC,然后转换为屏幕坐标。我想做相反的(鼠标点击到3D)。NDC的屏幕对于x和y来说很容易。但是z数据丢失了 据我所知,恢复3D数据的唯一方法是使用基于树的空间数据结构的光线投射,可能还有CUDA/OpenCL。但我不确定。还有别的办法吗?如果我们有MVP矩阵和屏幕坐标,是否有恢复3D位置的方法?

我想知道从2D位置获取3D位置的问题。在我的应用程序中,我设置了所有内容(mvp矩阵、鼠标的屏幕位置)

我们通过以下变换从3D转换到2D

gl_位置=投影*视图*模型*顶点

然后将这些剪辑坐标除以w到NDC,然后转换为屏幕坐标。我想做相反的(鼠标点击到3D)。NDC的屏幕对于x和y来说很容易。但是z数据丢失了


据我所知,恢复3D数据的唯一方法是使用基于树的空间数据结构的光线投射,可能还有CUDA/OpenCL。但我不确定。还有别的办法吗?如果我们有MVP矩阵和屏幕坐标,是否有恢复3D位置的方法?

读取鼠标指针位置的deph值(glReadPixels(…,GL_DEPTH,…),并使用该值恢复Z。或者在场景结构中进行光线投射。根据您的应用程序,其中一种可能是更好的解决方案。

正如我所知,glReadPixels返回的是颜色数据(RGBA),而不是3D数据(x、y、z)。这种理解正确吗?@TringVu:glReadPixels返回帧缓冲区数据。对于深度测试,有一个“深度缓冲区”(GL_depth),它保持一个与原点距离单调的值(透视投影不是线性的)。再加上窗口位置,你就可以得到一个3向量,它可以通过反变换管道反向投影。@TringVu:请注意,你所要求的实际上是一个名为“拾取”主题下的常见问题解答:。谷歌搜索“OpenGL拾取GLU深度”,你会发现很多结果。