Aggiungi movimento

Disegnare oggetti sullo schermo è una funzionalità basilare di OpenGL, ma puoi farlo con altre Classi di framework grafici Android, tra cui Canvas e Drawable oggetti. OpenGL ES offre funzionalità aggiuntive spostare e trasformare oggetti disegnati in tre dimensioni o in altri modi unici per creare esperienze utente interessanti.

In questa lezione farai un altro passo avanti nell'uso di OpenGL ES imparando ad aggiungere movimenti a una forma con la rotazione.

Ruotare una forma

La rotazione di un oggetto di disegno con OpenGL ES 2.0 è relativamente semplice. Nel renderer, crea un'altra matrice di trasformazione (una matrice di rotazione) e poi la combina con la tua proiezione matrici di trasformazione della vista videocamera:

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

Se il triangolo non ruota dopo aver apportato queste modifiche, accertati di aver commentato GLSurfaceView.RENDERMODE_WHEN_DIRTY come descritto nella prossima sezione.

Abilita rendering continuo

Se hai seguito con attenzione il codice di esempio di questa lezione fino a questo punto, assicurati di commentare la linea che imposta la modalità di rendering per disegnare solo quando è "sporco", altrimenti in OpenGL ruota la forma di un solo incremento, quindi attende una chiamata a requestRender() dal contenitore 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 meno che gli oggetti non cambino senza alcuna interazione dell'utente, di solito è una buona idea avere questo attiva il flag. Preparati a rimuovere il commento da questo codice, perché la prossima lezione renderà questa chiamata applicabile di nuovo.