[翻譯]Android 3D 遊戲開發教程– Part V

來源:互聯網
上載者:User

這幾篇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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.