在屏幕上绘制对象是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设置注释掉了。
启动持续渲染
如果你跟随示例代码到了这里,那么确定你注释掉了仅在requestRender()调用时进行渲染的设置。否则,OpenGL 只会对形状做一下旋转然后就一直等待来自GLSurfaceView容器的requestRender()调用:
public MyGLSurfaceView(Context context) { ... // 仅当绘制数据发生改变时执行渲染 //setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); // 为执行旋转而注释掉 }
如果绘制对象不会在无任何用户交互动作下发生改变,那么通常将RENDERMODE_WHEN_DIRTY设置开启是个比较好的选择。准备好取消注释这行代码吧!因为下节课会重新让该设置可用。