傳送門 ☞ 輪子的專欄 ☞ 轉載請註明 ☞ http://blog.csdn.net/leverage_1229
在OpenGL ES環境中,投影和相機視圖讓繪製對象以更接近於人們肉眼所看到的實物對象的樣子顯示。這項仿真技術是通過對繪製對象的座標進行精確的數學變換而實現的。
投影:這種變換是根據所在GLSurfaceView的寬和高調整繪製對象的座標。如果沒有此變換,對象會被不規則比例的視圖所扭曲變形。通常一個投影變換隻有當創建OpenGLView或你的renderer類的onSurfaceChange()方法發生變化時才被計算,更多關於OpenGL ES預測和座標映射的信息,請參閱代碼Mapping Coordinates for Drawn Objects。
相機視圖:這種變換是基於一個虛擬相機的位置來調整繪製對象的座標。需要主要的是,OpenGL ES並沒有定義一個真實的相機對象,而是提供了一些工具方法變換繪製對象的顯示來模擬一個相機。一個相機視圖變換可能在創建GLSurfaceView時被計算一次,或根據用戶行爲或應用程序功能動態地改變。
這一節將描述如何創建一個投影和一個相機視口,並將它們應用於你的GLSurfaceView的形狀繪製過程中。
1定義一個投影
一個投影變換的數據是在GLSurfaceView.Renderer類的onSurfaceChanged()方法中計算得到的。下面的示例代碼演示了根據傳入GLSurfaceView的寬和高計算比例,並使用Matrix類frustumM()方法來填充一個投影變換:@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
// 在onDrawFrame()方法中,將投影矩陣應用到對象的座標
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}
這段代碼填充了一個投影矩陣:mProjMatrix,可以把它與一個相機視圖變換在onDrawFrame()方法中結合起來使用。
注:如果只是一個投影變換應用到你的繪製對象中,通常會導致什麼也看不到。一般來說,你必須再申請一個相機視圖變換才能看到屏幕上的東東。
2定義一個相機視口
添加一個相機視口變換讓你的繪製對象的變換流程變得更加完整。在下面的示例代碼中,使用Matrix.setLookAtM()方法來計算相機視口變換,然後結合前面所計算的投影矩陣。將合併後的變換矩陣傳遞給繪製的形狀。@Override
public void onDrawFrame(GL10 unused) {
...
// 設置相機的位置(視圖矩陣)
Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// 計算投影和視圖變換
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
// 繪製形狀
mTriangle.draw(mMVPMatrix);
}
3應用投影和相機視口變換
爲了使用合併後的投影和相機視口變換矩陣,需要修改你的圖形對象的draw()方法,接收聯合變換矩陣並應用到你的形狀上:public void draw(float[] mvpMatrix) { // 傳遞計算出的變換矩陣
...
// 獲得形狀的變換矩陣的handle
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
// 應用投影和視口變換
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
// 繪製三角形
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
...
}
一旦你已經正確地計算和應用了投影和相機視口變換,你的圖形對象將按照正確的比例進行繪製,看起來應該像下面這樣:
看看現在你的這個應用程序,它能夠按照正確的比例繪製圖形,是時候讓你的圖形動起來了。