转载请注明出处
本文出自Hansion的博客
本章主要讲解如何为绘制对象添加旋转的动作
旋转形状
我们只需创建一个变换矩阵(此处以旋转为例),然后将其与投影变换和相机视角变换矩阵结合在一起。
public class MyGLRenderer implements GLSurfaceView.Renderer {
...
//用于旋转的变换矩阵
private float[] mRotationMatrix = new float[16];
...
@Override
public void onDrawFrame(GL10 gl10) {
// glClear表示清除缓冲 传入GL_COLOR_BUFFER_BIT指要清除颜色缓冲
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
// 设置相机视角
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// 计算投影和视图变换
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
//用于存储最终合成的矩阵
float[] scratch = new float[16];
// 创建一个旋转变换矩阵 mRotationMatrix
long time = SystemClock.uptimeMillis() % 4000L;
float angle = 0.090f * ((int) time);
Matrix.setRotateM(mRotationMatrix, 0, angle, 0, 0, -1.0f);
// 将旋转矩阵与投影和相机视图组合在一起
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
// 绘制形状
mTriangle.draw(scratch);
}
}
其中GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);这句代码比较重要,因为它是要清除上一次的绘制,如果不清除,那么运行起来是这个样子的(层叠):
启动持续渲染
如果你运行上述代码,三角形并没有旋转,我们还需要开启持续渲染,设置渲染模式为GLSurfaceView.RENDERMODE_CONTINUOUSLY
还有一种模式是需要的时候才进行渲染
GLSurfaceView.RENDERMODE_WHEN_DIRTY ,当你调用GLSurfaceView的requestRender()方法后,才进行渲染操作
默认的渲染模式就是持续渲染GLSurfaceView.RENDERMODE_CONTINUOUSLY,如果你设置过其他模式,注释掉该设置代码也可以。
public class MyGLSurfaceView extends GLSurfaceView {
...
public void init() {
...
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
}
参考: