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.
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 |
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) |
È 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 |
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 |
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 |
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 |
![]() curve per il tasto |
![]() superficie ottenuta per skinning |
![]() superficie di rotazione per il segnatasto |
![]() superfici (tubular) usate per costruire le corde |
![]() 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 |
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.
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.
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 nameDopo 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-1in un font utilizzabile, e questo causava il crash. Tuttavia fortunatamente la stringa
-adobe-helvetica-medium-o-normal--18-*-75-75-p-0-iso8859-1viene 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.