JOGL - glu.gluUnProject总是返回0.0

时间:2009-11-13 21:44:48

标签: java opengl jogl

我正在尝试研究如何从JOGL获取世界坐标 - 目前它无论我在哪里点击都只返回x = 0.0,y = 0.0和z = 0.0。我做错了什么?

 public double[] getMousePosition(int x, int y){

    int viewport[] = new int[4];
    double modelview[] = new double[16];
    double projection[] = new double[16];
    float winX, winY, winZ;
    float posX, posY, posZ;
    double wcoord[] = new double[4];

    gl.glGetDoublev( GL2.GL_MODELVIEW_MATRIX, modelview, 0 );
    gl.glGetDoublev( GL2.GL_PROJECTION_MATRIX, projection, 0 );
    gl.glGetIntegerv( GL2.GL_VIEWPORT, viewport, 0 );

    winX = (float)x;
    winY = (float)viewport[3] - (float)y;

    float[] depth = new float[1];
    // gl.glReadPixels(winX, winY, 1, 1, gl.GL_DEPTH_COMPONENT, GL2.GL_FLOAT, depth);

    boolean test =  glu.gluUnProject( winX, winY, 0.0, modelview, 0, projection, 0, viewport, 0, wcoord, 0);

    System.out.println("x: " + wcoord[0] +"y: "+wcoord[1]+" worked? "+test);
    System.out.println(modelview[0]);
    return wcoord;
}

编辑::忘了提到我注意到glu.gluUnproject返回一个布尔值,所以我将它分配给一个名为test的布尔值,返回false。

EDIT2 ::我添加了另一个调试语句--System.out.println(modelview [0]);并且还返回0.0

感谢您的帮助

詹姆斯

3 个答案:

答案 0 :(得分:0)

一个可能的原因:你同时抓住模型视图矩阵和投影矩阵?..

gluUnProject()按照预期在我这边工作,这就是我正在做的事情:

1)仅在更新视口尺寸和/或“相机”时:抓住视口和投影矩阵。
I.E.你应该在gl.glMatrixMode(GL.GL_PROJECTION)

之后

2)每个“框架”:抓住模型视图矩阵 I.E.你应该在gl.glMatrixMode(GL.GL_MODELVIEW)

之后

3)然后只:将3数组传递给gluUnProject()...

答案 1 :(得分:0)

如果您要查找的3D点远远落后于近剪裁平面(通常也位于卡马拉位置后面),则

gluUnproject()将始终为窗口坐标返回TRUE和(0,0,0)。在查询矩阵和视口信息后,您可能需要手动进行计算。

答案 2 :(得分:0)

我终于找到了发生这种情况的原因,事实证明我是在拉gl.glGetIntegerv(GL2.GL_VIEWPORT,viewport,0);在此之前的方法中。似乎如果你这样做,下一个调用它的方法将只返回一组零!

感谢您的建议