METODI NUMERICI per la GRAFICA
2001


RIFLESSIONI

 

Progetto di
ROBERTO SOTTILE
 

INDICE


GALLERY
 

SCOPO

Scopo del progetto era la modellazione e resa realistica di uno o piu' oggetti solidi di forma non banale tramite curve e superfici SPLINE e/o NURBS, utilizzando allo scopo le potenzialita' offerte dai pacchetti del sistema xcmodel versione 2.0. Io ho utilizzato i seguenti moduli:
 

XCCURV Creazione di curve SPLINE 2D
XCSURF Creazione di superfici a partire dalle curve generate con XCCURV
e di curve SPLINE 3D
XCRAYT Creazione e visualizzazione di scene complesse
Front/End (attraverso XHRAYT) per HRAYT, il motore ray-tracing
XMOVIE Importazione/esportazione immagini dal formato .hr proprietario al formato standard .ppm

OGGETTO

La mia scelta e' ricaduta su un manichino in legno, di quelli che si usano per il disegno artistico di forme umane in movimento.
Esso e' composto di 29 parti: 6 per ogni arto (spalla o anca, braccio o gamba, gomito o rotula, avambraccio o polpaccio, polso o caviglia, mano o piede) e 5 per il corpo (bacino, vita, busto, collo, testa). La particolarita' di un oggetto simile e' nella possibilita' di articolare i movimenti grazie a snodi posti a livello di: caviglia, rotula, anca, vita, spalla, gomito, polso, collo. D'ora in poi chiamero' questi snodi articolazioni.
Nella realta' le articolazioni sono formate da due semisfere incernierate tra loro da una vite, ognuna delle quali e' fissata alla parte del corpo che deve articolare da perni girevoli, in modo tale da favorire i movimenti di rotazione assiale.
Modellare il manichino secondo questa strategia (che era la piu' fedele possibile) significava pero' aumentare notevolmente la complessita' del modello finale senza particolari vantaggi a livello visivo. Per questo motivo ho scelto di modellare le articolazioni come oggetti unici (senza che questo comportasse perdite apprezzabili a livello di resa finale).
Per fare in modo che i vari pezzi combaciassero perfettamente tra loro e con le rispettive articolazioni, li ho strutturati in modo tale da avere dei perni costituiti da porzioni di superficie degenerati in segmentini di lunghezza pari al diametro dell'articolazione e posti lungo l'asse principale dei pezzi stessi. In questo modo i perni sono invisibili al ray-tracer.

DESCRIZIONE DELLA SCENA

La scena raffigura un cilidro sul quale e' seduto un manichino con atteggiamento pensieroso/beffardo. Alle sue spalle (e a sua insaputa...) c'e' uno specchio fluttuante a mezz'aria che si scioglie in un angolo, e da cui fuoriesce per meta' un secondo manichino, che torcendosi tenta di allungarsi per afferrare il primo. Intorno al cilindro vi sono tre biglie di vetro trasparente, al cui interno vi sono le lettere M,N,G, dei tre colori base rosso, verde e blu.
Il tutto su una pavimentazione a piastrelle bianche bordate di nero, sotto un cielo irreale a tinte blu.

MODELLAZIONE

Ecco il dettagio dei vari pezzi, e come ho fatto per crearli. Cliccare sull'immagine per vederne una versione ingrandita.

Ho creato il pattern giallo-azzurro per mostrare il mapping del dominio parametrico u:[0,1] x v:[0,1] sulla superficie 3D (usando la non ancora documentata funzione di texturing set_domain_texture(...) :)

Alcune precisazioni: Tutte le curve hanno grado 2. Tutti i file contenenti le curve 2D, 3D e i file CP, sono stati scritti a mano, con l'aiuto di carta millimetrata, matite colorate e tanta gomma. In seguito sono stati aperti con i rispettivi programmi e salvati per 'normalizzare' la notazione. Ho pesantemente utilizzato XCCURV per ricavare la partizione nodale corretta per le mie curve.
 
 

articolazioni ARTICOLAZIONI

Ottenute per revolution di una curva 3D a forma di semicirconferenza con centro. In tal modo anche la superficie mantiene il centro, che sara' poi il punto di raccordo tra i vari pezzi che sfruttano tale articolazione.

HOWTO:
 

  1. in XCSURF caricare il file <MYDIR>/3d/sfera/prototipo.db come curva 3D
  2. generare per revolution la nuova superficie
BRACCIO (e AVAMBRACCIO, GAMBA, POLPACCIO)

Revolution delle rispettive curve 2D. Da notare come non si vedano il perno superiore e quello inferiore. In realta' ci sono, e nel caso del braccio quello superiore e' di lunghezza pari al raggio della spalla, mentre quello inferiore e' pari al raggio del gomito.

HOWTO (per il braccio):
 

  1. In XCSURF caricare il file <MYDIR>/2D/braccio/braccio.db come curva 2D
  2. generare per revolution la nuova superficie
BACINO

Ho scritto un file .cp che contiene la descrizione della griglia di controllo della superficie, che si chiude dal basso verso l'alto.  C'e' un solo perno (in alto). Per l'allineamento delle anche e' stato sufficiente inserire una curva in modo opportuno appena dopo la chiusura in basso.

HOWTO :
 

  1. In XCSURF caricare il file <MYDIR>/3D/bacino/bacino.cp
  2. fornire grado 2 sia in u che in v
BUSTO

Come per il bacino ho realizzato un file cp. la linea marcata del petto e' la sovrapposizione parziale di due curve consecutive, una delle quali fara' il disegno del contorno superiore delle spalle, l'altra scendera' un po' piu' in basso.
Per l'allineamento delle spalle ho utilizzato la curva addominale, che nei laterali sale a 'V' rovesciata il cui vertice sara' proprio il punto di contatto con le spalle (ruotate opportunamente in modo da avere i poli a contatto con il busto).
La concavita' inferiore e' l'alloggiamento per la vita.

HOWTO:
 

  1. In XCSURF caricare il file <MYDIR>/3D/busto/busto.cp
  2. grado 2 ovunque
TESTA

Extruding di curve. La curva di partenza e quella di arrivo coincidono e sono sulla parte frontale, cosicche' il modello avesse l'angolo che ha in realta'. le curve laterali e posteriori sono tra loro uguali e simili alle frontali ma con una concavita' pronunciata verso il basso per simulare la nuca. Il perno e' in basso.

HOWTO:
 

  1. In XCSURF caricare il file <MYDIR>/3D/testa/testa.obj
  2. fare extruding di TUTTE le curve nell'ordine di apparizione
  3. grado 2 ovunque
MANO

File cp. Il perno esce di 45 gradi dal dorso della mano. Vi invito a guardare lo stratagemma utilizzato per far cio' caricando il file in XCSURF

HOWTO:
 

  1. In XCSURF caricare il file <MYDIR>/3D/mano/mano.cp
  2. grado 2 ovunque
PIEDE

File obj. Il perno esce di 90 gradi dal dorso. Purtroppo non mi e' riuscito un perno perfetto, ma in ogni caso e' coperto 
dalla caviglia. :)

HOWTO:
 

  1. In XCSURF caricare il file <MYDIR>/3D/piede/piede.obj
  2. extruding di tutte le curve nell'ordine
  3. grado 2 ovunque
MIRROR

Questa superficie mi ha richiesto un po' piu' di tempo delle altre. E' stata costruita per extruding di curve 3D, ma ci sono volute molte prove per ottenere un effetto il piu' possibile simile al metallo liquido nella goccia e alla gomma 'tirata' nel busto. Il busto stesso, inoltre, e' stato ricavato dal busto precedente estrapolando le varie curve di livello, ma ribaltandone la chiusura e il senso di percorrenza. Adesso si chiudono nella schiena.

HOWTO:
 

  1. In XCSURF caricare il file <MYDIR>/3D/mirror/mirror.obj
  2. extruding, grado 2
CORNICE

Semplice extruding di grado 1 su 5 curve 3D tutte isomorfe tra loro.

HOWTO:
 

  1. In XCSURF caricare il file <MYDIR>/3D/mirror/cornice/cornice.obj
  2. extruding, grado 1 in v --- lasciare grado 2 in u
M

Swinging di una curva profilo di forma pseudo-triangolare su una traiettoria a forma di M.
 

N

Swinging di una curva profilo di forma pseudo-triangolare su una traiettoria a forma di N.

G

Swinging di una curva profilo di forma pseudo-triangolare su una traiettoria a forma di G.

Le precedenti immagini sono state create in modo automatico attraverso l'utilizzo dei miei script 'samplecreate' e 'ray'. Pe una descrizione dettagliate vedere piu' avanti.

COMMENTI SULLA CREAZIONE DELLA SCENA

E' stato il processo piu' lungo in assoluto. Non tanto la disposizione spaziale degli oggetti, quanto la scelta dei giusti materiali e delle luci. Tuttora non sono soddisfatto al 100%. Molte cose possono essere ancora migliorate, sia in termini di modellazione che in termini visivi. Il sistema, seppur ostico e tutt'altro che user friendly a prima vista, non appena si raggiungono un minimo di familiarita' e dimestichezza con l'interfaccia e con la logica del programma, mostra tutta la sua potenza. Per questo contuinui aggiustamenti, ritocchi, prove e controprove sono all'ordine del giorno.
Unici prerequisiti: molta pazienza e un po' di memoria (RAM). Se poi si ha una CPU veloce ancora meglio.

Non ho affatto disdegnato l'utilizzo del C come linguaggio di programmazione. Magari in un futuro potra' essere creato uno script-language AD HOC per il sistema. Unico neo: le ombre. Sono opache, anche se create da oggetti perfettamente trasparenti. Una tecnica di radiosity renderebbe il tutto ancor piu' realistico.

Per la scena ho utilizzato texture sul dominio parametrico (ho preso l'interfaccia dai file sorgenti forniti con la distribuzione developer) estrapolate dalla distribuzione RedHat 6.2 --- sono tutte tiling, quindi nessun problema per farle combaciare in caso di ripetizione.
Uniche eccezioni: checked.hr e grid.hr, che me le sono disegnate io.
 

Il cielo e' una enorme sfera ('sphere' di XCSURF + domain_texture);
il suolo e' un enorme piano ('plane 1' di XCSURF + domain_texture);
il cilindro e' anch'esso standard e opportunamente scalato ('cylinder' + domain_texture);
oltre alle gia' citate superfici.

Ho posizionato tre luci di tipo warn dei tre colori LIGHT_CYAN, LIGHT_MAGENTA, LIGHT_GREEN, convergenti verso il cilindro.

Per i settaggi ho fatto molti test utilizzando scene intermedie e di prova e posizionando luci mediante il mouse, per poi trarre i valori che leggevo nei file .md prodotti automaticamente da XCRAYT.

SCRIPT FILE

Per aiutarmi nella stesura di questo tutorial ho creato tre script-file:
 
generate <nomesuperficie> produce sullo standard output un file in linguaggio C, descrizione della scena necessaria per fare una snapshot della superficie desiderata. Pensato per essere chiamato da samplecreate, non da solo.
samplecreate <sup> <dir> Presuppone l'esistenza della subdir <XCMODEL>/models/snapshots
del file <XCMODEL>/models/snapshots/texture.hr
e della subdir <XCMODEL>/models/snapshots/PROTO

crea una sottodirectory chiamata dir al cui interno c'e' tutto il necessario per la scena (gia' compilata), pronta per il rendering. Unico parametro da aggiustare: il file .vw, da modificare in XCRAYT

ray <dir> <200|600> esegue il ray-tracing della scena contenuta in dir (vedi sopra) alla risoluzione di 200 o 600 linee

In ogni caso si possono modificare i valori delle variabili contenute all'interno degli ultimi due script-file per rispondere alle esigenze della vostra installazione (principalmente, locazioni di directory).
Non pretendono di essere completi ne' perfetti. Sono stati utilizzati solo a scopo dimostrativo e per automatizzare qualche operazione.

DOWNLOAD

Scompattando i file sorgenti, abbiate cura di :

spostare scena/ in <XCMODEL>/models/
 

Potete scaricare qui l'archivio .tgz

HAVE FUN!!!