Cómo agregar movimiento

Dibujar objetos en la pantalla es una función bastante básica de OpenGL, pero se puede hacer con otros Las clases de framework de gráficos de Android, incluidas Canvas y Drawable. OpenGL ES proporciona capacidades adicionales para mover y transformar objetos dibujados en tres dimensiones o de otras formas únicas para crear experiencias del usuario atractivas.

En esta lección, darás otro paso hacia el uso de OpenGL ES y aprenderás a agregar movimiento. a una forma con rotación.

Cómo rotar una forma

La rotación de un objeto de dibujo con OpenGL ES 2.0 es bastante simple. En tu procesador, crea otra matriz de transformación (una matriz de rotación) y, luego, combinarla con tu proyección Matrices de transformación de vista de cámara:

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);
}

Si el triángulo no rota después de hacer estos cambios, asegúrate de haber comentado el GLSurfaceView.RENDERMODE_WHEN_DIRTY de configuración, como se describe en la siguiente sección.

Cómo habilitar el procesamiento continuo

Si seguiste diligentemente el código de ejemplo de esta clase hasta ahora, asegúrate de comentar la línea que configura el modo de renderización solo dibuja cuando está sucia; de lo contrario, OpenGL Rota la forma solo un incremento y, luego, espera una llamada a requestRender() desde el contenedor GLSurfaceView:

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);
}

A menos que haya objetos que cambien sin ninguna interacción del usuario, suele ser una buena idea tener este función experimental activada. Prepárate para quitar el comentario de este código, ya que la siguiente lección hace que esta llamada sea aplicable una vez más.