2012-03-28 53 views
1

設置我的場景(Android應用的OpenGL ES)是這樣的:OpenGL的:gluUnProject返回錯誤的座標

GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f); 
// ... 
GLU.gluLookAt(gl, cameraX, cameraY, cameraZ, cameraX, cameraY, cameraZ - 1f, 0f, 1f, 0f); 
// Scene scaled down because object positions are in [-10000..10000] for x & y 
gl.glScalef(0.001f, 0.001f, 1.0f); 

渲染場景很好,它包含四邊形在z = -10和一個巨大的背景四在z = -30。現在我想實現射線採摘,像這樣(摘自this thread

public float[] unproject(float rx, float ry, float rz) { 
    float[] xyzw = {0, 0, 0, 0}; 
    int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight}; 
    android.opengl.GLU.gluUnProject(rx, ry, rz, mMatrixGrabber.mModelView, 0, mMatrixGrabber.mProjection, 0, viewport, 0, xyzw, 0); 
    xyzw[0] /= xyzw[3]; 
    xyzw[1] /= xyzw[3]; 
    xyzw[2] /= xyzw[3]; 
    xyzw[3] = 1; 
    return xyzw; 
} 

分流到屏幕上,然後測試了這種方式:

unproject(tapX, mDisplayHeight - tapY, BACKGROUND_Z); 

預期的行爲:返回的X,Y座標類似於點擊深度= -30(BACKGROUND_Z)

它實際上做了什麼:在屏幕中心點擊時返回正確的X,Y座標;但屏幕中心和點擊點之間的距離沒有被正確解釋 - 似乎被縮放d擁有某種因素。例如。點擊屏幕中心給出[0,0],點擊左邊屏幕邊緣應該給〜[-3600,0],而是給出[-1.13,0]。平移視圖,以便先前觸摸的點在屏幕中心給出〜[-3600,0],因爲它應該。

這可能是由於場景縮放0.001?我已經測試各種配置(gluLookAt之前移動縮放,或完全去除),但問題仍然存在:(在左屏幕邊緣觸摸


採樣數據輸出:

觸摸點傳遞給unproject():

x=3, y = 554 (0,0 at bottom left; w=720, h=1280) 

投影矩陣:

[2.8482616, 0.0,  0.0,   0.0, 
0.0,  1.7320509, 0.0,   0.0, 
0.0,  0.0,  -1.0001999, -1.0, 
0.0,  0.0,  -0.20001999, 0.0] 

模型矩陣:

[0.0010, 0.0, 0.0, 0.0, 
0.0, 0.0010, 0.0, 0.0, 
0.0, 0.0, 1.0, 0.0, 
0.0, 0.0, 1.0, 1.0] 

unproject()輸出:

什麼我想到這裏,返回Z值似乎是錯的 - 傳遞到unproject Z值()是-30(如上所述)。

+0

請問[MatrixGrabber](http://developer.android。COM /資源/樣品/ ApiDemos/SRC/COM /示例/機器人的/ apis /圖形/ spritetext/MatrixGrabber.html)包含正確的矩陣?視口是否正確?儘管齊次座標被用於模型座標,但看起來很奇怪。 – 2012-03-28 16:06:56

+0

My MatrixGrabber具有有效的矩陣 - 不知道它們是否正常。視口總是[0,0,w,h]。你能給我一個關於同質 - >模型座標的提示嗎? – manmal 2012-03-28 18:06:05

+0

不,這沒關係。投影部分來自投影矩陣,所有其他仿射矩陣都是由s.t.構成的。這些部分是通過的。我的猜測是,這個縮放比例在抓取者的'mModelView'中不存在。對於在你的例子中給出的矩陣操縱調用,你能顯示兩個抓取矩陣,和'gluyProject'後面的'xyzw'輸出嗎? – 2012-03-29 00:26:35

回答

5

讓我們來看看 - 我無法重現您獲得的值,但我認爲這並不重要。

您不得撥打unproject,其z值不在[-1;+1]之內。 unproject必須做的第一件事是反轉窗口轉換,之後,座標必須位於NDC空間中。在OpenGL中,這是立方體[-1;+1]^3songho包含一些漂亮的圖形)。撥打unproject-30表示該點必須在近平面之前。用z=-1.0f調用它會產生近平面,在遠平面產生z=+1.0f

如何選擇z s.t.畢竟矩陣倒置,z=-30成立 - 我不知道。

+0

人的樣本值,你是我的英雄,完全救了我的天/周!將winz設置爲-1會給出-1.05的z值,並且1的winz會給出-1001.5的z值(以及相應的x,y值)。考慮到這兩點,我可以計算出射線並與我的四邊形相交。非常感謝! – manmal 2012-03-29 19:00:26

+1

很高興聽到!我(以前)喜歡這種類型的數學,甚至通過[吉姆·布林的(http://en.wikipedia.org/wiki/Jim_Blinn)的文章和書籍涉水。如果你認爲你知道的東西,他會扭曲它;) – 2012-03-30 03:30:08