Grafica (C.d.S. Informatica)
2006/07
Relazione del Progetto 2 di Grafica assegnato il 21/05/2007
Modellazione e Resa realistica di una Mongolfiera
di Roberto Tassi


Scena principale


Obiettivo

Tenendo presente che un algoritmo di ray-tracing produce delle rese super-realistiche, tipicamente di interni, si chiede di progettare un interno in cui collocare almeno un modellino di un veicolo di terra, aria o acqua (esclusi veicoli spaziali e sommergibili) la cui modellazione 3D deve essere particolarmente curata nei dettagli.
La fase di modellazione venga realizzata facendo esclusivamente uso degli strumenti introdotti nel corso e a disposizione in XCSurf; se singoli oggetti sono composti da piu' superfici, queste vengano assemblate nella fase di modellazione (in ambiente XCSurf).
Si realizzi poi lo scene-graph della scena 3D mediante libreria descriptor e script C e si producano:
- alcune immagini fotorealistiche con alcuni primi piani;
- una piccola animazione di al piu' un centinaio di frame con risoluzione 300x300.

Progettazione oggetti della scena e superfici

Come soggetto ho scelto un mezzo di aria inconsueto. Una mongolfiera. La principale motivazione era quella di scegliere un mezzo non comune in modo da presentare qualcosa di non banale e allo stesso tempo esteticamente piacevole.
Le mongolfiere non sono cambiate molto nel tempo. I primi esperimenti di mongolfiera risalgono al primo secolo DC ad opera dei Cinesi, ma non erano dedicate al trasporto umano. Per esso si è dovuto aspettare il 1783 quando i fratelli Montgolfier riuscirono a far sollevare il primo Pallone aerostatico ad aria riscaldata, che prese il loro nome.
Esistono con diversi tipi di vele e ceste. La vela da me scelta è la classica a forma di goccia rovesciata, con 12 sezioni a spicchio mentre la cesta è di tipo rettangolare, ma ne esistono anche di quadrate, rotonde, grandi, piccole. Naturalmente il peso che possono trasportare dipende dai metri cubi di aria calda che la vela può contenere.
Il modello da me proposto è appunto ad aria calda, alimentato da bombole, ed ispirato a quelli di ultima generazione.
Per rendere più interessante la scena è stata creata e ammobiliata una stanza. Presente un cassettone con specchiera, una lampada, un quadro con il poster della mongolfiera rappresentata, due tavolini da parete e pavimentazione in legno. La mongolfiera è stata lasciata libera di librarsi nella stanza per attirare ancor di più l'attenzione dell'osservatore. Anche l'illuminazione è stata studiata per incentrare lo sguardo sulla mongolfiera. Approfondirò questo argomento nella sezione "Descrizione Scena".

Mongolfiere in volo


Mongolfiere in volo


Mongolfiera in riempimento


Mongolfiera in riempimento


Mongolfiera interno

Progettazione oggetti della scena e superfici


La mongolfiera è composta da diverse superfici.
Per prima è stata ricostruita la vela principale. Dato che notoriamente le vele delle mongolfiere hanno quella tipica forma a spicchi, invece di ricorrere ad una semplice rivoluzione di un profilo, si è pensato di creare un singolo spicchio bombato, e poi usare quello per ricreare il resto della vela.
Vediamo il procedimento in dettaglio. A partire dal profilo desiderato creato con xccurv. Volendo ricreare una vela a 12 spicchi, ogni spicchio avrà una curvatura di 30 gradi. Per ottenerlo la curva bidimensionale è stata aperta in xcsurface e riprodotta 6 volte con rivoluzione di 5 gradi sull'asse verticale Z. Poi sono state alterate le linee intermedie per ricreare una sorta di "bombatura". Infine lo strumento estrusione ha creato la superficie finale, che è poi stata copiata fino ad ottenere i dodici spicchi, con passi di rotazione di 30 gradi ognuno sull'asse Z.
Dopo qualche immagine di resa era evidente che cinque superfici per ogni spicchio eran poche e creavano un effetto squadrato sgradevole. Sono quindi state modificati i dodici spicchi e raffinati per due volte al fine di ottenere una superficie più morbida. Purtroppo però questa operazione ha dato buoni risultati soltanto sugli spigoli relativi all'asse verticale.
Ecco qui le fasi principali:




La cesta della mongolfiera è stata disegnata per seconda. È stata disegnata la sezione vista dall'alto in diverse dimensioni attraverso xccurv. Poi con estrusione si è ottenuta tutta la parte laterale. Copiando e scalando si è ottenuta la superficie interna della cesta.
Per il fondo è bastato usare un'estrusione concentrica con profilo di partenza iniziale e dimensione zero finale.
Per il bordino in alto invece è stato applicato lo stesso metodo ma questa volta la destinazione finale dell'estrusione non aveva dimensione zero ma dimensione della superficie interna della cesta.
Per chiarezza guardare le immagini qui sotto.





La struttura a gabbia ed i motori sono stati sicuramente la parte più complessa da realizzare.
La difficoltà non stava tanto nella realizzazione dei singoli componenti quanto nella disposizione dei numerosi pezzi.
Per prima cosa è stata ricreata la gabbia metallica principale. La sua forma è quella di un tronco di piramide a base quadata. I tubi sono stati fatti utilizzando dei cilindri opportunamente scalati e posizionati. Nella parte superiore sono stati anche creati degli snodi di giunzioni per collegare i singoli tubi fra loro. Per ottenerli è bastato creare dei tori e trimmarli verticalmente in modo da tenerne soltanto un quarto. Il tubo centrale visibile nella parte alta serve per il sostegno dei due bruciatori a gas che saranno ricostruiti successivamente.
Sono anche state disegnate quattro protezioni in gomma sui tubi laterali. Utili per non urtare contro il ferro durante le fasi di volo. Le protezioni sono anch'esse cilindriche.
Ecco alcune immagini:



Il momento di creare i motori è arrivato.
La loro realizzazione è stata semplificata dato che non avevo a disposizione dettagli tecnici.
Ogni motore è composto da cinque parti fondamentali. Descriviamole singolarmente, in ordine dal basso verso l'alto. La parte più in basso è la maniglia, realizzata a partire da un toro a cui è stata applicata una deformazione. È bastato poi trimmare la superficie tagliandola a metà per ottenere la maniglia finale (questa operazione in realtà non era obbligatoria dato che la parte tagliata sarebbe risultata interna al motore e quindi non visibile).
La seconda parte è la base del motore. Essa è stata ottenuta a partire da una curva disegnata in xccurv e poi ruotata attorno all'asse verticale Z.
La terza parte sono 4 lamelle di sostegno che servono da attacco per la parte successiva. Le lamelle sono semplici superfici rettangolari. La parte successiva è la camera di combustione del gas, ottenuta semplicemente scalando adeguatamente un cilindro. In ultimo c'è il diffusore, ottenuto utilizzando un tronco di cono.
Ecco qui alcune immagini:





Alla struttura a gabbia sono stati aggiunti alcuni dettagli, come gli anelli di catena e le corde. Infine tutta la struttura è stata montata, motori compresi, per ottenere le giuste proporzioni e rendere più semplice il compito successivo di realizzazione della scena.
Le corde sono semplici superfici cilindriche, mentre gli anelli sono tori deformati. Sono state inserite 12 corde e 8 anelli di catena.
Ecco le immagini che mostrano gli oggetti e il loro assemblamento finale.





In ultimo per completare la mongolfiera sono state creati altri tre oggetti: la veletta paravento, i sacchi, e la bombola del gas.
La veletta paravento è stata ricostruita a partire da un tronco di cono rovesciato che è stato trimmato verticalmente in modo da ottenerne la metà. Esso sarà posizionato sotto la vela principale a fianco dei motori.
I sacchi sono stati ottenuti in modo molto semplice. Sono formati da due curve disegnate con xccurv da cui è stata ottenuta la superficie finale per rivoluzione sull'asse verticale Z.
La bombola infine è composta dalla parte contenente il gas ottenuta anch'essa mediante rivoluzione di una superficie disegnata precedentemente con xccurv, e la parte alta, il manico di sostegno, ottenuto unendo un toro a quattro tubi cilindrici obliqui.
Ecco alcune immagini degli oggetti:







Assemblando il tutto ecco la mongolfiera finale:


Per la creazione del resto della scena, dopo aver creato la stanza di dimensioni approssimative 4x6 metri, ho subito pensato al tipo di illuminazione che volevo ottenere sulla mongolfiera. Dall'illuminazione dipende infatti anche dove vanno posizionate le sorgenti luminose che per maggior realismo devono essere coerenti con la scena stessa. L'illuminazione da me scelta richiedeva una luce morbida, come quella di una lampada abatjour. Per posizionare la lampada serve anche un tavolino. Poi nella scena deve esserci un quadro con l'immagine di una mongolfiera reale. È stato quindi creato un quadro e la relativa cornice. Per l'illuminazione del quadro e dell'altro lato della mongolfiera sono state create dei proiettori appesi al soffitto. Per completare la scena sono state anche aggiunti un cassettone con specchiera e superficie in marmo rosa ed un busto.
La lampada è stata creata in due parti: la base ottenuta attraverso rivoluzione di una curva profilo, e il cappello ottenuto attraverso l'estrusione in verticale di tre sezioni orizzontali di cui quella in mezzo è stata lievemente allargata.
Vediamo alcune immagini:



Il tavolino da parete, poi replicato in due tavolini uguali, è stato ottenuto unendo quattro parti: un piede, due gambe, e il piano. Essendo un tavolino da parete tutte le superfici sono state dimezzate verticalmente, ottenendo un tavolo a semicerchio. Il piede è stato ottenuto per rivoluzione di una curva profilo, mentre tutte le altre superfici sono state ottenute a partire da cilindri, successivamente scalati e disposti.
Ecco alcune immagini:



Per rendere la stanza più completa mi sembrava adeguato un mobile. Ho quindi realizzato mobile a quattro cassetti con specchiera. La realizzazione è stata abbastanza dettagliata anche se i cassetti non sono stati creati realmente, ma solo disegnati su di una texture. La parte bassa del mobile è composta da un grosso parallelepipedo, creato attraverso sei superfici rettangolari singole. Questo per avere più libertà di texturizzazione nelle fase di rendering. Il piano del mobile in marmo è stato creato usando una superficie semplice a parallelepipedo. I piedi frontali del mobile si differenziano da quelli posteriori, che sono semplici parallelepipedi. Sono stati creati con una rivoluzione sull'asse verticale Z di una curva profilo creata usando xccurv. La specchiera è la parte che ha richiesto maggiore attenzione. Prima di tutto si è disegnato il profilo in xccurv, facendo attenzione di mantenere alcuni spigoli chiave, che danno un tono classico al mobile. Poi da quella curva si è ricreato lo spessore della specchiera attraverso estrusione. La superficie anteriore e posteriore sono invece state ottenute facendo un'estrusione concentrica di quella superficie ponendo come destinazione la superficie stessa a dimensione zero. Infine lo specchio è stato ridisegnato in maniera più arrotondata partendo dalla curva del profilo della specchiera, poi in xcsurf è stata trasformata in una superficie usando il solito metodo di estrusione con destinazione la curva puntiforme. In ultimo sono state create otto maniglie. Per fare una maniglia è stato disegnato un attacco a fiore da cui si è ottenuta la superficie attraverso la consueta estrusione centripeta. La maniglia stessa invece è stata ricreata utilizzando un toro deformato opportunamente. Le maniglie sono state disposte direttamente in xcrayt attraverso lo script di configurazione. Questo per velocizzare la composizione delle parti.
Ecco alcune immagini, certamente più esplicative della descrizione precendente:











Per provare una diversa tecnica di realizzazione di oggetti tridimensionali ho provato ad abbozzare un busto porta parrucche (o cappelli). Per farlo sono partito da una curva di profilo da cui ho ricreato la superficie base per rivoluzione. A questo punto ho provato la modellazione gerarchica, selezionando prima la parte zona del volto. Dopo un'operazione di raffinamento della superficie sono passato a selezionare le zone relative ad occhi bocca e naso. Poi attraverso traslazioni (numeriche) di singoli punti di controllo selezionati attraverso il mouse ho cercato di dare forma alle singole parti. Operazione che si è rivelata assai laboriosa e spesso imprecisa. Agevolando alcune funzioni sicuramente diverrà una funzionalità molto interessante per la modellazione degli oggetti.
Ecco il busto ottenuto:

Il quadro è composto dalla cornice e dalla superficie rettangolare interna. Per fare la cornice è stato sagomato un profilo usando xccurv, poi tale profilo è stato utilizzato in xcsurf per creare le quattro parti della cornice. Per generare la superficie di ogni legnetto è bastato usare l'estrusione, spostando il profilo iniziale e finale nei punti desiderati, avendo cura di tenerlo inclinato di 45 gradi nel verso opportuno per creare gli spigoli corretti.
Qui di seguito alcune immagini:





I faretti e la struttura portante dei faretti di illuminazione del quadro e della mongolfiera sono stati creati utilizzando superfici semplici come piani, cilindri e tronchi di coni. Ogni singolo faretto è composto da tre parti: portalampada, diffusore, vetro. Il vetro era necessario perché in questo modo ad esso possiamo associare una texture o un colore diverso dal resto del modello. Il portafaretto direzionabile è molto semplice. È stato ottenuto unendo cilindri e superfici rettangolari. Il cilindretto orizzontale assume la funzione di perno di sostegno del faretto stesso. La struttura di sostegno dei faretti (e dei portafaretti) è stata creata attraverso tubi cilindrici, che verranno fissati al soffitto della stanza.
Per chiarire vediamo alcune immagini:



Per testare alcuni attributi e textures ho usato una sfera. Rimossa poi dalla scena finale.


Descrizone Scena

La scena e' composta dai seguenti oggetti:

  • una stanza
  • un quadro
  • due tavolini
  • un busto
  • una cassettone con specchiera
  • un modellino di mongolfiera
  • una lampada
  • dei faretti con struttura di sostegno

Ecco come sono disposti gli oggetti nella scena:

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

  • intonaco: utlizzato per pareti e soffitto;
  • ottone: applicato alla base della lampada;
  • rame: applicato alle maniglie del mobile;
  • tela: applicato alla vela della mongolfiera;
  • tela bianca: applicato al cappello della lampada e per il vetro dei faretti;
  • tela azzurra: applicato alla veletta paravento della mongolfiera;
  • legno: applicato al mobile e ai tavolini;
  • legno dorato: utilizzato per la cornice del quadro;
  • vimini: utilizzato per il cesto in vimini della mongolfiera;
  • marmo: utilizzato per la superficie in marmo del mobile e per il busto;
  • nero: utilizzato per i sacchi della mongolfiera;
  • bianco: utilizzato per le corde della mongolfiera;
  • grigio: non utilizzato;
  • rosso: utilizzato per le protezioni della struttura in ferro della mongolfiera;
  • azzurro: non utilizzato;
  • cromatura: applicata alle parti in acciaio della mongolfiera ed ai faretti;
  • cromatura_scura: applicato alla bombola a gas, allo specchio del mobile e alla struttura portante dei faretti;

Successivamente alla definizione dei materiali ho provato a texturizzare le parti più importanti dell'ambiente e della mongolfiera.
Le texture utilizzate sono le seguenti:

  • cesta1.hr: utilizzato per la cesta della mongolfiera sia in modalità bump-mapping che normale (decidibile tramite lo script);
  • v[1-6].hr: collezione di textures usate in sequenza per la vela della mongolfiera;
  • mongolfiera.hr: immagine delle mongolfiere in volo utilizzata per il quadro;
  • legno.hr e legno_cassetti.hr: textures di legno in radica di noce, utilizzate per i tavolini e il cassettone;
  • marmo_rosa.hr: marmo rosa per il piano del cassettone;
  • carta_muro2.hr: utilizzata per la carta da parati sulle pareti della stanza;
  • pavimento.hr: pavimento in parquet per la stanza;
Gli attributi e le textures non utilizzate sono rimaste per agevolare eventuali prove. Sono infatti presenti altre textures tra cui due altri tipi di pavimentazione, due altre tipi di carta da parati e un altro tipo di cesta in vimini e di vela.
La fase di texturizzazione ha richiesto un po' di tempo, soprattutto per capire quali sono i parametri gestibili dalle funzioni della libreria di descrizione della scena. Ad esempio impiegando il metodo "set_domain_texture" alle pareti non si otteneva il risultato voluto, in quanto le pareti laterali risultavano in una carta da parati orizzontale, a differenza delle altre due pareti. Ho quindi utilizzato la funzione di proiezione della texture dopo la rotazione opportuna delle pareti. Per il piano in marmo ho voluto ricreare le venature sul lato dello spessore tipiche del taglio del marmo. Per farlo ho ruotato il piano opportunamente su tutti e tre gli assi prima di proiettare la textures, così da ottenere l'effetto voluto. Per la cesta è possibile scegliere dallo script se visualizzarla col bump mapping o meno. Il bump mapping permette un notevole aumento di dettaglio della superficie ma, a mio parere, il risultato non è molto in linea con l'illuminazione generale dell'ambiente. Inoltre tale funzione non permette di texturizzare diversamente l'oggetto, ovvero, se si usa il bump mapping, non si può applicare all'oggetto un'altra texture, nonostante il bump mapping non sia un effetto di texturizzazione, ma sia in realtà un effetto per aumentare il dettaglio di una superficie e dare l'illusione che sia composta da molti più punti. Per tale motivo ho lasciato la possibilità di scegliere se utilizzare tale effetto o meno. Avrei voluto utilizzarlo anche per la pavimentazione, ma per lo stesso motivo i risultati non mi piacevano, e così ho utilizzato soltanto una texture normale. Sul mobile per dare l'impressione che vi siano quattro cassetti, ho modificato una textures di legno attraverso un software di fotoritocco per disegnarvi sopra i cassetti e i buchi per le chiavi.

L'illuminazione è uno dei punti che mi ha divertito maggiormente. Questo perché posizionando in un certo modo le luci è possibile dare un certo effetto alla scena, e convogliare l'attenzione dello spettatore su di un certo dettaglio. In particolare io volevo che gli attori della scena fossero soltanto due: il modellino e il quadro. Per illuminare la mongolfiera è state usate due luci.
La prima luce è anche quella che illumina l'intera scena: una lampada "abatjour" posta vicino alla parete di sinistra, che emette una luce morbida e diffusa, di colore giallo-arancio, non troppo alta, in modo da illuminare la parte sinistra della mongolfiera, e la maggior parte della stanza, ma non tutta.
La seconda luce invece, serve a dare contrasto alla mongolfiera rispetto allo sfondo scuro, ed è quella del faretto posto sul soffitto vicino alla parete di destra. Ho simulato dei faretti alogeni, con una temperatura colore più alta, bianco-azzurro. In questo caso si tratta di una luce di tipo "spot", o ad"occhio di bue".
Il quadro è stato invece illuminato da un altro faretto uguale al precedente, posto al di sopra di esso, sul soffitto. In questo modo si è quindi ricreata un'ambientazione da interno sera, creando un'atmosfera piuttosto misteriosa e calda.


Immagini di Resa


















Immagini di Resa

Gif con risuluzione 300x300, cliccaci sopra per visualizzarla a risoluzione maggiore:


È stato realizzato anche un video a partire dalle stesse immagini di resa in risoluzione 500x500.
È necessario un riproduttore multimediale con supporto a Mpeg4 per visualizzarlo (ad esempio Vlc).
Clicca qui per aprire il video.

Per velocizzare la conversione da file .ppm a .avi ho creato due script. Il primo converte i files .ppm in .jpg, il secondo usa le immagini .jpg per creare il video.

Download

Scarica i sorgenti del modello qui:
mongolfiera.tgz


Problemi e bug

Quello che mi è piaciuto meno è il tipo di interazione con l'utente. È evidente la precisione del motore matematico di calcolo delle curve e superfici, ma se poi queste sue capacità sono limitate dall'interfaccia utente, non si può godere appieno di ciò che si ha a disposizione. In particolare mi riferisco al sistema interattivo di xcsurf, praticamente inutilizzabile a causa delle continue comparse di menu che dicono "clicca il bottone X per continuare". Altro punto a sfavore è l' "Undo" che funziona soltanto una volta. Non ho poi capito come mai non si è di catturare l'evento "chiudi finestra" quando si preme la croce dal window manager. Ho apprezzato il linguaggio di descrizione testuale della scena. Anche se all'inizio ero scettico all'idea di dover "programmare" la scena, in realtà questo linguaggio ha molte potenzialità dato che rende veloce diverse cose, come la replicazione di un alto numero di oggetti uguali, e la loro disposizione attraverso cicli for o while.
Un altro piccolo difetto che ho trovato riguarda le superfici di tipo ".dbe", ovvero quelle che hanno subito un trimming. Tali superfici compaiono integralmente nella finestra control-net di xcsurf mentre invece dovrebbero comparire parzialmente. In tal modo non è ben chiaro quale parte sia rimasta e quale sia invece la parte fantasma.
Una parte veramente scomoda è quella relativa alla selezione dei ControlPoint tramite mouse sulle superfici: se si devono selezionare 40 control point e se ne sbaglia anche solo uno si deve ricominciare da capo! Sarebbe stato sufficiente deselezionare con un ulteriore click. Sarebbe molto comodo anche la possibilità di utilizzare il mouse per selezionare delle aree, disegnando rettangoli un po' come si è abituati a fare nei browser di files dei sistemi operativi.
Un'altra idea buona, a mio parere, sarebbe quella di dedicare un tasto del mouse alla rotazione della scena, e la rotazione della rotellina centrale allo zoom.
Sarebbe giusto anche aggiungere in xmovie la possibilità di esportare file PPM, che è già presente ma non chiara nel momento del salvataggio dell'immagine. Sarebbe utile anche poter esportare in formato jpeg.
Altro piccolo punto è la mancanza di quello che era xbool, ovvero la possibilità di aggiungere o sottrarre superfici ed aree fra loro. Sarebbe logico integrarlo in xcsurf a mio parere.
In oltre non sono riuscito ad ottenere un effetto di trasparenza reale sulla lampada. Questo perchè riesco a creare una tela trasparente, ma, posizionando la luce all'interno della lampada essa non filtra attraverso la tela. Tutta la scena risulta completamente buia. In pratica manca l'effetto "attenuazione" delle luci ad opera di superfici. Ho dovuto quindi posizionare la luce al di fuori della lampada stessa, leggermente sopra di essa. L'effetto è così simile ad avere la luce all'interno della lampada stessa. Sarebbe bello inoltre poter attivare un sistema di raytracing con simulazione dei fotoni al fine di ottenere le "soft shadows".


Torna su