07、Android OpenGL学习-添加动作

55 阅读2分钟

在屏幕上绘制对象是 OpenGL 的一项非常基本的功能,但您可以使用其他 Android 图形框架类(包括 Canvas 和 Drawable 对象)来执行此操作。 OpenGL ES 提供了额外的功能,可以在三个维度上或以其他独特的方式移动和转换绘制的对象,以创建引人入胜的用户体验。

在本课中,您将学习如何通过旋转向形状添加运动,从而在使用 OpenGL ES 方面又向前迈进了一步。

旋转一个形状

使用 OpenGL ES 2.0 旋转绘图对象相对简单。在您的渲染器中,创建另一个变换矩阵(旋转矩阵),然后将其与您的投影和相机视图变换矩阵组合:

private val rotationMatrix = FloatArray(16)

override fun onDrawFrame(gl: GL10) {
    val scratch = FloatArray(16)

    ...

    // 为三角形创建一个旋转变换
    val time = SystemClock.uptimeMillis() % 4000L
    val angle = 0.090f * time.toInt()
    Matrix.setRotateM(rotationMatrix, 0, angle, 0f, 0f, -1.0f)

    // 将旋转矩阵与投影和相机视图结合起来请注意,vPMatrix 因子必须在第一位才能使矩阵乘积正确。
    Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0)

    // Draw triangle
    mTriangle.draw(scratch)
}

如果您的三角形在进行这些更改后没有旋转,请确保您已注释掉 GLSurfaceView.RENDERMODE_WHEN_DIRTY 设置,如下一节所述。

启用连续渲染

如果您一直按照此类中的示例代码执行此操作,请确保注释掉设置渲染模式仅在脏时绘制的行,否则 OpenGL 只会旋转形状一个增量,然后等待对 requestRender 的调用() 来自 GLSurfaceView 容器:

class MyGLSurfaceView(context: Context) : GLSurfaceView(context) {

    init {
        ...
        // 仅当绘图数据发生变化时才渲染视图。为了让三角形自动旋转,将这一行注释掉:
        //renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
    }
}

除非您在没有任何用户交互的情况下更改对象,否则打开此标志通常是个好主意。准备取消注释此代码,因为下一课会使此调用再次适用。