Grafica (C.d.S. Informatica)
2003/04
Relazione del Progetto di Grafica assegnato il 27/05/2003
Modellazione e Resa realistica di una caffettiera
di Leonardo Sassi


immagine iniziale caffettiera


Obiettivo

L'obiettivo del progetto è modellare la geometria di un oggetto con complessità di forma apprezzabile e inserirlo in una scena 3d utilizzando i pacchetti xccurv e xcsurf del sistema xcmodel. Dopo aver modellato la scena si richiede di realizzare lo sene-graph e, sfruttando la libreria descriptor ed il pacchetto xcrayt, di produrre immagini di buona qualità.


Progettazione oggetti della scena e superfici

L'oggetto scelto per la modellazione è la tradizionale caffettiera a base ottagolane. L'oggetto selezionato permette di cimentarsi con più tipi di curve e superfici, infatti si passa dalle curve di grado 1, come quelle delle sezioni ottagonali, a quelle di grado 2, come quelle per il manico, fino ai cerchi di grado 3 per la valvola.
Le superfici più utilizzate sono state quelle ottenute per estrusione, ma è stato necessario sfruttare anche le superfici di rivoluzione e l'interpolazione.
La costruzione della scena comincia dalla costruzione delle curve 2d dei vari elementi. Analizzeremo in dettaglio la costruzione della caffettiera, quindi vedremo come sono stati realizzati tutti gli altri elementi.


La caffettiera è composta in totale da 22 superfici. Tutte le curve da cui sono state generate le superfici sono state prima costruite in due dimensioni utilizzando il pacchetto xccurv, poi si è utilizzato il pacchetto xcsurf per posizionare nello spazio 3d le curve definite e per generare le superfici NURBS. Poichè la classica caffettiera è caratterizzata dalla forma ottagonale si è dovuto generare superfici con spigoli vivi quindi gran parte delle curve hanno grado 1.

La prima superficie è la base della caffettiera ed è stata ottenuta attraverso l'estrusione di due semi-ottagoni. Entrambe le due curve hanno le seguenti caratteristiche: grado 1, 6 control point e partizione nodale uniforme (8 nodi).



Il corpo della caffettiera è stato ottenuto sempre per estrusione delle curve sezione. La parte superiore e la parte inferiore sono due superfici separate. In particolare sono state utilizzate tre curve sezione per entrambe le superfici. Le tre curve hanno: grado 1, 18 control point e partizione nodale uniforme (20 nodi).




Le due superfici che collegano la parte superiore e la parte inferiore della caffettiera sono state ottenute per rivoluzione intorno all'asse z. Le curve utilizzate hanno le seguenti caratteristiche:
curva 1: grado 2, numero control point: 9, partizione nodale uniforme (12 nodi).
curva 2: grado 1, numero control point: 5, partizione nodale uniforme (7 nodi).




Per la valvola oltre alle ormai classiche curve ottagonali sono stati utilizzati tre cerchi a 6 punti per la parte superiore.Sono state eseguite due estrusioni differenti per la superficie ottagonale e per quella circolare.



Per il beccuccio della caffettiera sono state costruite 6 curve sezione e la superficie è stata ottenuta per interpolazione di queste curve. Utilizzando la funzione di skinning (interpolazione) piuttosto che l'estrusione si è ottenuta una curvatura abbastanza regolare della superfice al prezzo di varie prove per valutare la miglior posizione delle curve sezione ai fini dell'interpolazione.

Il coperchio è composto da 5 superfici di cui 3 per la parte sovrastante il beccuccio. Tutte le superfici sono state ottenute per estrusione. Tutte le curve sono di grado 1.




Per il manico in plastica sono state definite 2 curve a formare il profilo del manico. Una curva è di grado 1 e l'altra di grado 2. Di queste due curve è stata creata una copia e alla fine è stata eseguita l'estrusione sulle 4 curve ottenendo una superfice rigata.



Il cardine che collega il coperchio al corpo della caffettiera è forse l'elemento che ha creato più difficoltà. Non è stato possibile realizzare la superfice piatta (superiore e inferiore) dell'elemento utilizzando la stessa tecnica sfruttata per la base ottagonale (vedi Problemi e bug). Per risolvere il problema è stata modellata un'unica curva per il profilo ed una seconda curva (degenere) ottenuta facendo collassare tutti i control point su una retta. A questo punto è stata eseguita l'estrusione.
Le altre superfici non hanno invece creato difficoltà. Naturalmente per le superfici curve è stata sfruttata l'interpolazione di curve piuttosto che l'estrusione.






La stanza

Per la costruzione della stanza ci si è avvalsi di una delle superfici già esistenti nel pacchetto xcsurf: un semplice cubo. L'unica operazione eseguita sulla superfice è stata quella di trimmarla opportunamente in modo da simulare l'esistenza di una finestra. Per trimmare la superfice è stato necessario ridefinire il poliedro di controllo sfruttando la funzionalità di "Selective Insertion" dell'ambiente FFD di xcsurf.





La sedia

Per generare la sedia sono stat modellate 5 curve (oltre alle curve degeneri necessarie per ottenere il sedile e lo schienale attraverso l'interpolazione): una per il profilo delle gambe, una per le parti in metallo sotto il sedile e dietro lo schienale, una per la sezione del sedile/schienale e due cerchi per le tubolari. Le curve sono state opportunamente duplicate e posizionate nello spazio. A questo punto per ottenere lo schienale ed il cuscino si fruttata la funzione "skinning" mentre per le parti in metallo la "tubular".





La tazzina

La tazzina è composta da due superfici:
Il manico, ottenuto per interpolazione di più curve.
La tazzina ottenuta per rivoluzione della curva profilo.





Il piattino, il piatto ed il biscotto

Ho riunito la descrizione delle tre superfici perchè sono state generate tutte nello stesso modo: prima si è costruita una curva sezione e poi si è ottenuta la superfice per rivoluzione intorno all'asse z.







Il tavolo

Il tavolo è composto da quattro superfici: le quattro gambe più il piano. Naturalmente è stato sufficiente generare il piano e una delle gambe per rivoluzione della curva sezione e poi duplicare e posizionare la altre gambe.






Il cucchiaino

Il cucchiaino è probabilmente, nella sua semplicità, l'elemento più complesso da un punto di vista "matematico". E' stato infatti ottenuto per interpolazione di svariate curve, tutte di grado 3.





La zuccheriera

Per realizzare la zuccheriera sono state definite una curva sezione ed una curva traiettoria. E' stata quindi sfruttata la funzione di swinging. Stesso procedimento anche per il coperchio della zuccheriera.





Il quadro

Come per la zuccheriera sono state definite una curva profilo (un rettangolo) ed una curva sezione per generare la cornice con la funzione di "swinging".




Descrizone Scena

La scena è composta dai seguenti oggetti:

Risulta evidente che la scena non rispecchia del tutto le richieste presentando troppi elementi. Il motivo va ricercato nella dipendenza e assuefazione che probabilmente causano la modellazione e la resa con il ray-tracing: la tentazione di inserire oggetti che noi associamo automaticamente ad altri mi ha portato a non fermarmi alla caffettiera. Dopotutto a cosa serve una caffettiera senza tazzine?

Per la resa della scena sono stati definiti i seguenti attributi:

Oltre alla definizione dei materiali e dei colori sono state sfruttate le potenzialità di texturing. In particolare:

Per quanto riguarda l'illuminazione sono state definite solo la luce ambiente e una luce puntiforme. Si voleva simulare la luce del sole che entrava dalla finestra ma non è stato possibile: nonostate la trasparenza della finestra la luce non entrava nella stanza (vedi Problemi e bug). E' stata così posizionata la luce puntiforme sulla finestra (naturalmente dalla parte interna della stanza)


Immagini di Resa







Download

Scarica l'archivio con il progetto e la relazione

Per scompattare l'archivio dare il comando:
tar -zxvf progetto2-sassi.tgz
L'archivio contiene le directory: curve2d: contiene tutte le curve 2d modellate con xccurv
curve2d: contiene le curve 3drealizzate con xcsurf
modello: contiene le superfici create con xcsurf, lo scene-graph "caffettiera.c", il Makefile, l'Imakefile, i file caffettiera.md, caffetiera.vw, caffettiera.arg, le texture utilizzate ed alcune immagini di resa.
relazione: contiene la relazione in html del progetto.


Problemi e bug

I problemi riscontrati nella realizzazione del progetto sono stati essenzialmente due:

  • la resa di una superfice piana realizzata per estrusione di due curve giacenti sullo stesso piano.
  • La resa di una superfice trasparente.

Per quanto riguarda la superficie ottenuta per estrusione in particolare si è utilizzato due curve di grado 1.
Il pacchetto xcsurf crea la superficie senza problemi e ne permette la visualizzazione in tutti i modi: wire-frame, depth-cueing, hidden-line, Phong-shading. Quando invece si tenta la resa della superficie con il pacchetto xcrayt il processo si blocca, senza dare nessun particolare messaggio d'errore, presumibilmentenel momento in cui inizia l'elaborazione della superfice in questione. Altre volte la resa viene effettuata ma l'elemento non compare nell'immagine prodotta.


Per la superficie trasparente, invece, il problema sta nell'effetto poco realistico di una luce bloccata da un vetro. Il problema non dovrebbe essere una cattiva definizione della trasparenza dal momento che gli oggetti dietro il vetro sono ben visibili



Queste sono le immagini della scena illuminata con la stessa luce posizionata però fuori dalla stanza, oltre la finestra. Per queste due rese sono state impostate le caratteristiche di trasparenza della finestra, infatti risulta evidente le visibilità dell'interno della stanza.



Ora attribuiamo anche alla finestra l'attributo "intonaco" in modo da non renderla trasparente.



Risulta evidente che le condizioni d'illuminazione dell'interno della stanza non sono cambiate. Naturalmente anche provando a cambiare gli attributi della luce, intensificandola o riposizionandola il risultato non cambia: la luce non passa attraverso superfici trasparenti
...o perlomeno attraverso quelle da me definite.
Naturalmente non posso escludere con assoluta certezza una mia erronea definizione della trasparenza

Torna su