Modellazione e resa realistica con Xcmodel
di Leo Orlandini
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.
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.
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 :
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
|
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)
|
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
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
|
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 |
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
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
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)
|
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
|
A tutte queste superfici ho applicato uno stesso attributo (shaker)
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.
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
|
|
|
|
|
|
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)