METODI NUMERICI per la GRAFICA 2001
RIFLESSIONI Progetto di
|
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 |
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.
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.
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.
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.
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.
Scompattando i file sorgenti, abbiate cura di :
spostare scena/ in <XCMODEL>/models/
Potete scaricare qui l'archivio .tgz