我需要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(非數字)會是這樣的算法問題什麼的上漲
關於你編輯,'winz'必須在[0,1],0代表近平面,1代表遠平面。 –
@Christian Rau你是指0到1之間? – Jack
是的,但包容。 winz必須在[0,1]中,而不是必需的(0,1)。我不確定爲什麼它會失敗,如果winz離裁剪面太近? –