gluUnProject的用法

时间:2012-02-18 16:26:54

标签: java android opengl-es

我正在使用gluUnProject将sreen坐标转换为世界坐标,但不幸的是,我得到了小值作为回报。它将(0,0)转换为大约(-0.80,0.40),但它应该转换为大约(4,2)......代码:

((GL11) gl).glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);  
         ((GL11) gl).glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelViewMatrix, 0);  
         ((GL11) gl).glGetFloatv(GL11.GL_PROJECTION_MATRIX, projectionMatrix, 0); 

         GLU.gluUnProject(main.x, main.y, 1, modelViewMatrix, 0, projectionMatrix, 0, viewport, 0, pointInPlane, 0);

        xWcoord = pointInPlane[0];
        yWcoord = pointInPlane[1];
        zWcoord = pointInPlane[2];

main.x和main.y是屏幕坐标。这是其他变量的定义:

public static int[] viewport = new int[16];  
     public static float[] modelViewMatrix = new float[16];  
     public static float[] projectionMatrix = new float[16];  
     public static float[] pointInPlane = new float[16];  

1 个答案:

答案 0 :(得分:3)

gluUnProject需要您希望从窗口坐标到世界坐标取消投影的点的z深度。在你的代码中,你使用'1'作为点的深度,这就是为什么它给你一个长度约为1的结果向量。

要获得用于取消投影的特定像素的深度,通常会执行以下操作:

float z;
glReadPixels( main.x, main.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z );

如果你然后将'z'值传递给gluUnProject而不是'1',那么这应该会给你正确的世界位置。