Laboratorio di Grafica Interattiva A.A. 2002-3

Esercizio 4

Argomento

Grafica tridimensionale in OpenGL.

Files

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

Esercitazione guidata

Prima tappa

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.

Seconda tappa

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).

Terza tappa

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:

Quarta tappa

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":

Compito

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.