【问题标题】:Using GLSL to determine 3D position from mouse click使用 GLSL 通过鼠标单击确定 3D 位置
【发布时间】:2016-01-17 03:51:01
【问题描述】:

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

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

gl_Position = 投影* 视图 * 模型 * 顶点;

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

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

【问题讨论】:

    标签: opengl 3d glsl


    【解决方案1】:

    读取鼠标指针位置的深度值 (glReadPixels(..., GL_DEPTH,...)) 并将其用于恢复 Z。或者将光线投射到场景结构中。根据您的应用,任何一种都可能是更好的解决方案。

    【讨论】:

    • 据我所知,glReadPixels 返回颜色数据 (RGBA) 而不是 3D 数据 (x,y,z)。这种理解正确吗?
    • @TringVu: glReadPixels 返回 framebuffer 数据。对于深度测试,有一个“深度缓冲区”(GL_DEPTH),它保存一个与原点距离单调的值(透视投影不是线性的)。这与窗口位置一起为您提供了一个 3 向量,可以通过逆变换管道进行反向投影。
    • @TringVu:请注意,您所要求的实际上是“挑选”主题下的常见问题解答:。谷歌“OpenGL 选择 glReadPixels GL_DEPTH”,你会发现很多结果。
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2015-08-01
    相关资源
    最近更新 更多