Android图形---OpenGL(三)
绘图对象的坐标映射
在Android设备上显示图形中的基本问题之一就是它们的屏幕可能是各种尺寸和形状的。OpenGL会假设一个方形区域,统一的坐标区域,并且在默认情况下,在一些方形的屏幕能够像在方形区域一样,完美的绘制这些坐标。
图1. 默认的OpenGL坐标系统(左)被映射到一个典型的Android设备屏幕(右)。
上面的插图演示了如何把左边的OpenGL的统一坐标系统映射到右边横屏设备的实际坐标上。使用GpenGL的投影模式,可以解决这个问题,并且照相视图(Camera View)会变换坐标,以便图形对象能够按照正确的比例来显示图形。
为了应用投影和照相视图,就要创建一个投影矩阵和一个照相视图矩阵,并且把它们应用到OpenGL的呈现管道。投影矩阵会重新计算图形的坐标,以便让图形能够正确的映射到Android设备的屏幕上。照相视图矩阵会从一个特殊的视角来创建一个要呈现的对象的变换。
在OpenGL ES 1.0中的投影和照相视图
在ES 1.0 API中,要分别创建投影和照相视图,并把它们添加到OpenGL的环境中。
1. 投影矩阵---为了重新计算图形对象的坐标以便让它们能够按照正确的比例来绘制,就要使用设备屏幕的几何形状来创建一个投影矩阵。下面的示例代码演示了如何编辑GLSurfaceView.Renderer的onSurfaceChanged()方法,来实现基于屏幕的外观比率的投影矩阵的创建,并且把这个投影矩阵应用给OpenGL的呈现环境:
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
// make adjustments for screen ratio
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode
gl.glLoadIdentity(); // reset the matrix to its default state
gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix
}
2. 照相变换矩阵---一旦使用一个投影矩阵调整了坐标系统,就必须要使用一个照相视图。下面的代码显示如何使用GLSurfaceView.Renderer的onDrawFrame()方法来实现一个模型视图,并且使用GLU.gluLookAt()工具来创建一个模拟照相机视角的视图变换:
publicvoid onDrawFrame(GL10 gl){
...
// Set GL_MODELVIEW transformation mode
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity(); // reset the matrix to its default state
// When using GL_MODELVIEW, you must set the camera view
GLU.gluLookAt(gl,0,0,-5,0f,0f,0f,0f,1.0f,0.0f);
...
}
关于如何使用OpenGL ES 1.0投影和照相视图的完整的例子,请看OpenGL ES 1.0指南(http://developer.android.com/training/graphics/opengl/index.html)