鍍金池/ 教程/ Android/ 投影變換 Projection
繪制線段 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

投影變換 Projection

前面 ModelView 變換相當(dāng)于拍照時(shí)放置相機(jī)和調(diào)整被拍物體的位置和角度。投影變換則對(duì)應(yīng)于調(diào)整相機(jī)鏡頭遠(yuǎn)近來(lái)取景。

下面代碼設(shè)置當(dāng)前 Matrix 模式為 Projection 投影矩陣:

gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();  

后續(xù)的坐標(biāo)變換則針對(duì)投影矩陣。投影變換的目的是定義視錐(viewing volume),視錐一方面定義了物體如何投影到屏幕(如透視投影或是正側(cè)投影),另一方面視錐也定義了裁剪場(chǎng)景的區(qū)域大小。

OpenGL ES 可以使用兩種不同的投影變換:透視投影(Perspective Projection)和正側(cè)投影(Orthographic Projection)。

透視投影(Perspective Projection)

透視投影的特點(diǎn)是“近大遠(yuǎn)小”,也就是我們眼睛日??吹降氖澜?。OpenGL ES 定義透視投影的函數(shù)為 glFrustum():

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

public void glFrustumf(float left,float right,float bottom,float top,float near,float far)

視錐由(left,bottom,-near) 和(right,top,-near) 定義了靠近觀測(cè)點(diǎn)的裁剪面,near 和far定義了觀測(cè)點(diǎn)和兩個(gè)創(chuàng)建面直接的近距離和遠(yuǎn)距離。

在實(shí)際寫代碼時(shí),Android OpenGL ES提供了一個(gè)輔助方法gluPerspective()可以更簡(jiǎn)單的來(lái)定義一個(gè)透視投影變換:

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

public static void gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)
  • fovy: 定義視錐的 view angle.
  • aspect: 定義視錐的寬高比。
  • zNear: 定義裁剪面的近距離。
  • zFar: 定義創(chuàng)建面的遠(yuǎn)距離。

正側(cè)投影(Orthographic Projection)

正側(cè)投影,它的視錐為一長(zhǎng)方體,特點(diǎn)是物體的大小不隨到觀測(cè)點(diǎn)的距離而變化,投影后可以保持物體之間的距離和夾角。它主要用在工程制圖上。

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

定義正側(cè)投影(也稱作平移投影)的函數(shù)為:

public void glOrthof(float left, float right,float bottom,float top,float near,float far)

裁剪

場(chǎng)景中的圖形的頂點(diǎn)經(jīng)過(guò) modelview 和 projection 坐標(biāo)變換后,所有處在 Viewing volumn之外的頂點(diǎn)都會(huì)被裁剪掉,透視投影和正側(cè)投影都有6個(gè)裁剪面。所有處在裁剪面外部的頂點(diǎn)都需剪裁掉以提高繪圖性能。