2011-08-31 80 views
2

我需要gluUnProject將屏幕座標轉換爲世界座標,現在我只是想讓它工作。當我的應用程序運行時,它準確告訴我屏幕上的座標,我知道它存儲在我的渲染器線程中,然後抽出屏幕座標。不幸的是,屏幕座標似乎沒有世界座標的影響,世界座標保持爲零。gluUnProject總是返回零

這裏是我的gluUnProject方法

public void vector3 (GL11 gl){ 

     int[] viewport = new int[4]; 
     float[] modelview = new float[16]; 
     float[] projection = new float[16]; 
     float winx, winy, winz; 
     float[] newcoords = new float[4]; 

     gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0); 
     ((GL11) gl).glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0); 
     ((GL11) gl).glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0); 

     winx = (float)setx; 
     winy = (float)viewport[3] - sety; 
     winz = 0; 

     GLU.gluUnProject(setx, (float)viewport[3] - sety, 0, modelview, 0, projection, 0, viewport, 0, newcoords, 0); 
     posx = (int)newcoords[0]; 
     posy = (int)newcoords[1]; 
     posz = (int)newcoords[2]; 



     Log.d(TAG, "x= " + String.valueOf(posx)); 
     Log.d(TAG, "y= " + String.valueOf(posy)); 
     Log.d(TAG, "z= " + String.valueOf(posz)); 
     } 

現在我已經搜查,發現this forum post,他們得出的結論,這是用的,而不是getDoublev getFloatv做,但getDoublev似乎不支持通過GL11

The method glGetDoublev(int, float[], int) is undefined for the type GL11 

The method glGetDoublev(int, double[], int) is undefined for the type GL11 

應該在雙和浮動的事情不管,如果讓我怎麼去用雙打

謝謝

編輯:

有人告訴我,gluUnproject時太靠近近遠剪裁失敗所以我把winz設置爲-5時,接近0和遠-10。這對輸出沒有影響。

我也記錄了newcoords的每一部分[]數組,他們都返回的東西是NaN(非數字)會是這樣的算法問題什麼的上漲

+0

關於你編輯,'winz'必須在[0,1],0代表近平面,1代表遠平面。 –

+0

@Christian Rau你是指0到1之間? – Jack

+0

是的,但包容。 winz必須在[0,1]中,而不是必需的(0,1)。我不確定爲什麼它會失敗,如果winz離裁剪面太近? –

回答

1

我猜你」重新在模擬器上工作?它的OpenGL實現相當越野車,和測試後,我發現,它返回全零以下電話:

gl11.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0); 
gl11.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0); 
gl11.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0); 

gluUnProject()函數需要計算組合模型視圖投影矩陣求逆,並且由於這些都是零,反相不存在,並將由NaN組成。由此產生的newcoords矢量因此也​​是所有的Nans。

在適當的OpenGL實現的設備上嘗試它,它應該工作。請記住仍然除以newcoords[3]雖然;-)

+0

Unfortunatley我正在一個真正的2.2設備=/LG Optimus黑色 – Jack

+0

對不起,你回答我的問題已經有一段時間了,但我只是想。我使用的是opengl 1.0,但我的手機運行2.0並不意味着代碼運行在手機的某種模擬器上。也許這就是爲什麼我會得到零,因爲它實際上就像你說的那樣在模擬器中運行。 – Jack

+0

我不希望這樣做,通常ES1.1的功能是建立在驅動程序的2.0實現之上的。您可以通過查看glGetString()返回的GL_VERSION,GL_RENDERER和GL_VENDOR來輕鬆檢查您使用的實現。 – svdree