Android環境下OpenGL ES的學習

寫在前面:我也是OpenGL的初學者,本篇是作爲一個學習筆記來寫的。

首先學習一下關於OpenGL中的重要概念:矩陣

你做了一個物體想放在空間某一個座標上,需要一個World矩陣吧?然後你需要一個攝像機來拍攝這個物體,讓這個物體可見,對吧?那不就需要:

1、View矩陣,決定攝像機在哪裏,朝哪裏看。

2、Projection矩陣,攝像機的視角、焦距、近平面、遠平面。

3、最後把物體的每個Pixel的xyz座標 分別 乘以 World,View,Projection矩陣。就是在屏幕上的座標。

這些也是我今天剛學到的(逃

由此可見,在OpenGL中我們大部分操作都和這些矩陣有關係。那麼我們是如何操作這些矩陣的呢?

Matrix.frustumM方法,他有8個參數(我的天吶,居然要傳這麼多參數

ps:這是一個用於創建投影矩陣的方法

//這裏節選自Matrix.frustumM
final float r_width  = 1.0f / (right - left);
final float r_height = 1.0f / (top - bottom);
final float r_depth  = 1.0f / (near - far);
final float x = 2.0f * (near * r_width);
final float y = 2.0f * (near * r_height);
final float A = (right + left) * r_width;
final float B = (top + bottom) * r_height;
final float C = (far + near) * r_depth;
final float D = 2.0f * (far * near * r_depth);
m[offset + 0] = x;
m[offset + 5] = y;
m[offset + 8] = A;
m[offset +  9] = B;
m[offset + 10] = C;
m[offset + 14] = D;
m[offset + 11] = -1.0f;
m[offset +  1] = 0.0f;
m[offset +  2] = 0.0f;
m[offset +  3] = 0.0f;
m[offset +  4] = 0.0f;
m[offset +  6] = 0.0f;
m[offset +  7] = 0.0f;
m[offset + 12] = 0.0f;
m[offset + 13] = 0.0f;
m[offset + 15] = 0.0f;

第一個參數 m 就是我們要傳入的矩陣,一般是一個float[16]的數組,這個矩陣也就是我們的投影矩陣

第二個參數 offset 翻譯過來叫偏移量,但是我嘗試對這個偏移量進行修改的時候都報錯了,所以這裏我都直接傳入0(從源碼中看就更好理解爲什麼會報錯了,坑啊)

left、right、bottom、top這四個參數是投影面的大小,但是不同於我們一般的view,這裏的參數表示的是比例,並不是絕對值。

可以看到我們傳入進去的right、left等值,並沒有被直接使用,而是以1.0f作爲基準,將我們傳入的數字換成了比例。

(這個地方我也不知道怎麼解釋,畢竟我也個初學者,只能將它理解爲比例模式,如果有更好的解釋方式,也請留言告訴我)

另外兩個參數near和far,一個表示近點,一個表示遠點。。。這兩個點的概念也不太好理解。按照我的理解是,通過frustumM方法設置好投影(projection)矩陣後,它的近點和遠點就規定了後面Matrix.setLookAtM方法設定的攝像機位置,攝像頭的z座標不能小於近點,也不能大於遠點。否則就會導致圖像消失。

 

Matrix.setLookAtM方法,它有11個參數!!!(喪心病狂

ps:這是一個用於創建攝像頭矩陣的方法

public static void setLookAtM(float[] rm, int rmOffset,
            float eyeX, float eyeY, float eyeZ,
            float centerX, float centerY, float centerZ, float upX, float upY,
            float upZ) {
    //省略。。。
}

第一個參數 rm 是一個float[16]的矩陣,也就是我們的攝像頭矩陣

第二個參數 rmOffset 偏移量。。。暫時沒發現有什麼卵用

隨後的eyeX、eyeY、eyeZ表示眼睛(攝像頭)的位置,剛剛我們說了,在frustum方法裏已經規定了攝像頭的座標範圍,必須在遠點和近點之間,否則就會看不到東西。一般來說eyeX、eyeY傳入0就可以了,這樣表示攝像頭處於居中位置,然後可以在遠點和近點之間調整eyeZ。由於近大遠小的透視原理,eyeY越接近近點,我們看到的圖像就越大,反之則越小。

centerX、centerY、centerZ表示目標位置。我們的眼睛(攝像頭)位置確定了,但是我們的眼睛(攝像頭)朝哪看呢?,是不是需要一個方向?這個centerX、Y、Z就是這個意思,它決定了我們的眼睛(攝像頭)朝哪個方向看。一般來說我們會選擇朝着畫面的中心去看(攝像頭對準目標中心)。這時我們就只需要給這三個參數全部配0就可以了。

upX、upY、upZ就表示我們的攝像頭的姿勢。類似於我們用手機拍照,我可以橫着拍,豎着拍對吧。這是因爲我們調整了手機的方向,從而導致拍攝到的畫面也發生了旋轉。所以當我們將upX軸設置爲1的時候,就類似我們用手機橫着拍照。這時得到的畫面方向是與X軸平行的。而設置upY爲1的時候,就表示畫面是方向是與Y軸平行的。假設你設置了upZ爲1,那你就拍不到任何畫面了,因爲攝像頭的姿勢已經偏離了拍攝目標,所以就什麼也看不到了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章