Android環境下OpenGL ES的學習

2021-10-04 03:26:29 字數 2862 閱讀 6887

寫在前面:我也是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,那你就拍不到任何畫面了,因為攝像頭的姿勢已經偏離了拍攝目標,所以就什麼也看不到了。

Windows7下Qt專案新增OpenGL

前幾日需要在已有的qt專案中新增opengl,嘗試許多方法均不得其解,最後竟然發現問題出自最初qt專案建立上!我是用的是qt4.8.4版本,在vs2010下建立opengl專案時最初需要選擇opengl模組,但是最開始建立qt專案時沒有對opengl模組進行勾選,導致現在嘗試多法均不得解決,讓我頭疼...

Mac下安裝android 環境

2.cd android sdk macosx cd tools 3.chomd x android 4.android 安裝android sdk 5.安裝genymotion 和 virtulbox 安裝genymotion後不能使用shadow的問題可以安裝一些其他的相關包。7.因為是tita...

windows下配置Android環境

前言 windows上配置android環境,最後通過ionic cordova build android 命令生成apk。生成 建議自定義路徑,方便之後配置系統變數的時候好找 配置環境變數 配置系統變數 path 變數中 新增 d gradle 4.6 bin cmd 輸入 gradle ver...