我只是想使用gluUnproject()将窗口坐标转换为OpenGL中的对象坐标。
我使用以下方法正确捕捉过剩窗口的X和Y坐标(winX和winY):
glutPassiveMotionFunc(mouseMove);
然后我使用
设置winZglReadPixels(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)
有什么想法吗?
答案 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值。