這幾篇Android 3D遊戲開發的文章原文出自一位德國人Martin在droidnova.com寫的文章,有lixinso翻譯為中文。
系列的第五部分講如果建立你的第一個完整的3D對象。這個case中是一個4面的金字塔。
為了讓我們接下來的開發更容易,這裡需要做一些準備。
我們必須將計算buffer以及建立數組時的大變得更加動態。
為了更加的動態,我們必須改變一些變數以便我們接下來的工作。讓我們來細看一下:
在第一行你可以看到,我們初始化_nrOfVertices為0,因為我們可以在第七行那裡通過座標的大小來確定它。
我們同時也將_indecesArray改為局部變數indices,並在13行進行了初始化。
這個buffer建立過程被放在了座標、顏色以及頂點數組的下邊,因為buffer大小取決於數組。所以請看17-18行,22-23行,27-28行。在注釋裡面我解釋了計算方法。
主要的好處是,我們可以建立更多的vertices,而不用手動重新計算有多少個vertices,以及數組和buffer的大小。
下一步:你需要明白OpenGL如何繪製並決定我們看到的東西。
相對於OpenGL來說OpenGL ES一個很大的缺點就是除了三角形以外沒有別的圖元類型。我們沒有其它多邊形,所以我們想要建立的所有的對象都必須由三角形構成。我引用一個blog的文章來說明這個問題: IPhone developer ,同時也推薦他的這些文章 OpenGL ES series.
這裡有更多的關於三角形的東西你需要知道。在OpenGL中,有一個概念叫做彎曲(winding),意思是vertices繪製時的順序。與現實世界中的對象不同,OpenGL中的多邊形一般沒有兩個面。他們只有一個面,一般是正面,一個三角形只有當其正面面對觀察者的時候才可以被看到。可以配置OpenGL將一個多邊形作為兩面的,但是預設情況下三角形只有一個可見的面。知道了那邊是多邊形的正面以後,OpenGL就可以少做一半的計算量。如果設定兩面都可視,則需要多的計算。
雖然有時候一個多邊形會獨立地顯示,但是你或許不是非常需要它的背面顯示,經常一個三角形是一個更大的對象的一部分,多邊形的一面將在這個物體的內部,所以永遠也不會被看到。這個沒有被顯示的一面被稱作背面,OpenGl通過繪製的順序來確定那個面是正面哪個是背面。頂點按照逆時針繪製的是正面(預設是這樣,但是可以被改變)。因為OpenGL能很容易地確定哪些三角形對使用者是可視的,它就可以通過使用Backface Culling來避免為那些不顯示在前面的多邊形做無用功。我們將在下一篇文章裡討論視角的問題,但是你現在可以想象它為一個虛擬攝像機,或者通過一個虛擬視窗來觀察OpenGL的世界。
在上面的中,左邊青綠色的的三角形是背面,將不會被繪製,因為它相對於觀察者來說是順時針的。而在右邊的這個三角形是正面,將會被繪製,因為繪製頂點的順序相對於觀察者來說是逆時針的。
因為我們想做的是建立一個漂亮的金字塔,我們首先disable這個glClearColor()。我們可以刪除掉變數_red, _green, _blue,還有方法setColor(). 我們也想改變視角,所以我們將旋轉分的x和y軸上。
為了確保你那裡有了和這邊相同的物件變數,我也將這些都貼到這個類的上邊了。你可以看到我們現在有兩個float變數,_xAngle和_yAngle(15-16行)還有他們的setter和getter方法(28-42行)
現在讓我們實現根據觸控螢幕來計算角度的邏輯,為了做這個,需要先稍稍改變一下VortexView類。
在第3和4行我們有兩個變數給我們的x和y值使用。當移動時,我們在ACTION_DOWN事件中設定他們的值,我們根據MotionEvent來計算當前值和舊的值的差。計算他們的差並加到已經應用的角度上。不要被ydiff 添加到x-angle上或者xdiff添加到y-angle上而迷惑。你可以想象,如果你想x軸的值不變,而進行旋轉,只有在y軸上旋轉。對於y軸也一樣。
如果我們向左或者向上移動手指,xdiff/ydiff的值就會變成負的,旋轉就會向後旋轉。所以在這兩個軸上旋轉都比較容易。
現在到了非常有意思的部分:金字塔。
像上面我們所引用的一樣,winding需要一些設定。有的也許是預設的設定,但是我們還是定義一下,為了安全起見。
在第5行,我們enable了culling面,以保證只有一面。在第7行我們定義了那種順序是前面。GL_CCW表示逆時針。在第9行,我們最終定義了那個面作為culling 面。 沃恩設定其為GL_BACK以保證只顯示正面。這或許有點迷糊偶,你可以看看如果用GL_FRONT_AND_BACK會發生什麼……你將什麼也看不到。
在第四行你可以看到背景色是黑色,因為我們已經刪除了以前設定的動態顏色。在13和14行你可以看到在每個軸的旋轉角度。其它的都和以前講過的一樣。
最後一件事情你需要做的是改變initTriangle()函數中的顏色數組,座標和索引。我們的金子談應該顯示成這樣子的。
正如你在圖上看到的一樣,我們的金字塔有4個角。每個角都有自己的座標,所以我們有4個頂點需要定義。如2-7行。
每一個頂點有自己的顏色,在10-15行定義。
在中間部分給出了定義三角形所需要的索引。時刻記著winding,三角形0,1,3和0,3,1是不一樣的。
每一個索引點指向coords數組中定義的頂點。
編譯運行程式,看一下如果你改變了indices的順序會發生什麼,或者看一下如果你將GL_CCW改成GL_CW以後將會看到什麼。
Eclipse工程的原始碼下載: Vortex Part V