【问题标题】:Why does glUnProject(...) return -1.0?为什么 glUnProject(...) 返回 -1.0?
【发布时间】:2015-11-11 18:09:26
【问题描述】:

我只是想在 OpenGL 中使用 gluUnproject() 将窗口坐标转换为对象坐标。

我使用以下方法正确捕获了过剩窗口的 X 和 Y 坐标(winX 和 winY):

glutPassiveMotionFunc(mouseMove);

然后我设置 winZ 使用

glReadPixels(int (winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ)

然后我设置 posX、posY 和 posZ(对象坐标)使用

gluUnProject(winX, winY, winZ, modelviewM, projectionM, viewportA, &posX, &posY, &posZ);

来自:

glGetDoublev(GL_MODELVIEW_MATRIX, modelviewM);
glGetDoublev(GL_PROJECTION_MATRIX, projectionM);
glGetIntegerv(GL_VIEWPORT, viewportA);

我不会随时更改任何矩阵值。 问题是 posX、posY 和 posZ 的 gluUnProject 的返回值都是-1.0

另外,我应该说modelviewM和projectionM的值是单位矩阵,viewportA的值是(0,0,1440,720)

有什么想法吗?

【问题讨论】:

  • 欢迎来到 SO!您的 projectionM 应该将平截头体(左、右、上、下、近、远)映射到 [-1,1]x[-1,1]x[-1,1]。现在看看projectionM*world_vector的值域,如果projectionM = diag(1,1,1,1)。您可能还会发现 SongHo's Projection Matrix article 很有用。
  • 感谢您的回答。调试程序,我可以看到我的 projectionM 4x4 矩阵值是单位矩阵。与modelviewM 4x4 矩阵相同。我正在使用 glOrtho() 而不是 glFrustum()。
  • 重点不在于它是平截头体还是立方体;关键是您没有使用单位投影矩阵映射到 [-1,1]x[-1,1]x[-1,1] 。只需阅读我指向您的文章即可。

标签: c++ opengl glut coordinate-transformation


【解决方案1】:

顺便说一句,我相信gluUnProject 函数接受 -1..+1 范围内的值,而不是 0..width 和 0..height。所以,

gluUnProject(
    ((double) winX + 0.5) / (double) width * 2.0 - 1.0,
    ((double) winY + 0.5) / (double) height * 2.0 - 1.0,
    winZ,
    modelviewM,
    projectionM,
    viewportA,
    &posX, &posY, &posZ);

【讨论】:

  • 感谢您的回答。我已经尝试了您的代码,但它仍然无法正常工作。现在 posX、posY 和 posZ 的值分别为 -1.001386...、-1.002770... 和 -1.0。其实我完全不明白你的解释。根据documentationgluUnProject 函数接受 winX 的 (0'0 .. window_width) 和 winY 的 (0'0 .. window_height) 之间的值。无论如何,你能解释一下为什么要对 gluUnProject 的前 2 个参数进行这些操作吗?
【解决方案2】:

问题已解决:我的愚蠢错误是我在 main() 函数中调用了 gluUnProject()。
我在分配 winZ 之后,在 mouseMove() 函数中替换了它。
它有效!
我现在唯一的疑问是为什么 posZ 值没有改变。我正在使用
glReadPixels(int (winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
获取winZ值。

【讨论】:

    猜你喜欢
    • 2019-09-28
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2010-12-19
    相关资源
    最近更新 更多