在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ 通用的矩陣變換指令
繪制線段 Line Segment
投影變換 Projection
繪制迷你太陽(yáng)系
繪制一個(gè)球體
繪制三角形 Triangle
OpenGL 光照模型
三維坐標(biāo)系及坐標(biāo)變換初步
定義 3D 模型的前面和后面
繪制一個(gè) 20 面體
顏色 Color
Depth Buffer
材質(zhì)及光照示例
基本幾何圖形定義
關(guān)于EGL
導(dǎo)言
Viewing 和 Modeling(MODELVIEW) 變換
FrameBuffer
設(shè)置光照效果 Set Lighting
Viewport 變換
階段小結(jié)
繪制點(diǎn) Point
OpenGL ES API 命名習(xí)慣
通用的矩陣變換指令
關(guān)于 OpenGL ES
創(chuàng)建實(shí)例應(yīng)用 OpenGLDemos 程序框架
OpenGL ES 管道(Pipeline)
GLSurfaceView

通用的矩陣變換指令

Android OpenGL ES 對(duì)于不同坐標(biāo)系下坐標(biāo)變換,大都使用矩陣運(yùn)算的方法來(lái)定義和實(shí)現(xiàn)的。這里介紹對(duì)應(yīng)指定的坐標(biāo)系(比如viewmodel, projection或是viewport) Android OpenGL ES支持的一些矩陣運(yùn)算及操作。

OpenGL ES 中使用四個(gè)分量(x,y,z,w)來(lái)定義空間一個(gè)點(diǎn),使用 4 個(gè)分量來(lái)描述 3D 坐標(biāo)稱為齊次坐標(biāo) :所謂齊次坐標(biāo)就是將一個(gè)原本是n維的向量用一個(gè) n+1 維向量來(lái)表示。 它有什么優(yōu)點(diǎn)呢?許多圖形應(yīng)用涉及到幾何變換,主要包括平移、旋轉(zhuǎn)、縮放。以矩陣表達(dá)式來(lái)計(jì)算這些變換時(shí),平移是矩陣相加,旋轉(zhuǎn)和縮放則是矩陣相乘,綜合起來(lái)可以表示為 p’ = m1\*p + m2 (m1 旋轉(zhuǎn)縮放矩陣, m2 為平移矩陣, p 為原向量 ,p’ 為變換后的向量)。引入齊次坐標(biāo)的目的主要是合并矩陣運(yùn)算中的乘法和加法,表示為 p’ = M\*p的形式。即它提供了用矩陣運(yùn)算把二維、三維甚至高維空間中的一個(gè)點(diǎn)集從一個(gè)坐標(biāo)系變換到另一個(gè)坐標(biāo)系的有效方法。   它可以表示無(wú)窮遠(yuǎn)的點(diǎn)。n+1 維的齊次坐標(biāo)中如果h=0,實(shí)際上就表示了 n 維空間的一個(gè)無(wú)窮遠(yuǎn)點(diǎn)。對(duì)于齊次坐標(biāo)[a,b,h],保持 a,b 不變,|V|=(x1*x1,y1*y1,z1*z1)^1/2 的過(guò)程就表示了標(biāo)準(zhǔn)坐標(biāo)系中的一個(gè)點(diǎn)沿直線 ax+by=0 逐漸走向無(wú)窮遠(yuǎn)處的過(guò)程。

為了實(shí)現(xiàn) viewing, modeling, projection 坐標(biāo)變換,需要構(gòu)造一個(gè)4X4 的矩陣 M,對(duì)應(yīng)空間中任意一個(gè)頂點(diǎn) vertex v , 經(jīng)過(guò)坐標(biāo)變換后的坐標(biāo) v’=Mv

矩陣本身可以支持加減乘除,對(duì)角線全為 1 的 4X4 矩陣成為單位矩陣 Identity Matrix 。

  • 將當(dāng)前矩陣設(shè)為單位矩陣的指令為 glLoadIdentity()。
  • 矩陣相乘的指令 glMultMatrix*() 允許指定任意矩陣和當(dāng)前矩陣相乘。
  • 選擇當(dāng)前矩陣種類glMatrixMode(). OpenGL ES 可以運(yùn)行指定 GL_PROJECTION,GL_MODELVIEW 等坐標(biāo)系,后續(xù)的矩陣操作將針對(duì)選定的坐標(biāo)。
  • 將當(dāng)前矩陣設(shè)置成任意指定矩陣 glLoadMatrix*()
  • 在棧中保存當(dāng)前矩陣和從棧中恢復(fù)所存矩陣,可以使用 glPushMatrix() 和 glPopMatrix()
  • 特定的矩陣變換平移 glTranslatef(),旋轉(zhuǎn) glRotatef() 和縮放 glScalef()

OpenGL 使用了右手坐標(biāo)系統(tǒng),右手坐標(biāo)系判斷方法:在空間直角坐標(biāo)系中,讓右手拇指指向x軸的正方向,食指指向y軸的正方向,如果中指能指向z軸的正方向,則稱這個(gè)坐標(biāo)系為右手直角坐標(biāo)系。

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/64.png" alt="" />

Translate 平移變換

方法 public abstract void glTranslatef (float x, float y, float z) 用于坐標(biāo)平移變換。

在上個(gè)例子中我們把需要顯示的正方形后移了4個(gè)單位,就是使用的坐標(biāo)的平移變換,可以進(jìn)行多次平移變換,其結(jié)果為多個(gè)平移矩陣的累計(jì)結(jié)果,矩陣的順序不重要,可以互換。

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/65.png" alt="" />

Rotate 旋轉(zhuǎn)

方法 public abstract void glRotatef(float angle, float x, float y, float z)用來(lái)實(shí)現(xiàn)選擇坐標(biāo)變換,單位為角度。 (x,y,z)定義旋轉(zhuǎn)的參照矢量方向。多次旋轉(zhuǎn)的順序非常重要。

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/66.png" alt="" />

比如你選擇一個(gè)骰子,首先按下列順序選擇3次:

gl.glRotatef(90f, 1.0f, 0.0f, 0.0f);
gl.glRotatef(90f, 0.0f, 1.0f, 0.0f);
gl.glRotatef(90f, 0.0f, 0.0f, 1.0f);

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/67.png" alt="" />

然后打算逆向旋轉(zhuǎn)回原先的初始狀態(tài),需要有如下旋轉(zhuǎn):

gl.glRotatef(90f, -1.0f, 0.0f, 0.0f);
gl.glRotatef(90f, 0.0f, -1.0f, 0.0f);
gl.glRotatef(90f, 0.0f, 0.0f, -1.0f);

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/68.png" alt="" />

或者如下旋轉(zhuǎn):

gl.glRotatef(90f, 0.0f, 0.0f, -1.0f);
gl.glRotatef(90f, 0.0f, -1.0f, 0.0f);
gl.glRotatef(90f, -1.0f, 0.0f, 0.0f);  

旋轉(zhuǎn)變換 glRotatef(angle, -x, -y, -z) 和 glRotatef(-angle, x, y, z)是等價(jià)的,但選擇變換的順序直接影響最終坐標(biāo)變換的結(jié)果。 角度為正時(shí)表示逆時(shí)針?lè)较颉?/p>

Translate & Rotate (平移和旋轉(zhuǎn)組合變換)

在對(duì) Mesh(網(wǎng)格,構(gòu)成三維形體的基本單位)同時(shí)進(jìn)行平移和選擇變換時(shí),坐標(biāo)變換的順序也直接影響最終的結(jié)果。

比如:先平移后旋轉(zhuǎn), 旋轉(zhuǎn)的中心為平移后的坐標(biāo)。

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/69.png" alt="" />

先選擇后平移: 平移在則相對(duì)于旋轉(zhuǎn)后的坐標(biāo)系:

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/70.png" alt="" />

一個(gè)基本原則是,坐標(biāo)變換都是相對(duì)于變換的 Mesh 本身的坐標(biāo)系而進(jìn)行的。

Scale(縮放)

方法 public abstract void glScalef (float x, float y, float z)用于縮放變換。

下圖為使用 gl.glScalef(2f, 2f, 2f) 變換后的基本,相當(dāng)于把每個(gè)坐標(biāo)值都乘以2.

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/71.png" alt="" />

Translate & Scale(平移和縮放組合變換)

同樣當(dāng)需要平移和縮放時(shí),變換的順序也會(huì)影響最終結(jié)果。

比如先平移后縮放:

gl.glTranslatef(2, 0, 0);
gl.glScalef(0.5f, 0.5f, 0.5f);

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/72.png" alt="" />

如果調(diào)換一下順序:

gl.glScalef(0.5f, 0.5f, 0.5f);
gl.glTranslatef(2, 0, 0);  

結(jié)果就有所不同:

http://wiki.jikexueyuan.com/project/opengl-es-guide/images/73.png" alt="" />

矩陣操作,單位矩陣

在進(jìn)行平移,旋轉(zhuǎn),縮放變換時(shí),所有的變換都是針對(duì)當(dāng)前的矩陣(與當(dāng)前矩陣相乘),如果需要將當(dāng)前矩陣回復(fù)最初的無(wú)變換的矩陣,可以使用單位矩陣(無(wú)平移,縮放,旋轉(zhuǎn))。

public abstract void glLoadIdentity()。

在棧中保存當(dāng)前矩陣和從棧中恢復(fù)所存矩陣,可以使用

public abstract void glPushMatrix()

public abstract void glPopMatrix()。

在進(jìn)行坐標(biāo)變換的一個(gè)好習(xí)慣是在變換前使用 glPushMatrix 保存當(dāng)前矩陣,完成坐標(biāo)變換操作后,再調(diào)用 glPopMatrix 恢復(fù)原先的矩陣設(shè)置。