为什么glUnProject(...)返回-1.0?

时间:2015-11-11 18:09:27

标签: c++ opengl glut coordinate-transformation

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

我使用以下方法正确捕捉过剩窗口的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)

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

Offhand,我相信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);

答案 1 :(得分:0)

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