【发布时间】: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