在屏幕上绘制对象是 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 设置(如下一节所述)。
启用连续渲染
如果您一直认真跟随本课程中的示例代码操作到此处,请务必注释掉设置渲染模式为“仅在脏区绘制”的代码行,否则 OpenGL 只会将形状旋转一个增量,然后等待来自 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); }
除非您的对象在没有用户交互的情况下会发生变化,否则通常建议开启此标志。请准备好取消注释此代码,因为下一课会再次用到此调用。