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.