PDA

Visualizza la versione completa : C++ openGl aggiungere texture a cubo


thorberg
11-10-2017, 17:42
Questo è il mio programma, è un cubo che può ruotare tramite le frecce direzionali e in modo random tramite il tasto f1. Ora, non riesco proprio ad aggiungerci una texture (che sia un'immagine unica o 6 immagini diverse). Qualcuno potrebbe aiutarmi? Grazie mille

/************************ 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;
}

Loading