Ajouter un effet de mouvement

Dessiner des objets à l'écran est une fonctionnalité assez basique d'OpenGL, mais vous pouvez Les classes du framework graphique Android, y compris Canvas et Objets Drawable. OpenGL ES offre des fonctionnalités supplémentaires déplacer et transformer des objets dessinés en trois dimensions ou d'autres manières uniques de créer des expériences utilisateur convaincantes.

Dans cette leçon, vous allez faire un pas de plus 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 (matrice de rotation), puis la combiner à votre projection et Matrices de transformation des vues 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 GLSurfaceView.RENDERMODE_WHEN_DIRTY , comme décrit dans la section suivante.

Activer l'affichage continu

Si vous avez suivi avec diligence l'exemple de code de cette classe jusqu'ici, assurez-vous veillez à mettre en commentaire la ligne qui définit le mode de rendu uniquement si elle est sale, sinon OpenGL fait pivoter la forme d'un incrément, puis attend un appel à requestRender() à partir du 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);
}

À moins que vous n'ayez des objets qui changent sans aucune interaction de l'utilisateur, il est généralement recommandé d'avoir cette indicateur activé. Préparez-vous à annuler la mise en commentaire de ce code, car la prochaine leçon rend cet appel applicable encore une fois.