Android openGL ES2.0 Matrix.frustumM和Matrix.setLookAtM解析

Android使用OpenGL ES2.0繪製3D圖像或者加載3D模型時,爲了達到立體效果往往需要設置視見轉換矩陣和投影轉換矩陣即Matrix.setLookAtM(mVMatrix, 0, cx, cy, cz, tx, ty, tz, upx, upy, upz) 和 Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far)。學習這兩個方法需要先了解openGL的3D座標系,可以自行百度。
Matrix.setLookAtM
需要填充的參數
float cx, //攝像機位置x
float cy, //攝像機位置y
float cz, //攝像機位置z
float tx, //攝像機目標點x
float ty, //攝像機目標點y
float tz, //攝像機目標點z
float upx, //攝像機UP向量X分量
float upy, //攝像機UP向量Y分量
float upz //攝像機UP向量Z分量
這個方法看起來很抽象,設幾組參數對比一下效果,攝像機目標點,即繪製的3D圖像,tx,ty, tz,爲圖像的中心位置設置到原點即 tx = 0,ty = 0, tz = 0; 攝像機的位置,即觀察者眼睛的位置 我們設置在目標點的正前方(位置z軸正方向),cx = 0, cy = 0, cz = 10; 接着是攝像機頂部的方向了,如下圖,很顯然相機旋轉,up的方向就會改變,這樣就會會影響到繪製圖像的角度。


拍攝的相機位置,即觀察者的眼睛

例如設置up方向爲y軸正方向,upx = 0,upy = 1,upz = 0。這是相機正對着目標圖像,則繪製出來的效果如下圖所示


如果設置up方向爲x軸正方向,upx = 1,upy = 0,upz = 0,繪製的圖像就會如下圖所示


顯然如果設置在z軸方向,圖像就會看不見。Matrix.setLookAtM,的作用大體就是這樣。

Matrix.frustumM
需要填充的參數有
float left, //near面的left
float right, //near面的right
float bottom, //near面的bottom
float top, //near面的top
float near, //near面距離
float far //far面距離
設置這些參數能起到的作用:先是left,right和bottom,top,這4個參數會影響圖像左右和上下縮放比,所以往往會設置的值分別-(float) width / height和(float) width / height,top和bottom和top會影響上下縮放比,如果left和right已經設置好縮放,則bottom只需要設置爲-1,top設置爲1,這樣就能保持圖像不變形。也可以將left,right 與bottom,top交換比例,即bottom和top設置爲 -height/width 和 height/width, left和right設置爲-1和1。
near和far參數稍抽象一點,就是一個立方體的前面和後面,near和far需要結合拍攝相機即觀察者眼睛的位置來設置,例如setLookAtM中設置cx = 0, cy = 0, cz = 10,near設置的範圍需要是小於10纔可以看得到繪製的圖像,如果大於10,圖像就會處於了觀察這眼睛的後面,這樣繪製的圖像就會消失在鏡頭前,far參數,far參數影響的是立體圖形的背面,far一定比near大,一般會設置得比較大,如果設置的比較小,一旦3D圖形尺寸很大,這時候由於far太小,這個投影矩陣沒法容納圖形全部的背面,這樣3D圖形的背面會有部分隱藏掉的。



作者:android_opengl
鏈接:http://www.jianshu.com/p/f24f7e35a1ab
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章