原文:https://developer.android.com/training/graphics/opengl/projection.html##transform
In the OpenGL ES environment, projection and camera views allow you to display drawn objects in a way that more closely resembles how you see physical objects with your eyes. This simulation of physical viewing is done with mathematical transformations of drawn object coordinates:
在 OpenGL ES環(huán)境中,投影和相機視角可以讓畫出來的圖形模擬一種人眼看真實物體的方式顯示。這種視角是通過將繪制圖形的坐標進行數(shù)學變換實現(xiàn)的。
Projection - This transformation adjusts the coordinates of drawn objects based on the width and height of the GLSurfaceView where they are displayed. Without this calculation, objects drawn by OpenGL ES are skewed by the unequal proportions of the view window. A projection transformation typically only has to be calculated when the proportions of the OpenGL view are established or changed in the onSurfaceChanged() method of your renderer. For more information about OpenGL ES projections and coordinate mapping, see Mapping Coordinates for Drawn Objects.
投影- 這個變換根據(jù)GLSurfaceView的寬高來調節(jié)繪制物體的坐標氮兵。沒有這些轉換計算箱季,OpenGL ES 繪制出來的形狀會因為GLSurfaceView所在的window比例不同而變形贯莺。只需要在OpenGL view建立時乎婿,或者在render的onSurfaceChanged()方法中進行投影變換饥臂。關于更多的OpenGL ES 投影和坐標映射师溅,可以看映射繪制物體的坐標茅信。Camera View - This transformation adjusts the coordinates of drawn objects based on a virtual camera position. It’s important to note that OpenGL ES does not define an actual camera object, but instead provides utility methods that simulate a camera by transforming the display of drawn objects. A camera view transformation might be calculated only once when you establish your GLSurfaceView, or might change dynamically based on user actions or your application’s function.
This lesson describes how to create a projection and camera view and apply it to shapes drawn in your GLSurfaceView.
相機視角- 這個轉換是根據(jù)一個虛擬的相機位置來調節(jié)繪制物體的坐標。需要注意的是墓臭,OpenGL ES并沒有定義一個真實的相機對象蘸鲸,而且提供一個轉變繪制形狀顯示的方法來模擬一個相機。相機視角轉換可能只計算一次窿锉,也可能因為應用功能的不同而動態(tài)變換氓扛。
這里主要講解如何建立投影和相機視角棕硫,并把它應用到GLSurfaceView繪制的圖形上。
Define a Projection
定義投射
The data for a projection transformation is calculated in the onSurfaceChanged() method of your GLSurfaceView.Renderer class. The following example code takes the height and width of the GLSurfaceView and uses it to populate a projection transformation Matrix using the Matrix.frustumM() method:
投影變換的數(shù)據(jù)是在GLSurfaceView.Renderer的onSurfaceChanged() 方法中進行計算的。接下來的示例代碼中待错,利用GLSurfaceView的寬高和Matrix.frustumM() 方法來生成一個投影變換矩陣(Maxtrix)。
// mMVPMatrix is an abbreviation for "Model View Projection Matrix"
private final float[] mMVPMatrix = new float[16];
private final float[] mProjectionMatrix = new float[16];
private final float[] mViewMatrix = new float[16];
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
// this projection matrix is applied to object coordinates
// in the onDrawFrame() method
Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);//wtf is -1,1,3,7?
}
This code populates a projection matrix, mProjectionMatrix which you can then combine with a camera view transformation in the onDrawFrame() method, which is shown in the next section.
這段代碼生成了一個投影矩陣(mProjectionMatrix)琳水,在下一節(jié)中的onDrawFrame() 方法中借嗽,你可以把它和相機視角矩陣結合起來
- Note: Just applying a projection transformation to your drawing objects typically results in a very empty display. In general, you must also apply a camera view transformation in order for anything to show up on screen.
注意:對繪制圖形只使用投影變換會導致沒有任何內容顯示。一般來說判沟,為了讓屏幕上顯示正確的內容耿芹,你必須應用相機視角變換。
Define a Camera View
定義相機視角
Complete the process of transforming your drawn objects by adding a camera view transformation as part of the drawing process in your renderer. In the following example code, the camera view transformation is calculated using the Matrix.setLookAtM() method and then combined with the previously calculated projection matrix. The combined transformation matrices are then passed to the drawn shape.
做為renderer繪制的一部分挪哄,需要把相機視角變換加進來完善轉換過程吧秕。在下面的代碼中,用Matrix.setLookAtM() 方法來計算相機視角迹炼,然后把之前計算好的投影矩陣結合使用砸彬。把結合后的變換矩陣再傳遞給繪制圖形。
@Override
public void onDrawFrame(GL10 unused) {
...
// Set the camera position (View matrix)
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// Calculate the projection and view transformation
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
// Draw shape
mTriangle.draw(mMVPMatrix);
}
Apply Projection and Camera Transformations
應用投影和相機視頻變換
In order to use the combined projection and camera view transformation matrix shown in the previews sections, first add a matrix variable to the vertex shader previously defined in the Triangle class:
為了使用前的小節(jié)中投影和相機視角變換結合后的矩陣斯入,首先添加一個矩陣變量到之前定義的Triangle類的頂點shader中砂碉。
public class Triangle {
private final String vertexShaderCode =
// This matrix member variable provides a hook to manipulate
// the coordinates of the objects that use this vertex shader
"uniform mat4 uMVPMatrix;" +
"attribute vec4 vPosition;" +
"void main() {" +
// the matrix must be included as a modifier of gl_Position
// Note that the uMVPMatrix factor *must be first* in order
// for the matrix multiplication product to be correct.
" gl_Position = uMVPMatrix * vPosition;" +
"}";
// Use to access and set the view transformation
private int mMVPMatrixHandle;
...
}
Next, modify the draw() method of your graphic objects to accept the combined transformation matrix and apply it to the shape:
接下來,修改形狀的draw()方法刻两,增加一個結合的變換矩陣做為參數(shù)增蹭,把這個參數(shù)應用到形狀上來。
public void draw(float[] mvpMatrix) { // pass in the calculated transformation matrix
...
// get handle to shape's transformation matrix
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
// Pass the projection and view transformation to the shader
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
// Draw the triangle
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
Once you have correctly calculated and applied the projection and camera view transformations, your graphic objects are drawn in correct proportions and should look like this:
如果你的正確地計算和應用了投影和相機視角變換磅摹,你的圖形正確地繪制如下圖所示:
Now that you have an application that displays your shapes in correct proportions, it's time to add motion to your shapes.
現(xiàn)在你的應用能正確地顯示形狀了滋迈,該讓形狀動起來了。下一課