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.