在屏幕上面绘制对象是OpenGL的一个非常好的基本功能,但是你也可以在其他的Android图形框架上面实现这些功能,比如Canvas和Drawable对象。OpenGL ES提供了额外的功能在三维坐标系里移动和变换绘制的对象或者用其他特殊的方式创建复杂的用户体验。
在本教程里,通过学习如何给图形添加旋转运动,使你对OpenGL ES有更加深入的了解。
1. 旋转图形
在OpenGL ES 2.0旋转一个绘制的对象是比较简单的。在renderer类中,创建另一个变换矩阵(旋转矩阵),然后将它与投影和相机视图矩阵结合:
如果你的三角形在添加了上述的更改后没有旋转,确保你注释掉了GLSurfaceView.RENDERMODE_WHEN_DIRTY设置,具体原因后面会讲到
2. 启用连续渲染
除非你需要对象在没有任何用户交互的情况下改变,将这个开关打开通常是个不错的注意。准备好取消这行代码的注释,因为下一节将会使这个调用重新可用。
在本教程里,通过学习如何给图形添加旋转运动,使你对OpenGL ES有更加深入的了解。
1. 旋转图形
在OpenGL ES 2.0旋转一个绘制的对象是比较简单的。在renderer类中,创建另一个变换矩阵(旋转矩阵),然后将它与投影和相机视图矩阵结合:
private float[] mRotationMatrix = new float[16];
public void onDrawFrame(GL10 gl) {
float[] scratch = new float[16];
...
// Create a rotation transformation for the triangle
long time = SystemClock.uptimeMillis() % 4000L;
float angle = 0.090f * ((int) time);
Matrix.setRotateM(mRotationMatrix, 0, angle, 0, 0, -1.0f);
// Combine the rotation matrix with the projection and camera view
// Note that the mMVPMatrix factor *must be first* in order
// for the matrix multiplication product to be correct.
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
// Draw triangle
mTriangle.draw(scratch);
}
如果你的三角形在添加了上述的更改后没有旋转,确保你注释掉了GLSurfaceView.RENDERMODE_WHEN_DIRTY设置,具体原因后面会讲到
2. 启用连续渲染
如果你已经努力遵守示例中的代码,确保你注释掉了设置渲染模式为有改变才绘制的那一行,否则OpenGL只会旋转图形一次,然后就会等待GLSurfaceView调用requestRender().
public MyGLSurfaceView(Context context) {
...
// Render the view only when there is a change in the drawing data.
// To allow the triangle to rotate automatically, this line is commented out:
//setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
除非你需要对象在没有任何用户交互的情况下改变,将这个开关打开通常是个不错的注意。准备好取消这行代码的注释,因为下一节将会使这个调用重新可用。