我正在使用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];
答案 0 :(得分:3)
gluUnProject需要您希望从窗口坐标到世界坐标取消投影的点的z深度。在你的代码中,你使用'1'作为点的深度,这就是为什么它给你一个长度约为1的结果向量。
要获得用于取消投影的特定像素的深度,通常会执行以下操作:
float z;
glReadPixels( main.x, main.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z );
如果你然后将'z'值传递给gluUnProject而不是'1',那么这应该会给你正确的世界位置。