In questo esempio vedremo come utilizzare i materiali per modificare il colore della superficie degli oggetti, come visualizzare del testo e tracciare delle linee. A programma completato sarà visibile la molecola di acqua che ruota, così come appare nel video della pagina iniziale di questo sito.

GLRenderer.java
public class GLRenderer implements GLEventListener {
float a = 0.0f;
@Override
public void init(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
// imposta le caratteristiche della sorgente di luce 0
float[] lAmbiente = new float[]{1, 1, 1, 1};
float[] lDiffusa = new float[]{1, 1, 1, 1};
float[] lSpeculare = new float[]{1, 1, 1, 1};
float[] lPosizione = new float[]{0, 5, 5, 1};
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, lAmbiente, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, lDiffusa, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, lSpeculare, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lPosizione, 0);
// imposta le caratteristiche del materiale
float[] mAmbiente = new float[]{0, 0, 0, 1};
float[] mDiffusa = new float[]{1, 1, 1, 1};
float[] mSpeculare = new float[]{1, 1, 1, 1};
float[] mEmissione = new float[]{0, 0, 0, 1};
float[] mLucentezza = new float[]{10};
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT, mAmbiente, 0);
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_DIFFUSE, mDiffusa, 0);
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SPECULAR, mSpeculare, 0);
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_EMISSION, mEmissione, 0);
gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SHININESS, mLucentezza, 0);
// attiva la sorgente di luce 0
gl.glEnable(GL2.GL_LIGHT0);
// attiva l'iluminazione
gl.glEnable(GL2.GL_LIGHTING);
// attiva il materiale
gl.glEnable(GL2.GL_COLOR_MATERIAL);
// attiva il test di profondità per disegnare solo parti visibili
gl.glEnable(GL2.GL_DEPTH_TEST);
// imposta il colore di sfondo
gl.glClearColor(0, 0, 0.1f, 0);
}
@Override
public void dispose(GLAutoDrawable drawable) {
}
@Override
public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
GLUT glut = new GLUT();
// cancella l'immagine e il buffer per il test di profondità
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glRotatef(a, 1, 1, 1);
gl.glBegin(GL2.GL_LINES);
gl.glVertex3f(0, 0, -3);
gl.glVertex3f(0, 0, 3);
gl.glEnd();
// ossigeno
gl.glColor3f(0.4f, 0.05f, 0.05f);
gl.glLoadIdentity();
gl.glRotatef(a, 1, 1, 1);
glut.glutSolidSphere(1, 72, 36);
// lettera O
gl.glColor3f(0.4f, 0.4f, 0.4f);
gl.glRotatef(104.45f/2, 0, 0, 1);
gl.glTranslatef(-2.4f, -0.5f, 0);
gl.glScalef(0.01f, 0.01f, 0.01f);
glut.glutStrokeCharacter(GLUT.STROKE_ROMAN, 'O');
// idrogeno 1
gl.glColor3f(0.05f, 0.05f, 0.4f);
gl.glLoadIdentity();
gl.glRotatef(a, 1, 1, 1);
gl.glTranslatef(3, 0, 0);
glut.glutSolidSphere(0.6f, 72, 36);
// lettera H
gl.glColor3f(0.4f, 0.4f, 0.4f);
gl.glTranslatef(1, -0.5f, 0);
gl.glScalef(0.01f, 0.01f, 0.01f);
glut.glutStrokeCharacter(GLUT.STROKE_ROMAN, 'H');
// idrogeno 2
gl.glColor3f(0.05f, 0.05f, 0.4f);
gl.glLoadIdentity();
gl.glRotatef(a, 1, 1, 1);
gl.glRotatef(104.45f, 0, 0, 1);
gl.glTranslatef(3, 0, 0);
glut.glutSolidSphere(0.6f, 72, 36);
// lettera H
gl.glColor3f(0.4f, 0.4f, 0.4f);
gl.glTranslatef(1, -0.5f, 0);
gl.glScalef(0.01f, 0.01f, 0.01f);
glut.glutStrokeCharacter(GLUT.STROKE_ROMAN, 'H');
// legame 1
gl.glColor3f(0.4f, 0.4f, 0.4f);
gl.glLoadIdentity();
gl.glRotatef(a, 1, 1, 1);
gl.glRotatef(90, 0, 1, 0);
glut.glutSolidCylinder(0.15, 3, 24, 10);
// legame 2
gl.glLoadIdentity();
gl.glRotatef(a, 1, 1, 1);
gl.glRotatef(105, 0, 0, 1);
gl.glRotatef(90, 0, 1, 0);
glut.glutSolidCylinder(0.15, 3, 24, 10);
// angolo 104.45°
gl.glColor3f(0.4f, 0.4f, 0.4f);
gl.glLoadIdentity();
gl.glRotatef(a, 1, 1, 1);
gl.glRotatef(104.45f/2, 0, 0, 1);
gl.glTranslatef(1.2f, -0.25f, 0);
gl.glScalef(0.005f, 0.005f, 0.005f);
glut.glutStrokeString(GLUT.STROKE_ROMAN, "104,45");
gl.glTranslatef(0, 75.0f, 0);
gl.glScalef(0.5f, 0.5f, 0.5f);
glut.glutStrokeCharacter(GLUT.STROKE_ROMAN, 'o');
// incrementa l'angolo di rotazione di 1°
a += 1.0f;
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
GL2 gl = drawable.getGL().getGL2();
GLU glu = new GLU();
// imposta la matrice di trasformazione per la proiezione
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45, (float) w / h, 5, 50);
glu.gluLookAt(0, 0, 15, 0, 0, 0, 0, 1, 0);
// imposta la matrice di trasformazione per gli oggetti
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
}
}