天天看點

使用OpenGL開發Android應用詳解系列三 注:近三篇轉載中的視錐體部分結合着來看,再參照老羅的3d變換,基本可以初步了解和完成相關視錐體調整。 使用OpenGL開發Android應用詳解系列三

【原創】轉載請注明出處 我一家網 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

繼續閱讀