投影和摄像视图让你展示绘制对象更加接近现实中眼中看到的物理对象。这种模拟物理视图使用数学转换绘制对象的坐标来完成:
用于投影转换的数据在onSurfaceChanged()方法中被计算:
完成转换绘制对象的过程中,需要添加一个摄像视图到绘制过程中。下面的例子中,使用Matrix.setLookAtM()来计算摄像视图转换,然后组合到先前投影矩阵中。合并后的转换矩阵被传递到绘制形状。
修改先前的draw()方法:
- 投影 - 基于GLSurfaceView的宽高来调整绘制对象的坐标。如果没有这个计算,对象在不对等的视图中会出现倾斜。一个投影转换通常在视图比例被创建或者通过onSurfaceChanged()修改比例时才会被计算。
- 摄像视图 - 基于一个虚拟的摄像点来调整视图的坐标。需要注意的是,OpenGL ES没有定义一个真实的摄像对象,只是提供一些方法来模拟一个摄像头。一个摄像视图仅仅是当你创建GLSurfaceView时被计算一次,或者基于用户活动动态改变。
定义一个投影
用于投影转换的数据在onSurfaceChanged()方法中被计算:
@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(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); }
定义一个摄像视图
完成转换绘制对象的过程中,需要添加一个摄像视图到绘制过程中。下面的例子中,使用Matrix.setLookAtM()来计算摄像视图转换,然后组合到先前投影矩阵中。合并后的转换矩阵被传递到绘制形状。
@Override public void onDrawFrame(GL10 unused) { ... // Set the camera position (View matrix) Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); // Calculate the projection and view transformation Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); // Draw shape mTriangle.draw(mMVPMatrix); }
应用投影和摄像转换
修改先前的draw()方法:
public void draw(float[] mvpMatrix) { // pass in the calculated transformation matrix ... // get handle to shape's transformation matrix mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); // Apply the projection and view transformation GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); // Draw the triangle GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); ... }
运行后的效果如图:
![](https://img-my.csdn.net/uploads/201209/17/1347883586_6964.png)