2015-10-07 90 views
0

我正在嘗試爲我的Android應用程序製作2D圖形,它由六個薄矩形組成,每個佔用大約屏幕寬度的1/6,並等於屏幕高度。我不確定正確的方法來確定屏幕上x和y OpenGL座標平面的邊界。最終,我需要編寫邏輯來測試觸摸事件發生在6個矩形中的哪一個,所以我一直試圖通過將OpenGL的座標平面重新映射到設備的屏幕座標平面(其中原點(0,0)是。在查找/重新映射OpenGL ES座標平面的邊界

的屏幕,而不是中間的左上角我宣佈參加六個矩形一個像這樣:

private float vertices1[] = { 
      2.0f, 10.0f, 0.0f, // 0, Top Left 
      2.0f, -1.0f, 0.0f, // 1, Bottom Left 
      4.0f, -1.0f, 0.0f, // 2, Bottom Right 
      4.0f, 10.0f, 0.0f, // 3, Top Right 
    }; 

但因爲我不知道在可見範圍是在x和y什麼(在OpenGL座標系統中)我沒有具體的方法來知道我的矩形需要實例化哪些頂點以佔據顯示器的六分之一,那麼理想的方法是什麼?

我已經試過的方法,如using glOrthoof()重新映射OpenGL的座標轉換成易於使用設備屏幕的工作座標:

gl.glViewport(0, 0, width, height); 
// Select the projection matrix 
gl.glMatrixMode(GL10.GL_PROJECTION); 
// Reset the projection matrix 
gl.glLoadIdentity(); 
// Calculate the aspect ratio of the window 
GLU.gluPerspective(gl, 45.0f,(float) width/(float) height,0.1f, 100.0f); 
gl.glOrthof(0.0f,width,height, 0.0f, -1.0f, 5.0f); 
// Select the modelview matrix 
gl.glMatrixMode(GL10.GL_MODELVIEW); 
// Reset the modelview matrix 
gl.glLoadIdentity(); 

但是當我做我的矩形自敗完全。

回答

2

您當然不希望爲2D圖形使用透視投影。這只是沒有多大意義。透視投影適用於...創建透視投影,只有在您的對象實際放置在3D空間中時纔有用。

更糟的是,你有兩個呼叫建立立體矩陣:

GLU.gluPerspective(gl, 45.0f,(float) width/(float) height,0.1f, 100.0f); 
gl.glOrthof(0.0f,width,height, 0.0f, -1.0f, 5.0f); 

雖然這是合法的,它很少是有道理的。如果你這樣做,實質上發生的是兩個預測​​都是連續應用的。所以首先要做的就是擺脫gluPerspective()電話。

要放置6個矩形,您有幾個選項。幾乎最簡單的一個是根本不應用任何轉換。這意味着您將在標準化設備座標(又名NDC)中指定您的輸入座標,在x和y方向上的範圍均爲[-1.0,1.0]。因此,對於並排渲染的6個矩形,您可以對所有矩形使用[-1.0,1.0]的y範圍,對於第一個,[-2.0]的x範圍爲[-1.0,-2.0/3.0] /3.0,-1.0/3.0]等。

另一種選擇是,您使用的正交投影,使指定矩形更方便。例如,範圍[0.0,6.0]爲x和[0.0,1.0]的用於Y將使它特別容易:

gl.glOrthof(0.0f, 6.0f, 0.0f, 1.0f, -1.0f, 1.0f); 

然後,所有矩形具有的[0.0,1.0]的y範圍內,第一個矩形的x範圍爲[0.0,1.0],第二個矩形[1.0,2.0]等

順便說一句,如果你剛開始使用OpenGL,我會傳遞ES 1.x,並且直接學習ES 2.0。此時ES 1.x是一個傳統的API,我不會將它用於任何新的開發。

+0

感謝您的回覆!我目前正在切換到GLES 2.0;您列出的兩種解決方案對於GLES 2.0的工作方式是否相同? – Cody