Relazione per il secondo progetto del corso di Grafica (C.d.S. Informatica)

Modellazione e resa realistica con Xcmodel

di Leo Orlandini

Indice

Consegna del progetto

Utilizzando i pacchetti xccurv, xcsurf e xcrayt di xcmodel, realizzare un'esperienza significativa di modellazione e resa realistica. Si progetti prima su carta e poi con xccurv e xcsurf una scena composta da oggetti i cui boundary siano definiti da una o piu` superfici NURBS. Si generino alcune immagini realistiche della scena realizzata.

                                                                                                Ritorna all'indice

Breve descrizione della scena realizzata

La scena che ho deciso di relizzare rappresenta l'angolo di una stanza (due pareti e il pavimento) con una mensola in legno sulla quale sono poggiati alcuni oggetti: uno shaker, un vassoio e diversi bicchieri sparsi un po in giro.
La scena appena descritta non e' stata progettata in questo modo fin dall'inizio ma anzi e' stata composta aggiungendo successivamente tutti i vari oggetti che via via mi veniva in mente di realizzare.

                                                                                                Ritorna all'indice

Dettagli sulla realizzazione dei singoli oggetti della scena

Qui di seguito descrivo i principali passi tramite i quali ho ottenuto i vari oggetti della scena :

Pareti e pavimento

1. Per realizzare le superfici delle due pareti (quella frontale e quella sinistra) e del pavimento ho utilizzato xcsurf caricando semplicemente tre piani (tra le superfici Usual disponibili)
2. A questo punto, sempre utilizzando xcsurf, ho ruotato ogni superfice in modo da posizionarla sul piano opportuno 3. Successivamente, sfruttando la funzionalita' translate-cp-to-cp (una delle Numerical Modify disponibili), ho posizionato le tre superfici in modo coerente tra loro
 
Superfici in figura :

parete_sinistra.db
parete_frontale_sopra.db
parete_frontale_sotto.db
pavimento.db

Alle quattro superfici in figura sono state applicate delle texture reperite in Internet .
N.B.: La parete frontale e' stata suddivisa in due superfici distinte per poter applicare due texture diverse alla parte sopra e alla parte sotto :
 
Le texture applicate sono le seguenti :

floor.hr (pavimento)
wall1.hr (parete sinistra e parete frontale sotto)
wall2.hr (parete frontrale sopra)

                                                                                                Ritorna all'indice

Battiscopa

1. Ho realizzato in xccurv la curva profilo del battiscopa
2. In xcsurf ho posizionato tre copie di questa curva (quella posta sulla bisettrice dell'angolo individuato dalle due pareti e' stata scalata di un valore pari alla radice quadrata di 2)
3. Ho poi ottenuto le superfici dei due battiscopa utilizzando la funzione di Extruding due volte

Ripiano (ripiano + bordo)

RIPIANO

1. Utilizzando xccurv ho realizzato la curva (a) che determina la sagoma del ripiano 

2. Ho realizzato by mouse una curva (b) di grado 3 che consiste in un unico punto (4 cp coincidenti) e l'ho traslata in modo che fosse complanare alla curva (a) e che su questo piano fosse interna ad essa
3. Sempre in xccurv ho traslato di una stessa quantita' nelle Y la curva (a) e la curva (b) ottenendo le curve (a1) e (b1)
2. Ho fatto un Extruding tra queste 4 superfici e ho cosi' ottenuto la superfice voluta: il ripiano

BORDO

1. Utilizzando xccurv ho realizzato la curva (b) che costituira' il profilo del bordo del ripiano
2. Utilizzando xccurv ho realizzato la curva (a) che determina il bordo sagomato del ripiano
3. Ho realizzato il bordo tramite un Tubular che utilizza come curva traiettoria la (b) e come curva profilo la (a); perche' la superfice venisse creata in modo corretto ho dovuto traslare la curva profilo in prossimita' dell'origine

Una volta realizzate le due superfici le ho posizionate nel modo esatto con la funzionalita' translate-cp-to-cp :
 
Superfici in figura :

ripiano.db
ripiano_bordino.db

Dopo aver applicato al ripiano una texture e aver assegnato al bordo un materiale adatto :
 
La texture applicata e' :
table.hr
Il materiale assegnato e' :
mat_nero

                                                                                                Ritorna all'indice

Specchio (specchio + cornice)

SPECCHIO

1. Ho caricato in xccurv un piano
2. Ho ruotato e scalato (Numerical Modify) questa superfice in modo da posizionarla su una piano parallelo a quello della parete frontale
3. Sfruttando la funzionalita' translate-cp-to-cp ho posizionato lo specchio sullo stesso piano della parete frontale

CORNICE

1. Utilizzando xccurv ho realizzato una curva (c) che, dopo essere stata traslata e scalata, ho fatto si che ricalcasse il contorno della superfice dello specchio
2. Dopo aver definito un'opportuna curva profilo, utilizzando la curva (c) come curva traiettoria, ho realizzato un Tubular, ottenendo cosi' la superfice desiderata

N.B.: perche' il Tubular funzionasse ho dovuto caricare la curva traiettoria sul piano XY e la curva profilo sul piano YZ. Successivamente ho dovuto ruotare (attorno all'asse X) e traslare la superfice ottenuta in modo da posizionarla
nella posizione corretta

                                                                                                Ritorna all'indice

Vassoio

1. Utilizzando xccurv ho realizzato un quarto della forma del vassoio 
2. Sempre con xccurv ho realizzato la curva utilizzata per il profilo
3. Con uno Swinging ho ottenuto la superfice di un quarto del vassoio 

3. In xcsurf, con valori di scala opportuni (1 e -1) sui vari assi ho realizzato le altre tre parti della superfice
4. Ho assemblato queste quattro superfici utilizzando translate-cp-to-cp

                                                                                                Ritorna all'indice

Bicchieri

Per la realizzazione dei vari bicchieri mi sono rifatto a varie immagini reperite in Internet ed ho cercato di riprodurle il piu' fedelmente possibile. Tutte le superfici sono state ottenute per Revolution partendo dalla definizione, in xccurv, delle varie curve profilo.
Per costruire ogni bicchiere ho seguito i seguenti passi :
1. Per realizzare bicchieri il piu' possibile realistici ho realizzato due curve : il profilo esterno (d) e quello interno (e)
2. Ho fatto poi il Join di queste due curve in modo da ottenerne una unica che descrivesse il profilo totale del bicchiere
3. Tramite Revolution ho ottenuto la superfice desiderata

N.B.: Nel caso del bicchiere 3 ho dovuto separare il gambo dal calice per poter assegnare alle due parti due materiali diversi
 

 

bicchiere1_profilo.db (CURVA2D)


 

bicchiere2_profilo.db (CURVA2D)

bicchiere3_profilo_calice.db (blu)
bicchiere3_profilo_int.db (bianco)
bicchiere3_profilo_gambo.db (giallo) (CURVE2D)

                                                                                                Ritorna all'indice

Shaker

Anche per la realizzazione dello shaker mi sono rifatto a immagini reperite in Internet. Ho ottenuto ogni parte dello shaker per Revolution delle varie curve profilo che mi sono costruito in xccurv ;
 

shaker_corpo_int.db (SUPERFICE)

shaker_corpo_ext.db (SUPERFICE)

shaker_bordino.db (SUPERFICE)

shaker_coperchio.db (SUPERFICE)

shaker_tappo.db 
(SUPERFICE)

A tutte queste superfici ho applicato uno stesso attributo (shaker)

                                                                                                Ritorna all'indice

Precisazioni

Tutte le texture della scena sono state applicate utilizzando la routine Set_projection_texture ( ) della libreria descriptor Prima della chiamata a questa funzione ho opportunamente scalato, ruotato e traslato le varie superfici in modo che la texture fosse applicata nel modo corretto; dopo Set_projection_texture ( ) ho applicato le trasformazioni inverse in modo da riposizionare le varie superfici al loro posto.

                                                                                                Ritorna all'indice

Malfunzionamenti rilevati nel pacchetto xcmodel

1. La funzione di Swinging non funziona, o comunque non funziona nel modo corretto, se la curva traiettoria contiene due o piu' control point coincidenti
2. L'algoritmo di rendering non sempre funziona in presenza di control point con pesi troppo alti
3. In xccurv non e' possibile utilizzare le funzionalita' di Scaling, Translate e Rotation se si sceglie di ricevere l'input tramite tastiera
4. Sembra che le funzionalita' di Swinging e Tubular non funzionino in modo appropriato se la curva traiettoria non sta sul piano XY e la curva profilo sul piano YZ
5. Quando di compila il file .c costruito utilizzando la libreria descriptor sarebbe comodo se venisse scritta anche la riga alla quale fanno riferimento i vari errori

                                                                                                Ritorna all'indice

Immagini renderizzate
 

 
 

 
 

 
 

Ritorna all'indice

Download modello

E' possibile effettuare il download del seguente file contenente il modello realizzato:

orlandini_angolostanza.tgz  (scompattare con il comando: tar zxvf orlandini_angolostanza.tgz)

Ritorna all'indice