Coordinate System坐標系
OpenGL使用了右手坐標系統,右手坐標系判斷方法:在空間直角坐標系中,讓右手拇指指向x軸的正方向,食指指向y軸的正方向,如果中指能指向z軸的正方向,則稱這個坐標係為右手直角坐標系。
Translate平移變換
方法public abstract void glTranslatef (float x, float y, float z) 用於坐標平移變換。
在上個例子中我們把需要顯示的正方形後移了4個單位,就是使用的坐標的平移變換,可以進行多次平移變換,其結果為多個平移矩陣的累計結果,矩陣的順序不重要,可以互換。
Rotate旋轉
方法public abstract void glRotatef(float angle, float x, float y, float z)用來實現選擇坐標變換,單位為角度。 (x,y,z)定義旋轉的參照矢量方向。多次旋轉的順序非常重要。
比如你選擇一個骰子,首先按下列順序選擇3次:
gl.glRotatef(90f, 1.0f, 0.0f, 0.0f); // x 方向旋轉
gl.glRotatef(90f, 0.0f, 1.0f, 0.0f); // y 方向旋轉
gl.glRotatef(90f, 0.0f, 0.0f, 1.0f); // z 方向旋轉
然後打算逆向旋轉回原先的初始狀態,需要有如下旋轉:
gl.glRotatef(90f, -1.0f, 0.0f, 0.0f);
gl.glRotatef(90f, 0.0f, -1.0f, 0.0f);
gl.glRotatef(90f, 0.0f, 0.0f, -1.0f);
旋轉變換glRotatef(angle, -x, -y, -z) 和glRotatef(-angle, x, y, z)是等價的,但選擇變換的順序直接影響最終坐標變換的結果。角度為正時表示逆時針方向。
Translate & Rotate (平移和旋轉組合變換)
在對Mesh(網格,構成三維形體的基本單位)同時進行平移和選擇變換時,坐標變換的順序也直接影響最終的結果。
比如:先平移後旋轉, 旋轉的中心為平移後的坐標。
先選擇後平移: 平移在則相對於旋轉後的坐標系:
一個基本原則是,坐標變換都是相對於變換的Mesh本身的坐標係而進行的。
Scale(縮放)
方法public abstract void glScalef (float x, float y, float z)用於縮放變換。
下圖為使用gl.glScalef(2f, 2f, 2f) 變換後的基本,相當於把每個坐標值都乘以2.
矩陣操作,單位矩陣
在進行平移,旋轉,縮放變換時,所有的變換都是針對當前的矩陣(與當前矩陣相乘),如果需要將當前矩陣回复最初的無變換的矩陣,可以使用單位矩陣(無平移,縮放,旋轉)。
public abstract void glLoadIdentity()。
保存當前矩陣
public abstract void glPushMatrix()
和恢復以前儲存陣列
public abstract void glPopMatrix()。
下列為利用上面的方式,建立三個大小不同且位置不同的方形矩陣
OpenGLRenderer.java 加入程式
執行結果如下:
沒有留言:
張貼留言
請留言~一起討論吧~