codice:
/************************ includes **************************/#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <stdarg.h>
#include <math.h>
#define GL_GLEXT_PROTOTYPES
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
/**************** prototipi delle funzioni ******************/
void display();
void specialKeys();
/********************* variabili globali ********************/
double rotate_y=0;
double rotate_x=0;
double rotate_z=0;
int nRandom;
int rRandom;
/************************** random **************************/
void randomRotation(){
srand(time(NULL));
nRandom = rand() % 3;
if(nRandom == 0){
srand(time(NULL));
rRandom = 18* (rand() % 4 + 2);
rotate_x += 5*rRandom;
}else if(nRandom == 1){
srand(time(NULL));
rRandom = 18* (rand() % 4 + 2);
rotate_y += 5*rRandom;
}else if(nRandom == 2){
srand(time(NULL));
rRandom = 18* (rand() % 4 + 2);
rotate_z += 5*rRandom;
}
}
/************************** display **************************/
/** funzione display
* Tutte le operazioni di disegno dei cubi verranno effettuate in questa funzione.
* l'idea generale per realizzarli è di disegnare tutte e sei le facce singolarmente
* e posizionarle
*/
void display(){
// Cancellare la schermata e azzerare il buffer Z
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//uso GL_POLYGON per disegnare ogni lato del cubo
// Resetta le trasformazioni
glLoadIdentity();
// Ruota quando l'utente modifica rotate_x, rotate_y e rotate_z
glRotatef( rotate_x, 1.0, 0.0, 0.0 );
glRotatef( rotate_y, 0.0, 1.0, 0.0 );
glRotatef( rotate_z, 0.0, 0.0, 1.0 );
// Altre trasformazioni
// glScalef( 2.0, 2.0, 0.0 ); // Non incluso
/** assegno i colori alle facce
* alla faccia frontale definisco un nuovo colore per ogni vertice. Siccome
* ogni vertice ha un colore diverso OpenGl li mescolerà automaticamente.
* Le altre facce avranno un unico colore.
*/
// Lato multicolore - FRONTALE
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.5, -0.5, -0.5 ); // P1 rosso
glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( 0.5, 0.5, -0.5 ); // P2 verde
glColor3f( 0.0, 0.0, 1.0 ); glVertex3f( -0.5, 0.5, -0.5 ); // P3 blu
glColor3f( 1.0, 0.0, 1.0 ); glVertex3f( -0.5, -0.5, -0.5 ); // P4 viola
glEnd();
// Lato Bianco - POSTERIORE
glBegin(GL_POLYGON);
glColor3f( 1.0, 1.0, 1.0 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glEnd();
// Lato Viola - DESTRO
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 1.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glEnd();
// Lato Verde - SINISTRO
glBegin(GL_POLYGON);
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
// Lato Blu - SUPERIORE
glBegin(GL_POLYGON);
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glEnd();
// Lato Rosso - INFERIORE
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
/**
* glFlush(); e glutSwapBuffers(); inseriscono l'effetto di double buffering.
*/
glFlush();
glutSwapBuffers();
}
void specialKeys( int key, int x, int y ) {
// Freccia destra - aumenta la rotazione di 5 gradi
if (key == GLUT_KEY_RIGHT)
rotate_y += 5;
// Freccia sinistra - riduci la rotazione di 5 gradi
else if (key == GLUT_KEY_LEFT)
rotate_y -= 5;
else if (key == GLUT_KEY_UP)
rotate_x += 5;
else if (key == GLUT_KEY_DOWN)
rotate_x -= 5;
else if (key == GLUT_KEY_F1)
randomRotation();
// Richiedi l'aggiornamento dell'immagine
glutPostRedisplay();
}
/*************************** main ***************************/
int main(int argc, char* argv[]){
// Inizializzare il GLUT e processare i parametri degli utenti
glutInit(&argc,argv);
/** Richiedi una finestra a colori veri con doppio buffering e buffer Z
* lo z-buffer permette di ottenere l'effetto 3d, OpenGL usa un sistema di
* coordinate a tre dimensioni, con gli assi x, y e z. Per dare l'effetto
* che un oggetto sia più vicino a te sarà aumentata la sua posizione
* sull'asse z, e viceversa per allontanarlo
*/
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
/** Creo finestra
* creo la finestra all'interno della quale verranno disegnati i cubi
* il parametro è il nome della finestra
*/
glutCreateWindow("Progetto dadi");
/** abilito test di profondità
* In OpenGl non è abilitata nessuna funzionalità speciale. Per poter
* visualizzare correttamente in 3 dimensioni il programma usando il buffer z
* devo abilitare il test di profondità
*/
glEnable(GL_DEPTH_TEST);
/** funzioni di richiamo
* Funzioni chiamate ogni volta nel loop principale. La funzione di
* visualizzazione ridisegna la scena sulla base delle modifiche alle
* variabili che sono state effettuate dopo la chiamata precedente.
* La funzione specialKeys permette di interagire con il programma.
*/
glutDisplayFunc(display);
glutSpecialFunc(specialKeys);
//Avvio il main loop
glutMainLoop();
return 0;
}