读书人

一步一步学android OpenGL ES2.0编程(

发布时间: 2013-03-01 18:33:02 作者: rapoo

一步一步学android OpenGL ES2.0编程(4)

应用投影和相机视口

在OpenGLES环境中,投影和相机视口使你绘制的对象以更接近物理对象的样子显示。这是通过对坐标精确的数学变换实现的。

投影-这种变换跟据所在定义一个投影


投影变换的数据是在@Overridepublic 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);}

以下代码产生了一个投影矩阵定义一个相机视口


再定义一个相机视口变换以使对绘制对象的变换处理变得完整。在下面的例子中,使用方法@Overridepublic 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);}

应用投影和相机视口变换

为了使用前面的合并后的投影和相机视口变换矩阵,修改你的图形对象的方法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); ...}

一旦你正确的计算和应用了投影和视口变换,你的图像将出现在正确的位置,看起来像下面这样:

一步一步学android OpenGL ES2.0编程(四)

1.应用了投影和视口变换后绘制的三角形

现在你拥有了一个正确显示你的形状的应用了,是让你的图形动起来的时候了...嘿嘿...


上一讲

下一讲