1. 程式人生 > >Android OpenGLES2.0(十)——OpenGL中的平移、旋轉、縮放

Android OpenGLES2.0(十)——OpenGL中的平移、旋轉、縮放

在前面的部落格中,所有的例子都是一個物件,類似繪製圓錐繪製圓柱,我們都是傳入一個引數,然後去控制那個圓面的位置,如果我們要繪製幾個個正方形,它的位置、大小、方向都是不相同的,按照那種方式該多麻煩啊。所以我們需要更好的辦法——矩陣變換。

什麼是矩陣

其實在之前的部落格中,我們也基本都用到了矩陣,投影的設定,就是根據引數生成一個4*4的矩陣,我們用長度為16的浮點型陣列來儲存,相機的設定也是如此。那麼矩陣到底該怎麼定義?

矩陣(Matrix)是一個按照長方陣列排列的複數或實數集合,最早來自於方程組的係數及常數所構成的方陣。在物理學中,矩陣於電路學、力學、光學和量子物理中都有應用;電腦科學中,三維動畫製作也需要用到矩陣。 矩陣的運算是數值分析領域的重要問題。

在大學高數課程中也有學習矩陣的只是,矩陣也可以進行加減和乘法運算。在OpenGL中使用的向量為列向量,我們通過利用矩陣與列向量(顏色、座標都可看做列向量)相乘,得到一個新的列向量。利用這點,我們構建一個的矩陣,與圖形所有的頂點座標座標相乘,得到新的頂點座標集合,當這個矩陣構造恰當的話,新得到的頂點座標集合形成的圖形相對原圖形就會出現平移、旋轉、縮放或拉伸、抑或扭曲的效果。矩陣和頂點相乘示例如下(如果用長度為16的float陣列儲存,則m序號-1即為其下標),那麼如何構造合適的矩陣呢?

x1y1z11=m1m2m3m4m5m6m7m8m9m10m11m12m13
m14m15m16
xyz1=m1x+m5y+m9z+m13m2x+m6y+m10z+m14m3x+m7y+m11z+m15m4x+m8y+m12z+m16
(1)

我們在Android OpenGLES2.0(七)——著色器語言GLSL中提到了,OpenGLES中的矩陣有2*2、3*3和4*4三種矩陣。在本篇部落格中只以4*4來進行分析。

OpenGL中常用矩陣

如(1)中公式所示,即為矩陣和頂點相乘的公式,如果矩陣取值恰當,則可實現圖形的平移、旋轉、縮放、拉伸等變換。在這裡直接給出:

1000010000100001
()

100001000010δXδYδZ1()
10000cosβsinβ00sinβcosβ00001(X)
cosβ0s