2012-02-18 139 views
2

我使用gluUnProject轉換屏幕座標到世界座標,但很遺憾,我得到一個小的價值作爲回報。它把(0,0)到約(-0.80,0.40),但它應該轉換爲約(4,2)...代碼:gluUnProject的用法

((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]; 

回答

3

gluUnProject需要您希望從窗口座標到世界座標的unproject點的z深度。在你的代碼中,你使用'1'作爲點的深度,這就是爲什麼它給你一個長度約爲1的結果向量。

爲了得到未投影的特定像素的深度,你通常會做這樣的事情:

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

如果再通過對gluUnProject而不是「1」傳遞「Z」值,應該給你正確的世界地位。

+0

那麼,我會測試它。 Btw z應該被定義爲一個緩衝區,並且glUnProject需要z被定義爲float。我如何將緩衝區轉換爲浮點數? – Qualphey 2012-02-20 21:39:19

+0

在Trevor的例子中,'&z' *是一個緩衝區,它只包含一個浮點數。 'GL_DEPTH_COMPONENT'是'glReadPixels()'理解的,只返回1個值。 – Olie 2013-06-06 23:28:24

相關問題