Ajouter un effet de mouvement

Dessiner des objets à l'écran est une fonctionnalité assez basique d'OpenGL, mais vous pouvez le faire avec d'autres classes du framework graphique Android, y compris les objets Canvas et Drawable. OpenGL ES offre des fonctionnalités supplémentaires pour déplacer et transformer des objets dessinés en trois dimensions, ou par d'autres moyens uniques pour créer des expériences utilisateur convaincantes.

Dans cette leçon, vous allez avancer dans l'utilisation d'OpenGL ES en apprenant à ajouter du mouvement à une forme avec rotation.

Faire pivoter une forme

La rotation d'un objet de dessin avec OpenGL ES 2.0 est relativement simple. Dans votre moteur de rendu, créez une autre matrice de transformation (une matrice de rotation), puis combinez-la avec vos matrices de transformation de projection et de vue de caméra:

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 votre triangle ne pivote pas après avoir apporté ces modifications, assurez-vous d'avoir mis en commentaire le paramètre GLSurfaceView.RENDERMODE_WHEN_DIRTY, comme décrit dans la section suivante.

Activer le rendu continu

Si vous avez suivi attentivement l'exemple de code de cette classe jusqu'à présent, veillez à mettre en commentaire la ligne qui définit le mode de rendu uniquement lorsqu'elle est sale, sinon OpenGL ne fait pivoter la forme qu'un seul incrément, puis attend un appel à requestRender() depuis le conteneur 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);
}

Il est généralement recommandé d'activer cet indicateur, sauf si des objets changent sans intervention de l'utilisateur. Soyez prêt à annuler la mise en commentaire de ce code, car la leçon suivante rend cet appel applicable à nouveau.