在屏幕上绘制对象是 OpenGL 的一个基本功能,
Android 图形框架类,包括 Canvas
和
Drawable
对象。OpenGL ES 为
在三维空间内移动和转换绘制的对象,或者以其他独特的方式
打造富有吸引力的用户体验。
在本课中,您将学习如何添加动画效果,从而更进一步使用 OpenGL ES 旋转为一个具有旋转的形状。
旋转形状
使用 OpenGL ES 2.0 旋转绘制的对象相对比较简单。在渲染程序中,创建 然后将另一个转换矩阵(旋转矩阵)再与您的投影和 相机视图转换矩阵:
Kotlin
private val rotationMatrix = FloatArray(16) override fun onDrawFrame(gl: GL10) { val scratch = FloatArray(16) ... // Create a rotation transformation for the triangle val time = SystemClock.uptimeMillis() % 4000L val angle = 0.090f * time.toInt() Matrix.setRotateM(rotationMatrix, 0, angle, 0f, 0f, -1.0f) // Combine the rotation matrix with the projection and camera view // Note that the vPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0) // Draw triangle mTriangle.draw(scratch) }
Java
private float[] rotationMatrix = new float[16]; @Override 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(rotationMatrix, 0, angle, 0, 0, -1.0f); // Combine the rotation matrix with the projection and camera view // Note that the vPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0); // Draw triangle mTriangle.draw(scratch); }
如果您的三角形在进行这些更改后没有旋转,请确保您已对
GLSurfaceView.RENDERMODE_WHEN_DIRTY
具体设置,如下一部分所述。
启用连续渲染
如果您到目前为止认真阅读了本课程中的示例代码,
请务必注释掉用于将渲染模式设置为仅在 dirty 时绘制的代码行,否则 OpenGL
将形状仅旋转 1 个增量,然后等待从 GLSurfaceView
容器调用 requestRender()
:
Kotlin
class MyGLSurfaceView(context: Context) : GLSurfaceView(context) { init { ... // 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: // renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY } }
Java
public class MyGLSurfaceView(Context context) extends GLSurfaceView { ... // 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); }
除非对象在没有任何用户互动的情况下发生改变,否则通常最好采取以下做法: 标记。请准备好对此代码取消注释,因为下一课会让此调用适用 。