Omaggio a Salvador Dalì
Progetto di Grafica in XCmodel
Bruno Fanini #123157


SOMMARIO

 

1 - PRE-MODELING

Obiettivi

Utilizzando i pacchetti xccurv, xcsurf e xcrayt di xcmodel 3.0, realizzare un'esperienza significativa di modellazione e resa realistica.

Si progetti prima su carta e poi con i pacchetti messi a disposizione un'intera scena composta da oggetti i cui boundary siano definiti da una o piu` superfici NURBS. Si richiede la modellazione di almeno un oggetto (una o piu` superfici) di forma complessa e stilisticamente apprezzabile. Si generino alcune immagini realistiche della scena realizzata con particolare attenzione ai dettagli dell'oggetto piu` complesso che si e` modellato.

Scelta del Modello

La scelta del modello e della scena si è rivelata più impegnativa del previsto, in quanto la mia idea era di modellare qualcosa di non banale. Ho valutato molti oggetti reali che mi circondavano, con possibili modifiche, semplificazioni, ottimizzazioni a livello di modellazione, ecc.. ma la scelta si è diretta verso qualcosa che fosse meno reale, ma non completamente astratto, esteticamente apprezzabile e soprattutto originale. Nel campo artistico ci sono vari modelli che è possibile estrapolare da un contesto bidimensionale, la strada di Escher - ad esempio - è stata già battuta tante volte con l'opera "Ascending & Descending". Poi un giorno, osservando la struttura molto particolare e originale degli "orologi molli" presenti nella famosissima opera di Dalì, ne ho valutato possibili modellazioni con superfici NURBS e ho cominciato a progettare la scena.

Opera originale : "Persistenza della Memoria"

Sicuramente uno dei quadri più famosi di Dalì, nel quale l’invenzione degli «orologi molli» diviene una felice intuizione di grande fascino. Il tempo, inteso nella razionale successione di istanti meccanicamente determinati, viene messo in crisi dalla memoria umana, che del tempo ha una percezione che, in fondo, tanto razionale non è. La dilatazione o la contrazione del senso del tempo è una caratteristica che dipende dalla singola individualità, ma è sensazione certamente universale quella di avvertire lo scorrere del tempo secondo metri assolutamente personali (Da un articolo trovato sul Web).

Progettazione e Descrizione della Scena

Questi i requisiti che mi sono posto durante la progettazione della scena, avvenuta facendo degli schizzi su dei fogli, abbozzando (possibili) forme e superfici :

Come già detto, osservando il dipinto, ho notato che gli "orologi molli" si adattano perfettamente ad una modellazione (abbastanza complessa) con uso di NURBS. Tuttavia, la scena originale è abbastanza spoglia (soprattutto nella parte destra) quindi sorge il bisogno di ideare ed aggiungere nuovi elementi.

L'obiettivo è quello di mantenere le caratteristiche principali del quadro, come l'ambientazione tetra e desolata e soprattutto rimanere in tema con l'idea di fondo del dipinto (il tempo). Grazie alla visione di altre opere di Dalì e alla consultazione di critiche, ho ideato, stabilito e successivamente creato alcuni elementi inseribili nella scena. La clessidra è ovviamente in tema, il mezzobusto anche (i corpi umani o parti di esso appaiono frequentemente in altre opere del pittore), anche il supporto a "U" appare spesso (vedi dipinto "L'enigma di Guglielmo Tell", "Sleep", e altri). Gli altri oggetti rimanenti sono sempre frutto della mia "contorta" fantasia.

La scena è dunque la seguente : un terreno scuro con un cielo abbastanza nuvoloso, sono presenti dei blocchi (parallelepipedi) e su uno di essi è adagiato un orologio molle. Da questo blocco inoltre nasce un tronco d'albero secco sul quale è appeso un altro orologio "liquefatto". Fin qui si rispecchia il quadro originale di Dalì. Di mia creazione invece sono la cornice dorata (al centro) nella quale è presente il vero dipinto, il mezzobusto di metallo liquido con la testa a forma di clessidra e le dita a forma di lancette d'orologio che sorge da terra ad indicare il quadro, la clessidra gigante di pietra e le colonne sullo sfondo. In basso infine, è adagiato il terzo orologio dal quale si sviluppa un serpente d'oro che rappresenta una curva NURBS con la sua poligonale di controllo in vetro.

Schema Generale di Progettazione

Questo è lo shema di lavorazione : i pacchetti XCcurv e XCsurf per la modellazione di curve e superfici, XCrayt per il rendering e Photoshop per la creazione/modifica di Textures, che sono poi state convertite in formato .ppm e successivamente in .hr da Xmovie.

2 - MODELING

Modellazione di Curve e Superfici usando XCcurv e XCsurf

Usando il pacchetto XCcurv è possibile creare curve dalle forme più disparate. Nel progetto in generale sono tutte di grado 1, 2 o 3. In XCsurf sono state successivamente generate le varie superfici usando principalmente : Revolution, Skinning, Tubular, Usual e varie deformazioni fornite dal programma.

ENVIRONMENT

Per creare l'environment ho usato uno SkyDome (una cupola), mentre per il terreno un semplice piano fornito tra le superfici "Usual" in XCsurf. Lo stesso per i blocchi, che sono stati generati traslando e deformando un semplice cubo sempre nelle "Usual".

OROLOGIO

Il primo e il più importante oggetto da modellare è l'orologio, costituito da 4 parti principali : la rotella, il corpo, il disco e le lancette.

Rotella

Le curve 2D per la creazione della rotella caricate con XCcurv : clock_pt1.db (verde grado 2), clock_pt2.db (blu grado 2) e clock_pt3.db (arancio grado 3).
La rotella dell'orologio in XCsurf è ottenuta quindi per Skinning delle curve sopra, traslate di opportuni ΔZ (le curve sono giacienti sul piano XY). Visualizzazione superficie con metodo Hidden Line.

Corpo Orologio

 

Queste sono le due curve da cui si otterranno per rivoluzione il corpo dell'orologio (bianco) e il disco (blu). Nella prima, di grado 3, alcuni Control Points (CP) sono stati spostati e modificati di peso (screenshot parametri in XCcurv, immagine sotto) per aumentare la spigolosità in alcuni tratti, mentre la seconda ha grado 1 (2 CPs).

La superficie finale in XCsurf ottenuta per rivoluzione. Aggiunta e posizionata la rotella tramite rotazione e traslazione. Queste due superfici - insieme al disco - saranno poi la base per creare gli orologi distorti "molli".

Lancette

Le lancette sono generate per rivoluzione da una semplice curva di grado 2 definita da 4 CP (in giallo).

TRONCO D'ALBERO

Questa parte mostra come vengono generate le superfici che compongono il tronco d'albero e come ad alcune di esse siano state applicate distorsioni sui poliedri di controllo.

Tronco base  

Il tronco base è ottenuto per rivoluzione da una semplice curva, successivamente (seconda immagine a destra), è stato deformato grazie ai tools interattivi di FFD (Free Form Deformation) presenti in XCsurf.

Le deformazioni usate sono il Tapering e Translating di alcuni CP del poliedro di controllo. Generalmente è necessaria un'immensa precisione e pazienza muovendo CP del poliedro con il mouse, ma la superficie finale ottenuta è così più imperfetta e rende meglio un tronco d'albero.

Ramo principale  
Vengono caricate le curve 3D del ramo, disposte lungo l'asse X e perpendicolari ad esso...
Per Skinning delle suddette curve, si ottiene il ramo principale. Poichè la forma era troppo morbida, a metà ramo, per accentuarne la flessione, sono stati aumentati i pesi di alcuni CP della superficie.

Questo sarà il ramo sul quale verrà adagiato il secondo orologio "molle".

Ramo secondario  
Stessa tecnica di Skinning per il rametto secondario.
Risultato Finale  
Ed ecco il risultato finale, posizionando le superfici. (Visualizzazione Hidden Line).

CLESSIDRA

La clessidra è costituita da 8 superfici, tutte ottenute per Revolution di curve. Nella scena ne sono presenti due : una gigante di pietra ed una d'oro, situata al posto della testa del mezzobusto di metallo liquido.

Base  
La curva di grado 2 che genera per rivoluzione la base della clessidra. Per accentuare alcune spigolosità sono stati aumentati i pesi di determinati CP. Successivamente, per ottenere la superficie superiore della clessidra, basterà applicare una trasformazione in XCsurf di "Flip Vertical" ovvero uno Scaling (1,1,-1).

Vetro Clessidra e Sabbia

 
Le curve di grado 3 che generano il vetro della clessidra (curva verde) e la sabbia contenuta all'interno (curva bianca). Da notare come quest'ultima sia per un tratto adiacente al vetro.

Asticelle

 
La semplice curva di grado 2 dalla quale - sempre per rivoluzione - si ottiene l'asticella della clessidra. La superficie generata verrà poi quadruplicata con opportune traslazioni (le asticelle sono 4).
Risultato Finale  

Questa è la Clessidra finale in WireFrame. Sono state effettuate le varie rivoluzioni attorno all'asse Z. Per le traslazioni delle 4 asticelle (A1, A2, A3, A4) si è determinato un certo k di spostamento, applicando le seguenti traslazioni per il loro posizionamento : A1=(k,k,0), A2=(k,-k,0), A3=(-k,k,0) e A4=(-k,-k,0). Immagine sotto : visualizzazione clessidra con metodo Phong Shading.

DIPINTO CON SUPPORTI

Il dipinto originale di Dalì è situato in una cornice d'oro montata su 3 supporti in legno più uno orizzontale.

Cornice  
La cornice si ottiene con una superficie Tubular. Nell'immagine, la curva profilo di grado 2 caricata in XCcurv. La curva traiettoria è un semplice rettangolo (una curva chiusa di grado 1).
Questo è il risultato. Si aggiunge un semplice piano (fornito da XCsurf nelle superfici "Usual"), posizionato con opportune trasformazioni di rotazione, traslazione e scaling.
Supporti  
I supporti alla cornice sono tutti ottenuti per rivoluzione : i primi tre dalla curva (in giallo) di grado 2 e il quarto supporto orizzontale, dalla curva (in bianco) sempre di grado 2 rivoluzionata attorno all'asse X.
Risultato Finale  
Il risultato in XCsurf applicando varie trasformazioni alle superfici create. I 3 supporti sono stati inclinati di 20° rispetto all'asse verticale (Z), due lungo il piano XZ e uno lungo il piano YZ. Il quarto supporto è stato traslato e scalato per incastrarlo in maniera opportuna.

Nella scena finale, al piano verrà applicata la domain texture dell'opera originale.

FOGLIO CON SCHIZZO

Nella scena, a terra vicino alla cornice sui supporti, è presente un foglio con uno schizzo del dipinto originale. La superficie finale si ottiene deformando un piano caricato dalle "Usual". Per creare la piega si effettua un Refinement locale : il tool usato è il "Selective Insertion" richiamato più volte sul lembo. Il risultato è mostrato in figura ( Poliedro di controllo e Phong Shading ).

MEZZOBUSTO

Il mezzobusto di metallo liquido è una composizione di varie superfici abbastanza complesse che richiedono molte trasformazioni e modifiche di vario genere prima di raggiungere il risultato desiderato.

Torace  
Nel progetto il torace viene ottenuto per Skinning di curve di grado 2. Per ottenere l'incavo tra i pettorali sono stati duplicati i CP centrali. La figura mostra uno screenshot in XCcurv
In XCsurf, come vengono disposte le curve 3D lungo l'asse Z, duplicandone alcune e applicando degli scaling per definire meglio la superficie finale.
Il risultato finale dopo lo Skinning.
Braccia  
Ogni braccio è costituito da due parti, entrambe ottenute per rivoluzione di semplici curve di grado 2 (in blu e in bianco), in seguito vengono posizionate tramite opportune traslazioni, rotazioni e scaling.
Risultato Finale  
La figura mostra come si presenta in Phong Shading il mezzobusto. Il braccio sinistro è poggiato a terra, mentre il destro è teso a indicare qualcosa.

SUPPORTO A "U"

A sostegno del braccio destro c'è un supporto in legno, la cui forma è ispirata ad un supporto molto frequente in altre opere del pittore.

La superficie è la composizione di un semplice cilindro e una tubular con un profilo circolare. Immagine in Phong Shading.

   

MANO

La mano con quattro dita a forma di lancette è composta da 9 superfici e richiede molta pazienza per varie rotazioni e trasformazioni di vario tipo. Nella scena finale sarà di metallo come il busto e dovrà indicare il dipinto sulla cornice.

Il palmo della mano è una sfera caricata dalle "Usual" successivamente deformata con lo spostamento di alcuni CP del poliedro di controllo.

Le lancette sono le stesse usate per gli orologi, opportunamente scalate, ruotate e traslate.

Come si presenta la mano in Phong Shading

COLONNA

Le colonne sono state aggiunte a fine progetto per enfatizzare la scena e sono state posizionate iterativamente (vedi Descriptor). Ogni colonna è generata per rivoluzione.

La curva di grado 2 e la superficie generata per Revolution.

SERPENTE NURBS

Questo oggetto tubolare si sviluppa dal Clock 3 (l'unico non distorto) e rappresenta una curva con la sua poligonale di controllo in vetro, omaggio alle NURBS.

Le due curve caricate in XCcurv : entrambe hanno gli stessi CP ma la curva blu ha grado 3, mentre quella bianca ha grado 1. Ovviamente quest'ultima ne rappresenta la poligonale di controllo.
Questo è il risultato finale ottenuto con Tubular, usando una semplice curva cerchio come profilo e come traiettoria prima la curva di grado 3 e poi quella di grado 1 (scalando il cerchio).

CLOCK LIQUIFY TUTORIAL

Questa sezione mostra come effettuare le distorsioni agli orologi per renderli molli e dare il senso di liquefazione. Una delle parti più impegnative di tutta la progettazione, soprattutto per via dell'immensa precisione richiesta. L'idea da tenere presente comunque durante questa fase, è quella di liquefare l'oggetto e dargli un senso di "pesantezza"...

CLOCK 1
Per attuare la distorsione al primo orologio, si agisce sul poliedro di controllo originale. Usando il comando di selezione CP in XCsurf, si ruotano i CP centrali (in blu) di un certo angolo sull'asse Y, successivamente selezionando altri CP (in rosso) con il "Control Net Translation" si effettua lo spostamento lungo l'asse Z (come mostrato in figura).

Con varie operazioni di selezione CP e traslazione, si creano altre distorsioni a seconda delle necessità : nel caso del primo orologio si è distorta anche la parte in basso poichè appoggiata sul terreno (vedi CP selezionati in rosso).

L'ultima cosa da fare è modificare anche il disco, prestando attenzione alle intersezioni con la superficie sopra distorta. Nell'immagine a destra si vede il risultato finale del primo clock "liquefatto". La domain texture applicata al disco, per essere impostata in modo corretto, sarà distorta con una trasformazione polare.

CLOCK 2

Il secondo orologio distorto nella scena è appeso al ramo del tronco d'albero. Poichè la distorsione è maggiore in questo caso, si attua un Refinement generale del poliedro di controllo per una maggiore precisione della curvatura. Successivamente, con molta pazienza, si effettuano le traslazioni e rotazioni in maniera molto simile al primo clock.

Il disco stavolta è stato ricavato dallo stesso orologio distorto, effettuando un Trimming della superficie (figura a destra).

Nell'immagine sottostante, il risultato finale aggiungendo alcuni elementi aggiuntivi come le gocce, la lancetta e la rotella. Nella scena finale l'orologio verrà leggermente scalato in Z per accentuarne la "pesantezza".

3 - SCENE SETUP

Descriptor

Il descriptor è il file persist.c che descrive la scena. Una volta compilato, viene creato un eseguibile che genera il file persist.md. Queste operazioni vengono eseguite in ogni caso dal makefile o lanciando lo script "./rebuildmodel <nome_modello>". Il file .md può essere infine caricato in XCrayt mostrando la gerarchia degli oggetti ed eseguendo con previo settaggio di alcuni parametri il Rendering generando un'immagine persist.hr.

Poichè il descriptor è soggetto a continue modifiche in fase di realizzazione e prove di resa, ho aggiunto alcune variabili globali in testa al file per velocizzare e semplificare l'immissione di alcuni dati suscettibili di repentine modifiche (come le componenti RGB della luce ambiente, ambient background, alcune textures, ecc...).

La descrizione della scena tramite un descriptor in linguaggio C, permette interessanti parametrizzazioni. Nel mio progetto ad esempio, le colonne sono disposte nello spazio in modo iterativo tramite un ciclo for :

#define NUMCOLUMNS  <n>

...

// Un array di ITEMS per le Colonne...
ITEM column[NUMCOLUMNS];

...

for (i=0; i<NUMCOLUMNS; i++){
    // Leggi la stessa superficie per ogni colonna...
    column[i] = read_nurbs("column.db");
    set_attribute(column[i],stone);

    // Trasformazioni (Rotation, Scaling) per settare la projection texture...
    set_projection_texture(column[i],stone,"marble1.hr",Z_AXIS,TRUE, 0.35,0.7);
    // Trasformazioni inverse...

    set_scale(column[i],2,2,2);

    // <k> è il fattore moltiplicativo per distaziare le colonne...
    set_translate(column[i],(5.9-(i*k)),-6.0,0);
}

...

for (i=0; i<NUMCOLUMNS; i++) scene = insert_in_list(scene,column[i]);

 Sotto questa ottica si può parametrizzare una scena completa, come nella scena extra allegata a questo progetto...

Environment Settings

La luce ambiente è stata impostata con le componenti RGB (0.1, 0.6, 0.6) e un'intensità del 70%. La sorgente luminosa è una distant light (1.0, 1.0, 0.8) che rappresenta il sole, con intensità del 100%. Altre sorgenti point light non usate sono abilitabili dal file descriptor.

Materiali

Per la definizione dei materiali nel descriptor sono necessarie molte prove di rendering da angolazioni diverse ed eventualmente con più sorgenti luminose. Spesso si devono ritoccare molti parametri per raggiungere il risultato desiderato, come i coefficienti di rifrazione, trasparenza, riflessione, ecc... Quelli usati nella scena sono : gold, silver, sand, wood, glass,...

Texturing

Durante la creazione del progetto e della scena, è sorto il bisogno di dare più realismo agli oggetti aggiungendo textures. Molte di queste sono state trovate sul web ( un archivio molto organizzato con vari tutorial si trova all'indirizzo: http://astronomy.swin.edu.au/~pbourke/texture/ ) e selezionate con cura dopo molte valutazioni di risoluzione, qualità, realismo, inclinazione della luce, ecc... Alcune di queste sono state poi modificate tramite Image Processing. Le textures sono poi state convertite prima in formato .ppm e successivamente, tramite Xmovie, in formato .hr (l'unico accettato da XCrayt).

Qui segue la lista di textures (in formato ridotto) e il metodo di applicazione :

DISCO OROLOGIO ( Passo 1 )

La texture del disco dell'orologio è stata creata da me con Photoshop. Ho usato il filtro "Liquify" nella parte bassa (ore 7,6 e 5) per accentuare l'effetto di liquefazione.

DISCO OROLOGIO ( Passo 2 )

Applicazione = Domain Texturing

La geometria distorta del disco (gli orologi sono molli) fa sì che applicazioni proiezionali o altro non siano adatte. Data la struttura del dominio UV ho però dovuto applicare una distorsione polare per far sì che la texture sia applicata correttamente.

La sequenza di trasformazioni : Flip Vertical -> Polar Coords (Polar to Rectangular) -> Rotate 90°, porta alla texture finale nell'immagine a sinistra.

SKY

Applicazione = Domain Texturing

Nel file descriptor persist.c la texture è settata e distorta sullo SkyDome in modo che l'illuminazione delle nuvole rispecchi la direzione della distant_light (il sole).

 

TERRAIN

Applicazione = Projection Texturing Z_AXIS

La proiezione della texture è settata lungo l'asse Z e come si nota da alcune rese, anche questa è posizionata in modo da rispecchiare la direzione della sorgente luminosa.

 

SAND

Applicazione = Domain Texturing

Usata per la sabbia all'interno della clessidra d'oro.

CLEPSYDRA ROCK

Applicazione = Projection Texturing

Usata per la clessidra gigante fatta di pietra.

MARBLE

Applicazione = Projection Texturing

Usata per l'effetto di sporco sul mezzobusto di metallo liquido e sul secondo blocco.

WOOD

Applicazione = Projection Texturing

Usata per il primo blocco (quello con l'orologio molle) e per i supporti della cornice.

SKETCH

Applicazione = Domain Texturing

Texture creata da me applicando vari filtri in Photoshop al dipinto originale. Usata per il foglio con schizzo.

 

4 - RENDERING

Parametri usati in XCrayt

In generale per tutte le rese sono stati usati gli stessi parametri :

Rese

Le rese seguenti sono state convertite in formato JPG di masssima qualità, generalmente in 600 x 600 o 800 x 800. La resa dalla camera principale è in 1024 x 1024.

Clessidra d'oro : Si nota la domain texture della sabbia all'interno, gli effetti di trasparenza e rifrazione. Inoltre la texture unita al materiale metallico genera un effetto di "sporco". Mano : Si notano le dita a forma di lancette e i vari effetti di riflessione della clessidra gigante. Vista generale degli Orologi molli : Si nota l'effetto di liquefazione e il senso di "inconsistenza" della materia. Clock 1 (vista frontale-alta) : notare la liquefazione della texture in basso.
       
Clock 1 (vista lato) Particolare Clock 2 (vista frontale-alta) Clock 2 (zoom) Clock 2 (vista dal basso) : Si nota la curvatura dello SkyDome.
       
Clock 3 e Serpente NURBS d'oro : il terzo orologio è di dorso, con una curva NURBS d'oro uscente con la sua poligonale di controllo fatta di vetro. Mezzobusto con colonna (vista frontale) Mezzobusto (vista lato) Particolare mezzobusto e braccio : Si notano le moltepici riflessioni e l'effetto metallo liquido.
       
Cornice (vista frontale) Cornice (altra vista) Disegno con schizzo : Notare che la texture del terreno è disposta con la stessa inclinazione della sorgente luminosa. Persistence of Liquids (camera principale) : 1024 x 1024

Rese extra (scena parametrizzata)

Colonnato con parametri di perturbazione nulli. Colonnato con alti parametri di perturbazione.
Altre rese del colonnato parametrizzato...

5) XCMODEL

L'esperienza in XCMODEL

L'aspetto poco amichevole inizialmente può scoraggiare, ma in definitiva l'intero sistema è molto buono e una volta presa confidenza con alcuni meccanismi (certe volte poco intuitivi) permette di costruire interessanti scene, semplici o abbastanza complesse.

XCSURF - Possibili Ottimizzazioni

XCRAYT - Possibili Ottimizzazioni

Tempi di Lavorazione

L'intero progetto (insieme alla scena parametrizzata), ha richiesto circa un mese e mezzo di lavoro effettivo, molto del quale dedicato alla disposizione degli oggetti nella scena e a ripetute prove di rendering per il settaggio ottimale dei parametri (le immagini shot*.hr contenute in hr/ ne mostrano l'evoluzione).

Bruno Fanini ( bfanini #123157 ) - Giovedì 13 Maggio 2004