前面 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)。
透視投影的特點(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)
正側(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)都需剪裁掉以提高繪圖性能。