Grafica (C.d.S. Informatica)
2003/04
Relazione del Progetto di Grafica assegnato il 27/05/2004
Modellazione e Resa realistica di una chitarra elettrica (Brian May's Red Special)
di Alberto Griggio


immagine
  iniziale mig29


Obiettivo

L'obiettivo di questo secondo progetto è la modellazione di una scena che contenga uno o più oggetti e la sua resa realistica. La realizzazione avviene tramite i diversi componenti di xcmodel 3.0:

Progettazione oggetti della scena e superfici


Il soggetto che ho scelto è una chitarra elettrica molto famosa, ovvero la "Red Special" del chitarrista dei Queen Brian May, riprodotta nella foto qui a fianco. Il motivo di questa scelta, oltre alla mia particolare predilezione per questa chitarra, risiede nel fatto che essa è composta di superfici molto regolari, che la rendono particolarmente adatta alla modellazione 3D, ottenendo dei risultati a mio giudizio di buon effetto con uno sforzo - se pur non trascurabile - non proibitivo.

In realtà la chitarra modellata non è al 100% identica alla vera Red Special, perché durante la fase di modellazione ho deciso di effettuare alcune modifiche "estetiche", in particolare alla forma della cassa e della paletta del manico, come si può vedere anche dalle immagini. Un'altra differenza sta nei pickup, che nell'originale contengono dei fori nella parte cromata, che sono stati eliminati a causa di un problema che descriverò nella sezione Problemi e bug.

Corpo

Sia la parte in legno (la cassa vera e propria) che i bordi in gomma bianca sono stati realizzati tramite swinging di opportune curve profilo lungo una traiettoria che descrive il corpo della Red Special, tutte disegnate manualmente con xccurv.


Curva traiettoria per il corpo

Curve profilo per cassa e bordo

La cassa ottenuta con swinging

Il bordo

Manico e tastiera

Entrambe le superfici sono state ottenute sostanzialmente con extruding di due curve di base che ne descrivono la sezione iniziale e finale. Il "sostanzialmente" si riferisce al fatto che in realtà il manico è composto di due parti, una inferiore e una superiore, mentre la tastiera contiene anche una piccola appendice (ottenuta tramite skinning a partire dalla curva finale della parte "principale" e un segmento, entrambi mostrati nella figura qui sotto) per farla terminare più "dolcemente".


Curve per il manico...

...e relativa superficie ottenuta tramite extruding

Curve per la tastiera

parte principale della tastiera (extruding)

"appendice" (skinning)

Paletta

È composta da due superfici: la paletta vera e propria, ottenuta per extruding di due copie di una stessa curva profilo, e il retro, per congiungerla "dolcemente" al resto del manico, ottenuto per skinning di 3 curve.


Curva per la paletta

relativa superficie ottenuta tramite extruding

Curve per il retro della paletta

retro della paletta ottenuto tramite skinning delle curve precedenti

Parti in plastica

Il battipenna è stato ottenuto tramite skinning di varie curve, tutte poste alla stessa altezza tranne la più esterna, posizionata un po' più in basso in modo da dare spessore alla superficie.

L'altra parte in plastica della chitarra, ovvero quella attorno al tremolo, è stata ottenuta anch'essa tramite swinging delle curve profilo e traiettoria mostrate qui di seguito.


Curve per il battipenna

superficie risultato dello skinning

Curva traiettoria per la plastica del tremolo

curva profilo

superficie ottenuta

Ponte e tremolo

Il ponte è composto da 3 superfici principali per il corpo, più 6 rotelle (tutte copie della stessa superficie) che servono da guida per le corde. Per quanto riguarda il corpo, la parte centrale è stata ottenuta tramite extruding, mentre le due parti finali sono copie di una superficie risultato di un'operazione di skinning a partire da 3 curve. Le rotelle sono invece superfici di rotazione.

Il tremolo è invece composto di 4 parti, due per il corpo, ottenute tramite extruding, e due per la leva, di cui una è una tubular (la leva vera e propria) e l'altra, ovvero il tappo di plastica, una superficie di rotazione.


curva per la parte centrale del ponte

curve per le parti finali del ponte

il ponte completo

curva per le rotelle

relativa superficie di rotazione

curve per il tremolo

il corpo del tremolo, composto di superfici ottenute per extruding delle curve precedenti

curva traiettoria per la leva del tremolo

curva per il tappo della leva

la leva del tremolo e il tappo

Meccaniche della paletta

Sono composte da quattro diverse superfici: la parte superiore e il sostegno della vite sono state ottenute tramite rotazione, la parte inferiore tramite estrusione e la parte finale della vite tramite skinning a partire da una curva ellittica e due "curve" costituite da un solo punto, per chiudere la superficie.

Solo due delle sei copie sono state modellate con xcsurf, una per il lato sinistro e una per il destro: ho ottenuto e posizionato le rimanenti copie programmaticamente, in fase di costruzione della scena, facendo uso della libreria descriptor, come descritto alla sezione successiva.


curva per la parte superiore (attacco della corda)

curve per la parte inferiore

curve per la vite

meccanica completa

Tasti, corde e segnatasti

Per la realizzazione di questi componenti è stato fondamentale l'utilizzo della libreria descriptor, soprattutto per determinare la corretta posizione delle superfici stesse. In particolare:

curve per il tasto

superficie ottenuta per skinning

superficie di rotazione per il segnatasto

superfici (tubular) usate per costruire le corde

Altre parti della chitarra

Vengono qui riportate le immagini delle curve e superfici usate per modellare le parti rimanenti della Red Special, con una breve descrizione delle tecniche usate in ciascun caso:

curve per i pickup...

...e relativa superficie

curve profilo per i controlli e gli attacchi della tracolla...

...superfici rotazionali ottenute

curve per interruttori e capotasto...

...e superfici ottenute tramite extruding

Descrizone della Scena

Le specifiche del progetto enfatizzavano la realizzazione di un oggetto principale piuttosto che di una scena molto complessa: per questo ho deciso di inserire la Red Special in un angolo di stanza molto semplice, sostenuta da un cavalletto altrettanto "essenziale". Le superfici utilizzate per tale realizzazione sono state: Come già accennato in precedenza, la scena è stata costruita tramite un file .c con chiamate alla libreria descriptor: l'ambiente interattivo xcrayt è stato utilizzato solo per le prove di illuminazione e per posizionare la camera per ottenere le diverse immagini riportate qui sotto.

Materiali e texture

Per aumentare il realismo ho fatto ricorso massicciamente al texture mapping, molto adatto al soggetto da me scelto, composto principalmente da parti in legno. Le immagini per le texture sono state ricavate direttamente da foto della Red Special originale per quanto riguarda il corpo e il manico (in mogano verniciato di rosso), oppure da cataloghi on-line di tipi di legno (per la tastiera in ebano, il pavimento in parquet e i battiscopa) e di carte da parati (per le pareti).

Oltre al texture mapping, gli altri materiali utilizzati per la Red Special sono stati un nero leggermente riflettente per le parti in plastica e un grigio scuro molto riflettente per le cromature (tutte le parti in metallo), mentre le parti bianche sono state colorate con l'attributo di default (tranne il capotasto, leggermente più scuro).

Per quanto riguarda il resto della scena, anche il pavimento è leggermente riflettente, per simulare una lucidatura con cera; inoltre ho posizionato una parete frontale completamente riflettente (ovvero uno specchio), che, pur non entrando direttamente nella scena, contribuisce agli effetti di luce sulle cromature della chitarra.

Illuminazione

Le luci utilizzate, oltre a quella ambiente, di colore grigio chiaro e di intensità 0.7, sono due, entrambe di tipo warn, di colore bianco e di intensità 1.6. La scelta è ricaduta su questo tipo di illuminazione dopo molte prove effettuate usando l'ambiente interattivo, con luci di tipo, intensità e numero variabile: alla fine ho ritenuto che quello scelto fosse il modello che rendeva la scena più realistica e soprattutto gradevole.


Immagini di Resa

Le immagini che seguono sono state create esguendo il rendering (ray tracing) con i seguenti parametri: Cliccare sulle immagini per la versione full-size (640x640)
La scena modellata
Dettaglio della Red Special...
...e del corpo
Vista da dietro...
...di lato...
...e dall'alto
Alcuni dettagli: il corpo e l'attacco del manico...
...il ponte, il tremolo e i controlli...
...e la paletta

Download

Il file guitar.tgz contiene tutte le superfici, lo script file e le textures oltre a questa documentazione e le sue immagini ottenute dalla resa della scena modellata.

Problemi e bug

Il progetto è stato sicuramente molto interessante e divertente. Tuttavia i problemi non sono mancati e la sua realizzazione ha richiesto uno sforzo e dei tempi rilevanti. Ciò è dovuto soprattutto ad una difficoltà intrinseca di un progetto di modellazione 3d di un oggetto di forma non banale, ma in parte anche ad alcune difficoltà che ho avuto nell'utilizzare i diversi componenti di xcmodel.

Bug

Il primo problema è stato un problema relativo ai font utilizzati da xcmodel: durante l'utilizzo, infatti, riscontravo crash apparentemente inspiegabili, con messaggi alla console che recitavano più o meno

X_OpenFont: bad font name
Dopo alcune indagini, ho scoperto che sul mio sistema (Linux Slackware 9) il font server non è in grado di tradurre la stringa
-adobe-helvetica-medium-o-normal--18-*-75-75-p-*-iso8859-1
in un font utilizzabile, e questo causava il crash. Tuttavia fortunatamente la stringa
-adobe-helvetica-medium-o-normal--18-*-75-75-p-0-iso8859-1
viene gestita correttamente: questo mi ha permesso di risolvere il problema modificando direttamente gli eseguibili (con un editor esadecimale) per rimpiazzare l'ultimo * della stringa precedente con uno 0.

Un altro problema è emerso durante l'utilizzo di xcbool. Nonostante l'uso di questo pacchetto non fosse previsto dalle specifiche di progetto, infatti, avevo deciso di usarlo in quanto sarebbe stato molto comodo per la realizzazione dei pickup (un esemplare dei quali è riportato nella figura qui accanto) come differenza tra la superficie che ho poi effettivamente utilizzato e sei cilindri opportunamente posizionati.
Non avendo a disposizione la versione 3.0 di xcbool, ho cercato di usare quella precedente (la 2.0) per ottenere il pickup come differenza tra i sei cilindri e la superficie di partenza. Tuttavia non mi è stato possibile andare oltre la combinazione della superficie "pickup di base" e uno dei sei cilindri: tutte i tentativi di aggiungere un secondo cilindro, infatti, hanno dato come risultato un crash di xcbool con segmentation fault.

L'ultimo bug che ho riscontrato riguarda xcrayt e la libreria descriptor. La funzione read_nurbs di quest'ultima, infatti, permette di specificare il path completo del file .db da cui caricare la superficie NURBS stessa: tuttavia sembra che al momento del caricamento del file .md che descrive la scena xcrayt cerchi i file .db delle superfici solo nella directory contenente il file .md stesso. Questo risulta un po' scomodo, soprattutto quando le superfici della scena sono molte e le si vorrebbe tenere in directory diverse per una migliore organizzazione. In un primo momento avevo risolto il problema creando dei link simbolici dalla directory contenente il file .md che puntano alle effettive locazioni delle superfici utilizzate. Successivamente, però, mi sono accorto che le specifiche di progetto richiedevano che le superfici fossero tutte nella directory 'modello', quindi ho abbandonato l'organizzazione in sottodirectory diverse.

Difficoltà di utilizzo

Oltre ai bug riscontrati nei vari componenti di xcmodel, tutti comunque non insormontabili e parzialmente risolti, le difficoltà maggiori sono state causate dall'interfaccia utente del programma, che non può certo essere definita "user friendly", e che ha richiesto molto tempo per essere "digerita". In particolare, mi è sembrato che soprattutto xcsurf, che ad esempio non consente di applicare trasformazioni a più superfici contemporaneamente, sia piuttosto ostico per un utente inesperto, mentre xccurv e xcrayt, pur con qualche difetto (ad esempio in xccurv non è possibile copiare una curva se non salvandola e caricandola nuovamente), sono certamente più agevoli. Tuttavia devo dire che dopo l'iniziale imbarazzo il sistema si è rivelato molto potente e mi ha permesso di ottenere dei risultati a mio giudizio più che soddisfacenti. Inoltre ho particolarmente apprezzato la libreria descriptor, che mi ha permesso (come detto in precedenza) di modellare perfettamente la tastiera della chitarra ed altri dettagli, cosa che sarebbe stata molto difficile, lunga e tediosa da fare "a mano".
Torna su