在屏幕上绘制是OpenGL的基础能力,但是你也可以用其它的Android图形框架类来做,包括Canvas和Drawable。 但是OpenGL ES提供了额外的能力使得可以在三维空间移动和变换绘制对象,或者以其它独特的方式创建引人注目的用户体验。在本文中,将进行下一步使用OpenGL ES为形状添加旋转功能。
一、转动一个形状
使用OpenGL ES 2.0旋转绘图对象是相对简单的。在你的渲染器,创建另一个变换矩阵(旋转矩阵),然后将它与投影和相机视图变换矩阵合并:
public void onDrawFrame(GL10 unused) {
float[] scratch = new float[16];
// 绘制背景颜色
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
// 设置camera的位置(视图矩阵)
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3f, 0f, 0f, 0f, 0f, 1f, 0.0f);
// 计算投影和视图变换
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
// 绘制正方形
mSquare.draw(mMVPMatrix);
// 为三角形创建一个旋转
// Use the following code to generate constant rotation.
// Leave this code out when using TouchEvents.
// long time = SystemClock.uptimeMillis() % 4000L;
// float angle = 0.090f * ((int) time);
Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f);
// 把旋转矩阵合并到投影和相机矩阵
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
// 绘制三角形
mTriangle.draw(scratch);
}
(1)OpenGL基础—模型变换
其实在前一章已经提到模型变换了,它主要提供了以下几种变换函数:
1. void glTranslate{fd}(TYPE x,TYPE y,TYPE z);
把当前矩阵与一个表示移动物体的矩阵相乘。这个移动矩阵由x,y和z值指定(或者在局部坐标系系统中移动相同的数量)。
2. void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z);
把当前矩阵与一个表示移动物体(或物体的局部坐标系统)的矩阵相乘,以逆时针方向绕着从原点到点(x,y,z)的直线进行旋转。angle参数指定了旋转的度数。
3. void glScale{fd}(TYPE x,TYPE y,TYPE z);
把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩或反射的矩阵相乘。这个物体中的每个点的x、y和z坐标与对应的x、y和z参数相乘。使用局部坐标系统方法,局部坐标系统的轴将由x、y和z因子拉伸、收缩或反射,相关联的物体也根据它们进行变换。
(2)分析代码–模型变换
void setRotateM(float[] rm, int rmOffset,float a, float x, float y, float z);
与OpenGL的glRotate函数类似,差别主要是增加了偏移量 rmOffset,以及将旋转矩阵存储在参数float[] rm里。
(3)四维向量
查看坐标变换的代码时,可以发现所有相关的矩阵乘积都是四维的,而立体空间只有三个维度,主要是因为OpenGL关于颜色,位置的坐标都是四维的。
位置的w坐标其实是没有意义的,至于纹理坐标后续图像的绘制会涉及到。