为什么gluUnProject()似乎没有表现?

时间:2011-04-06 13:04:22

标签: java opengl

我试图在平坦的3D表面上找到鼠标的坐标。在谷歌搜索了一下后,我发现你使用gluUnProject这样做了。所以,我实现了这一点。这是我的代码(当拿走那些不感兴趣的部分时):

public class Input {
private FloatBuffer modelView = BufferUtils.createFloatBuffer(16);
private FloatBuffer projection = BufferUtils.createFloatBuffer(16);
private IntBuffer viewport = BufferUtils.createIntBuffer(16);
private FloatBuffer location = BufferUtils.createFloatBuffer(3);
private FloatBuffer winZ = BufferUtils.createFloatBuffer(1);

public float[] getMapCoords(int x, int y)
{
    modelView.clear().rewind();
    projection.clear().rewind();
    viewport.clear().rewind();
    location.clear().rewind();
    winZ.clear().rewind();

    glGetFloat(GL_MODELVIEW_MATRIX, modelView);
    glGetFloat(GL_PROJECTION_MATRIX, projection);
    glGetInteger(GL_VIEWPORT, viewport);

    float winX = (float)x;
    float winY = (float)viewport.get(3) - (float)y;

    glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ);
    gluUnProject(winX, winY, winZ.get(0), modelView, projection, viewport, location);
    return new float[] {location.get(0), location.get(1), location.get(2)};
}
}

当我调用这个函数时,传入鼠标的X和Y坐标,我得到的一些数字对于我用鼠标移动的每个像素都会增加100(它应该在1左右)。在从各种变量进行一些打印之后,我发现winZ缓冲区包含值1.0。我的gluPerspective是以这样的方式设置的,即它的近剪切点为0.1,远点为10000,这可以解释为什么数字迅速增加。然而,我不知道如何强迫openGl使用我的平面而不是找到这个距离。

所以现在我在想;如果这是在3D世界中在表面上找到鼠标坐标的正确/最佳/最简单的方法,那么我可能做错了什么?如果不是,那么更好的方法是什么?

1 个答案:

答案 0 :(得分:0)

是的,这是正确的使用方法。您可能只是在矩阵不包含“良好值”的位置调用它(可能是由代码中的glPush / PopMatrix()函数引起的)。

要确认您获得了良好的坐标,请在获得坐标后绘制单个GL_POINT(禁用深度测试并将点大小增加到10像素)。如果点在鼠标下移动,则计算出的坐标是正确的,但矩阵不是。