【原創】轉載請注明出處 我一家網 http://www.5yijia.com
前面兩節主要介紹了一下OpenGL的基本概念,以及在Android開發中引入OpenGL時,Android項目的基本構成情況。這一節開始,我們通過具體的執行個體,來進行簡單3D圖形的描畫。
在進行繪制立體圖形之前,我們先來了解一些相關術語,如果這些概念了解透徹的話,對Android中使用OpenGL開發很有幫助。
1. 相關術語了解
這裡的術語包括: 坐标系,視錐體(frustum)和視窗(viewport)
(1)坐标系
為了制定三維空間内物體的位置,需要引入坐标系。下面是OpenGL的三維坐标系(注:和DirectX完全相反)
<a target="_blank" href="http://www.5yijia.com/wp-content/uploads/2013/05/20081217173850.png"></a>
通過坐标系我們可以定義實際的物體,但是物體定義好了以後應該放在什麼位置,接下來就是frustum來定義了.
2. 視錐體(frustum)
或者叫做視景,他主要用來定義物體可以表示的空間領域。
視錐體的視線方向是 -Z方向,也就是說,他是坐标軸中Z軸的反方向。請看下圖:
<a target="_blank" href="http://www.5yijia.com/wp-content/uploads/2013/05/android-frustum.png"></a>
通過從-Z方向作為視點來檢視的話,視角(看的角度)與離得較近的切面,以及較遠切面之間是成比例關系的.
(3)視窗(viewport)
上面圖中那個藍色的切面就是viewport,OpenGL中經常叫的視窗(viewport)。
2.OpenGL開發中使用視窗和視錐體
glViewport用來指定從标準裝置的Window坐标的轉換矩陣。矩陣變換主要指的是放大,縮小,旋轉,截斷,平行移動,線性變換的組合操作。
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)為其函數原型。
參數說明:
x,y 以像素為機關,指定了視窗的左下角位置。
width,height 表示這個視窗矩形的寬度和高度,根據視窗的實時變化重繪視窗。
<a target="_blank" href="http://www.5yijia.com/wp-content/uploads/2013/05/android-opengl-affine.png"></a>
上面那個笑臉圖像就是以左邊圖形的左下角的(x,y)坐标來投影右邊圖像的寬和高(width,height)。由于左邊和右邊的裝置類别不同,導緻投影後的圖像變形了。為了防止變形,我們需要通過視錐體(frustum)的寬高比(aspect ratio),來讓實際的裝置保持和原有裝置同樣的比例。
在上面章節中講過,裝置大小或者縱橫的方向改變時,會調用onSurfaceChanged方法,為了防止變形,我們可以通過下面的代碼來控制.
如果是直接繪制圖形的話,opengl是沒有空間的位置觀念的,因為它根本不能分辨物體的前後關系。是以為了讓OpenGL有前後位置的概念,我們需要使用深度緩沖區。
下面的代碼設定Depth Test有效。
3. 正方體的定義
接下來我們來定義一個正方體
上面的類定義了一個以螢幕中心為正方形原點,邊長為1的正方體。
4. 渲染正方體
接下來我們在onDrawFrame函數中渲染剛才我們定義的正方體。
OK,正方體渲染完成後,運作我們的應用,效果圖如下:
<a target="_blank" href="http://www.5yijia.com/wp-content/uploads/2013/05/OpenGL_cube1.png"></a>
我們發現運作的效果并不是立方體,而是一個正方形。原因是我們沒有旋轉立方體的緣故,是以看上去就像一個正方形。加上下面的代碼再看一下效果。
運作後效果如下:
<a target="_blank" href="http://www.5yijia.com/wp-content/uploads/2013/05/OpenGL_Cube2.png"></a>
終于看到立體效果了。
轉自:http://www.5yijia.com/?p=95