[置顶] 使用Android OpenGL ES 2.0绘图之五:添加运动

时间:2022-03-03 18:01:57

传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

在屏幕上绘制图像对于OpenGL来说只是一个非常基本的功能,你也可以使用其它的Android图形框架类来实现,比如使用Canvas和Drawable对象。但是OpenGL ES确有过人之处,它支持在三维空间上移动和变换绘制对象,或以其它独特的方式来创造极好的用户体验。

        在这一节中,将介绍如何使用OpenGL ES为绘制的形状添加一个旋转运动的功能。


一、旋转一个形状

        使用OpenGL ES 2.0旋转绘制对象也很简单。先创建另一个变换矩阵(一个旋转矩阵),然后将它合并到投影和相机视图变换矩阵就可以了:

private float[] mRotationMatrix = new float[16];
public void onDrawFrame(GL10 gl) {
...
// 为三角形创建一个旋转变换
long time = SystemClock.uptimeMillis() % 4000L;
float angle = 0.090f * ((int) time);
Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); // 将旋转矩阵合并到投影和相机视图矩阵
Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0); // 绘制三角形
mTriangle.draw(mMVPMatrix);
}

在对程序做了这些改动之后,如果三角形还是转不起来,请确认一下是否把GLSurfaceView.RENDERMODE_WHEN_DIRTY设置注释掉了,其中的缘由将在下一节中描述。

二、启用持续渲染

        说到这里,你应该在代码中注释掉了只有当数据发生改变时才渲染的渲染模式的代码。否则,OpenGL只能旋转一次,然后等待GLSurfaceView的容器调用requestRender()方法:

private float[] mRotationMatrix = new float[16];
public void onDrawFrame(GL10 gl) {
...
// 为三角形创建一个旋转变换
long time = SystemClock.uptimeMillis() % 4000L;
float angle = 0.090f * ((int) time);
Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); // 将旋转矩阵合并到投影和相机视图矩阵
Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0); // 绘制三角形
mTriangle.draw(mMVPMatrix);
}

除非你不想让绘制的对象与用户交互,否则启用这个渲染模式是一个很好的做法。现在准备解除去它的注释了,因为在下一节中会再次用到它。