OpenGL ES 3 投影方式 詳述

2021-10-23 02:30:49 字數 3434 閱讀 6345

1、攝像機的設定

從日常生活的經驗中可以很容易地了解到,隨著攝像機位置、姿態的不同,就算是對同一 個場景進行拍攝,得到的畫面也是迥然不同的。因此攝像機的位置、姿態在opengl es 應用程式的開發中就顯得非常重要,首先需要介紹一下攝像機的設定方法。

攝像機的設定需要給出 3 方面的資訊,包括攝像機的位置、觀察的方向以及 up 方向,具體情況如下圖所示。

a:攝像機的位置很容易理解,用其在 3d 空間中的座標來表示。

b:攝像機觀察的方向可以理解為攝像機鏡 頭的指向,用乙個觀察目標點來表示(通過攝像機位置與觀察目標點可以確定乙個向量,此向量 即代表了攝像機觀察的方向)。

c:攝像機的 up 方向可以理解為攝像機頂端的指向,用乙個向量來表示。

設定攝像機的api如下:

matrix.setlookatm( 

mvmatrix, //儲存生成矩陣元素的 float型別陣列

0, //填充起始偏移量

cx, cy, cz, //攝像機位置的 x、y、z 座標

tx, ty, tz, //觀察目標點 x、y、z 座標

upx, upy, upz //up 向量在 x、y、z 軸上的分量

2、正交投影opengl es 中,根據應用程式中提供的投影矩陣,管線會確定乙個可視空間區域,稱為視景體。視景體是由 6 個平面確定的,這 6 個平面分別為:上平面(up)、下平面(down)、左平 面(left)、右平面(right)、遠平面(far)、近平面(near)。

場景中處於視景體內的物體會被投影到近平面上(視景體外面的物體將被裁剪掉),然後再將近平面上投影出的內容對映到螢幕上的視口中。

正交投影示意圖如下圖所示:

使用matrix.orthom()來設定正交投影。

/**

* @param m 生成的投影矩陣,float[4*4]

* @param moffset 填充時候起始的偏移量

* @param left 近平面left邊的x座標

* @param right 近平面right邊的x座標

* @param bottom 近平面bottom邊的y座標

* @param top 近平面top邊的y座標

* @param near 近平面距離攝像機的距離

* @param far 遠平面距離攝像機的距離

*/public static void orthom(float m, int moffset,

float left, float right, float bottom, float top,

float near, float far)

正交投影的使用示例如下:

public class matrixstate 

public static void setprojectortho(

float left, float right,

float bottom, float top,

float near, float far)}

private class scenerenderer implements glsu***ceview.renderer

public void onsu***cechanged(gl10 gl, int width, int height)

}

3、透視投影現實世界中人眼觀察物體時會有「近大遠小」的效果,因此,要想開發出更加真實的場景, 僅使用正交投影是遠遠不夠的,這時可以採用透視投影。透視投影的投影線是不平行的,他們相 交於視點。通過透視投影,可以產生現實世界中「近大遠小」的效果,大部分 3d 遊戲採用的都 是透視投影。

透視投影示意圖如下圖所示:

紅點為攝像機位置(eyex,eyey,eyez) = (0, 0, 3)。 藍色三角形為被觀察的物體,綠色長方體為視景體,此時三角形全部在視景體內。 近平面各座標: left=-1,right=1,top=2,bottom=-2, 近平面z座標 = eyez - near=2, 遠平面z座標 = eyez - far = -2 。

使用matrix.frustumm()來設定正交投影。

/**

* @param m 生成的投影矩陣,float[4*4]

* @param moffset 填充時候起始的偏移量

* @param left 近平面left邊的x座標

* @param right 近平面right邊的x座標

* @param bottom 近平面bottom邊的y座標

* @param top 近平面top邊的y座標

* @param near 近平面距離攝像機的距離

* @param far 遠平面距離攝像機的距離

*/public static void frustumm(float m, int moffset,

float left, float right, float bottom, float top,

float near, float far)

透視投影的使用示例如下:

public class matrixstate 

public static void setprojectortho(

float left, float right,

float bottom, float top,

float near, float far

)public static void setprojectfrustum(

float left, float right,

float bottom, float top,

float near, float far )}

private class scenerenderer implements glsu***ceview.renderer

public void onsu***cechanged(gl10 gl, int width, int height)

}

4、near、far的取值範圍規定:

OpenGL ES 3 紋理基礎

1 讀取檔案 將儲存的檔案讀取到記憶體 方法很多 inputstream is this.getresources openrawresource path bitmap bitmaptmp try finally catch ioexception e 2 載入紋理 將記憶體影象資料上傳到視訊記憶...

OpenGL ES 3 紋理環繞

紋理座標的範圍通常是從 0,0 到 1,1 那如果我們把紋理座標設定在範圍之外會發生什麼?無論是 s 軸還是 t 軸的紋理座標都是在 0.0 1.0 的範圍內,這滿足了大多數情況。但在特定的情況下,也可以設定大於 1 的紋理座標。當紋理座標大於 1 以後,設定的?方式就會起作用了。1 重複紋理環繞 ...

OpenGL ES 3 功能函式 持續更新

1 角度轉換與三角函式 gentype radians gentype degrees 此函式功能為將角度轉換為弧度,即返回值 result 180 degrees,degrees 引數表示需要轉換的角度。gentype degrees gentype radians 此函式功能為將弧度轉換為角度,...