Disegnare un triangolo con OpenGL ES in Android

L’obiettivo di questo articolo è quello di disegnare un triangolo con Open GL ES 1.x in Android soffermandosi in particolare sulla relazione fra codice e posizione del triangolo.
Il sistema di coordinate ha l’origine dove si trova l’osservatore con l’asse delle x orizzontale e verso destra, l’asse delle y verticale e verso l’alto e l’asse delle z diretto in modo che l’osservatore stia guardando verso le z negative, quindi il sistema di coordinate segue la regola della mano destra.
I 3 vertici del triangolo che intendo disegnare hanno coordinate:

  • A(-0.5, -0.29, -10)
  • B(+0.5, -0.29, -10)
  • C(0, +0.58, -10)

che sono i vertici di un triangolo equilatero con il baricentro in (0, 0, -10).

Nella nostra prospettiva il triangolo ci appare come in figura:
triangle

Se usciamo dalla nostra prospettiva lo scenario ci appare come nella figura sotto dove l’osservatore è posto all’origine degli assi
triangle_3d

Per disegnare il triangolo con Open GL ES 1.x in Android segui questi passi:

  1. crea un progetto Android senza attività iniziale
  2. modifica il file AndroidManifest.xml
  3. crea la classe eu/lucazanini/opengl/shape/MainActivity.java

    nell’evento onCreate:

    • riga 16: imposto lo schermo intero
    • riga 17: creo un oggetto GLSurfaceView
    • riga 18: eseguo il metodo GLSurfaceView.setRenderer passando come argomento un oggetto GLSurfaceView.Renderer
    • riga 19: imposto l’istanza appena creata di GLSurfaceView come view dell’Activity chiamando il metodo usuale setContentView

    negli eventi onResume e onPause notifico gli stessi eventi a GLSurfaceView

  4. crea la classe eu/lucazanini/opengl/shape/ShapeRenderer.java

    questa classe implementa 3 metodi di GLSurfaceView.Renderer

    • metodo onSurfaceCreated: è chiamato una volta sola quando GLSurfaceView è creato, e imposta l’ambiente openGL, in particolare:
      • riga 66: disegna uno sfondo nero
      • riga 68: attiva la possibilità di mostrare o nascondere il triangolo a seconda che i vertici siano ordinati in senso orario o antiorario; questa istruzione lavora in combinazione con gl.glFrontFace(GL11.GL_CCW); nella riga successiva
    • metodo onDrawFrame: è chiamato ogni volta che è necessario disegnare GLSurfaceView; nota la chiamata al metodo draw della classe Triangle
    • metodo onSurfaceChanged: è chiamato quando cambiano le dimensioni di GLSurfaceView, qui definisco il frustrum, zNear e ZFar sono le distanze della base minore (near plane) e maggiore (far plane) e fieldView è il campo visivo espresso in radianti (nell’esempio è 0.52 rad o 30°); l’oggetto è mostrato solo se è all’interno del frustrum
  5. crea la classe eu/lucazanini/opengl/shape/Triangle.java

    • riga 17: la variabile vertices contiene le coordinate (x, y, z) dei 3 vertici del triangolo
    • riga 23: la variabile indices ordina i vertici in senso antiorario
    • riga 32: il metodo draw disegna il triangolo
    • riga 33: glVertexPointer definisce una matrice contenente i vertici
    • riga 34: glDrawElements disegna i dati primitivi contenuti in una matrice
  6. lancia l’applicazione
    triangle_emulator

Puoi testare diverse combinazioni di zNear, Zfar e fieldView per il frustrum tenendo presente che se il triangolo è fuori dal frustrum non è visualizzato.
Nelle righe 25 e 26 della classe ShapeRenderer puoi togliere i commenti e verificare come puoi traslare il triangolo con glTranslatef o come puoi ruotarlo con glRotatef; nell’utilizzo di glRotatef se la rotazione comporta che il vertici del triangolo rispetto all’osservatore assumano un ordinamento orario, il triangolo non sarà visualizzato.

Referenze:
GLSurfaceView.Renderer
OpenGL ES 1.1 Reference Pages

2 risposte a “Disegnare un triangolo con OpenGL ES in Android”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.