I file solid.h e solid.c definiscono la classe Solid che legge da file e memorizza un oggetto solido a facce poligonali
Alcuni file contenenti solidi: cubo.txt, tetraedro.txt, ottaedro.txt, dodecaedro.txt, icosaedro.txt
Scrivete un programma che legge un solido da un file, apre una finestra Glut e visualizzare il solido a facce piene, ciascuna faccia di un colore diverso.
Per modularita' realizzate una funzione a parte che, preso in argomento
un solido, produce le istruzioni OpenGL necessarie a disegnarlo, e
poi chiamate questa funzione all'interno della display callback.
Questa funzione puo' essere una nuova funzione della classe solid.
Sara' utile quando avremo piu' solidi da disegnare: bastera' chiamare
la funzione su ciascuno.
Poiche' disegnamo una scena 3D, e' necessario eliminare le parti nascoste degli oggetti:
Come trasformazioni per adesso lasciate la matrice modelview di
default (quella identica).
Sono coincidenti i tre sistemi di
coordinate di modellazione (in cui e' definito il solido),
coordinate del mondo (globali alla scena, qui costituita solo dal
solido) e coordinate di vista.
Invece la matrice projection di default non va bene perche' il solido
letto da file potrebbe cadere al di fuori del volume di vista
di default, il cubo di diagonale (-1,-1,-1) - (1,1,1).
Calcolate un cubo o parallelepipedo che contenga tutto
l'oggetto e poi assegnatelo come volume di vista con glOrtho.
Si consiglia di usare un volume di vista "abbondante" per
lasciare un po' di spazio vuoto intorno al solido.
Occorre dare un colore diverso ad ogni faccia poiche' non usiamo ancora l'illuminazione. Senza illuminazione ogni faccia ha lo stesso colore indipendentemente dalla sua inclinazione, e tutto il solido appare come una macchia in cui non si percepisce la tridimensionalita'.
Per colorare le facce si possono usare due colori di base e far
crescere uno e decrescere l'altro in funzione dell'indice di faccia.
Esempio:
I due colori sono rosso e verde.
La prima faccia ha solo rosso, l'ultima solo verde, le altre hanno
gradazioni crescenti di verde e decrescenti di rosso.
Ripristinate da quanto fatto in 2D la divisione della finestra in tre aree.
Tra le funzionalita' presenti in area menu', per adesso ignorate quella che in 2D corrispondeva alla scelta della primitiva e quella corrispondente alla scelta di modalita' "grab" o "view".
Ripristinare le funzionalita' di cambio degli attributi
applicandole al solido (per il colore si cambiano i due colori di base).
Occorre aggiungere alla classe che implementa il solido le variabili
per tenere gli attributi relativi al solido.
Ripristinate la visualizzazione a richiesta degli assi cartesiani. Assieme agli assi visualizzate anche (come griglia quadrettata) il pavimento della scena (il piano xy).
Aggiungete un meccanismo per permettere al punto di vista di ruotare attorno alla scena (assi e solido) usando due angoli:
L'utente controlla questi angoli muovendo il mouse a bottone premuto sulla work area:
Permettete all'utente di ruotare il solido su se stesso (assi fermi).
Rispristinate nella menu area la funzionalita' relativa alla scelta della modalita' "grab" o "view":
Permettete all'utente di spostare il solido (tenendo fermi gli assi) avanti e indietro nelle direzioni x ed y (cioe' si sposta sul pavimento).
Nonostante sia stato spostato, nella modalita' "grab" l'oggetto deve continuare a ruotare su se stesso.