12/11/2011

Android OpenGL : Real 3d graphics

之前學會了使用OpenGL ES 3D圖形庫,但繪製的還是二維圖形(平面上的正方形)。 Mesh(網格,三角面)是構成空間形體的基本元素,前面的正方形也是有兩個Mesh構成的。本篇將介紹使用Mesh構成四面體,椎體等基本空間形體。
Design設計:
在使用OpenGL 框架時一個好的設計原則是使用“Composite Pattern”(複合模式),本篇採用如下設計:


Mesh
首先定義一個基類Mesh,所有空間形體最基本的構成元素為Mesh(三角形網格) ,其基本定義如下: 以下為自己建立的函式

* setVertices 允許子類重新定義頂點坐標。
* setIndices 允許子類重新定義頂點的順序。
* setColor /setColors允許子類重新定義顏色。
* x,y,z 定義了平移變換的參數。
* rx,ry,rz 定義旋轉變換的參數。

做之前先new一個package, 名稱訂為org.itrc.MyOpenGLESTutorial.mesh
image
再加入一個class : Mesh
image
Plane
有了Mesh定義之後,再來構造Plane,plane可以有寬度,高度和深度,寬度定義為沿X軸方向的長度,深度定義為沿Z軸方向長度,高度為Y軸方向。


Segments為形體寬度,高度,深度可以分成的份數。 Segments在構造一個非均勻分佈的Surface特別有用,比如在一個遊戲場景中,構造地貌,使的Z軸的值隨機分佈在-0.1到0.1之間,然後給它渲染好看的材質就可以造成地圖凹凸不平的效果。下圖顯示給予六個Segments:


上面圖形中Segments為一正方形,但在OpenGL中我們需要使用三角形,所有需要將Segments分成兩個三角形。為Plane 定義兩個構造函數:
// Let you decide the size of the plane but still only one segment.
public Plane(float width, float height)
// For alla your settings.
public Plane(float width, float height, int widthSegments, int heightSegments)
比如構造一個1 unit 寬和1 unit高,並分成4個Segments,使用圖形表示如下:


左邊的圖顯示了部分,右邊的圖為需要建立的面(三角形)。
image
Cube
下面來定義一個正方體(Cube),為簡單起見,這個四面體只可以設置寬度,高度,和深度,沒有和Plane一樣提供Segments支持。

image
Group
Group可以用來管理多個空間幾何形體,如果把Mesh比作Android的View ,Group可以看作Android的ViewGroup,Android的View的設計也是採用的“Composite Pattern”。
Group的主要功能是把針對Group的操作(如draw)分發到Group中的每個成員對應的操作(如draw)。
Group定義如下:

image
上面我們定義裡Mesh, Plane, Cube等基本空間幾何形體,對於構造複雜圖形(如人物),可以預先創建一些通用的幾何形體,如果在組合成較複雜的形體。除了上面的基本形體外,可以創建如Cone,Pryamid, Cylinder等基本形體以備後用。

沒有留言:

張貼留言

請留言~一起討論吧~