Android OpenGL透視投影

2021-08-04 20:29:04 字數 2544 閱讀 4238

首先申明下,本文為筆者學習《opengl es應用開發實踐指南》的筆記,並加入筆者自己的理解和歸納總結。

1、透視除法

opengl會把每個gl_position的x、y和z分量都除以它的w分量。當w分量用來表示距離的時候,會使得較遠處的物體被移動到距離渲染區域中心更近的地方。

新增w分量建立三維圖

private static final int position_component_count = 4;

float tableverticeswith********s = ;

顯示如下

2、視椎體

視椎體是乙個立方體,其遠端比近端大,從而使其變成乙個被截斷的金字塔。視椎體有乙個焦點,當你用透視投影觀察乙個場景時,那個場景看上去就像你的頭被放在了焦點處。焦點和視椎體小端的距離被稱為焦距。

3、定義透視投影

matrix的perspectivem方法可以生成乙個透視投影

perspectivem(float m, int offset,

float fovy, float aspect, float near, float far)

投影矩陣,a代表焦距

4、繪製著色器(1) 使用投影矩陣

matrix.perspectivem(projectionmatrix, 0, 45, (float)width / (float)height, 1, 10);
(2) 在z軸上移動物體,先定義乙個modelmatrix模型

matrix.setidentitym(modelmatrix, 0);

matrix.translatem(modelmatrix, 0, 0, 0, -2.8f);

(3) 利用模型移動物體

matrix.multiplymm(modelprojectionmatrix, 0, projectionmatrix, 0, modelmatrix, 0);
(4) openglperspectiveshaderrender類

在onsu***cechanged方法,定義透視矩陣,並使用模型矩陣把資料顯示出來。

private class openglperspectiveshaderrender implements glsu***ceview.renderer ;

vertexdata = bytebuffer

.allocatedirect(tableverticeswith********s.length * bytes_per_float)

.order(byteorder.nativeorder())

.asfloatbuffer();

vertexdata.put(tableverticeswith********s);

} @override

public void onsu***cecreated(gl10 gl, eglconfig config)

@override

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

@override

public void ondrawframe(gl10 gl)

}

顯示如下

5、增加旋轉

旋轉矩陣,繞x軸、y軸和z軸旋轉所用矩陣的定義

在modelmatrix進行平移以後,對模型進行旋轉操作

matrix.rotatem(modelmatrix, 0, -60, 1f, 0f, 0f);
顯示如下

android openGL 兩種投影方式

投影變換是一種很關鍵的圖形變換,opengl中只提供了兩種投影方式,一種是正射投影,另一種是透視投影。不管是呼叫哪種投影函式,為了避免不必要的變換,其前面必須加上以下兩句 glmatrixmode gl projection glloadidentity 事實上,投影變換的目的就是定義乙個視景體,使...

焦點透視與成角透視

我們之前說過透視現象有三種,按消失點的個數依次為焦點透視 成角透視和三點透視。那麼出現這三種透視現象是有條件的,前提條件是只有平視的情況下才會出現焦點透視和成角透視,同樣的,僅有非平視的時候才會出現三點透視。那麼,我們怎麼去理解這2個概念呢?圖九,通過三張立面示意圖可以看到。平視即視平線與水平面重疊...

Android OpenGL教程 第四課

android opengl 教程 第四課旋 在這一課裡,我將教會你如何旋轉三角形和四邊形。左圖中的三角形沿y軸旋轉,四邊形沿著x軸旋轉。我們增加兩個變數來控制這兩個物件的旋轉。這兩個變數加在程式的開始處其他變數的後面。它們是浮點型別的變數,使得我們能夠非常精確地旋轉物件。浮點數包含小數字置,這意味...