Informatica
4
(Cdl Matematica Informatico-Computazionale)
2006/07
Relazione
del Progetto di Grafica assegnato il 21/05/2007
Modellazione e
Resa realistica di una motovedetta CP 869
di
Accogli Marilena
Obiettivo
Utilizzando i
pacchetti XCCurv, XCSurf e XCRayt di
XCModel 4.0, realizzare un'esperienza significativa di
modellazione e resa realistica insieme alla progettazione di una
breve animazione digitale.
Tenendo presente che un algoritmo di
ray-tracing produce delle rese super-realistiche, tipicamente di
interni, si chiede di progettare un interno in cui collocare almeno
un modellino di un veicolo di terra, aria o acqua (esclusi veicoli
spaziali e sommergibili) la cui modellazione 3D deve essere
particolarmente curata nei dettagli.
La fase di modellazione
venga realizzata facendo esclusivamente uso degli strumenti
introdotti nel corso e a disposizione in XCSurf; se singoli oggetti
sono composti da piu' superfici, queste vengano assemblate nella fase
di modellazione (in ambiente XCSurf).
Si realizzi poi lo
scene-graph della scena 3D mediante libreria descriptor e script C e
si producano: alcune immagini fotorealistiche con alcuni primi piani;
una piccola animazione di al piu' un centinaio di frame con
risoluzione 300x300.
Progettazione oggetti della
scena e superfici
Come modellino da collocare in un
interno ho scelto una motovedetta della guardia costiera: si tratta
del modello CP 869.
Per realizzare la motovedetta ho scelto di dividerla, per
semplicità, in varie parti:
bottazzo
chiglia
controplancia
candeliere
passamano
bitte
antenne
bandiera, tromba, radar
Per realizzare il bottazzo, ho inizialmente disegnato metà
del suo profilo con XCCurv tramite il comando New curve:
Shape, inserendo i punti di controllo, scegliendo grado 3 e
distribuzione uniforme dei nodi. Ho poi modificato i nodi iniziale e
finale tramite tastiera (CP-Move) in modo da farli
ricadere sugli assi (profilo1.db).
Ho creato la seconda
metà del profilo copiando la prima e scalandola di un fattore
-1 rispetto all'asse y, con il comando Scaling : y factor
(profilo2.db). Ho unito le due metà tramite il comando
Join; inizialmente, però, le curve venivano concatenate
unendo il primo punto della prima curva con l'ultimo della seconda.
Per ovviare a questo inconveniente ho dovuto invertire manualmente i
control points della seconda curva dal file .db. Ho, così,
ottenuto il profilo intero 2D del bottazzo (profilo_intero.db).
Successivamente, in XCSurf, ho reso il profilo
del bottazzo più realistico: con il pulsante Numeric-CP
ho modificato le altezze di alcuni control point per rendere la prua
più alta.
Per terminare il bottazzo ho disegnato un piccolo
cerchio in XCCurv. In XCSurf ho, infine, creato una
superficie con il comando NewSurf-Tubular, selezionando
come curva profilo il cerchio (cerchio_piccolo.db), preso nel
piano XZ, e come curva traiettoria il profilo del bottazzo
(bottazzo.db). Ho, quindi, allungato il bottazzo
interattivamente con il comando Interactive
(bottazzo_allungato.db).
Per realizzare la chiglia ho disegnato tre profili diversi: uno per la poppa, uno per la prua, l'altro per la parte centrale. Ho disegnato tali profili in XCCurv, tramite il comando New curve:Shape, ho modificato tramite tastiera alcuni CP per farli ricadere sugli assi; ho scalato la prima metà di un fattore -1 (Scaling : x factor), ho invertito i CP dal file.db, e ho unito le due metà con Join. Ho ottenuto, così, le tre curve di base che serviranno per disegnare lo scheletro della chiglia (chiglia_intera.db, chiglia_dietro.db, chiglia_davanti.db).
Passando a XCSurf ho opportunamente traslato e
scalato (Modify : Numeric : Scaling , Translat.)
le varie curve in modo da creare lo scheletro della chiglia,
perfettamente aderente al bottazzo (chiglia_0..._13.db.
, chiglia.obj)
Ho, infine, creato la superficie della chiglia con il comando
NewSurf : Skinning (chiglia.db).
Ecco la
chiglia e il bottazzo insieme:
Per completare la chiglia ho disegnato la parte superiore
(interna) utilizzando delle curve disegnate in XCCurv più
piatte delle precedenti (chiglia_up.db,
chiglia_up_davanti.db).
Come prima ho traslato e scalato opportunamente tali curve
in XCSurf, per ottenere lo scheletro della parte superiore
della chiglia (chiglia_up.obj).
Tramite i comandi Params. - Render Prefs. - Shading -
Apply - ok ho ottenuto questa rappresentazione della chiglia
completa.
Nella fase di resa mi sono accorta che la chiglia non rispettava quella reale, molto più uniforme e appuntita in prua. Ho, allora, preferito modificarla. Per ottenere una nuova chiglia ho dovuto modificare sia il bottazzo, che le due chiglie, inferiore e superiore. Ho reso il bottazzo un pò più a punta cambiando le coordinate di alcuni control point del suo profilo (bottazzo1.db). Per quanto riguarda la chiglia ho eliminato o modificato alcune curve dello scheletro (chiglia_nuova.db, chiglia_up.db).
Per realizzare la controplancia, ossia la cabina della
motovedetta,ho preferito suddividerla in tre parti:
parte inferiore
parte centrale
parte superiore
Per realizzare la parte inferiore della motovedetta ho
inizialmente disegnato la curva della base in XCCurv;
passando a XCSurf, però, ho riscontrato delle
difficoltà nel farla combaciare con la chiglia superiore. A
questo punto ho trovato più conveniente utilizzare la curva 3D
del profilo del bottazzo. Traslandoe scalando tale curva
opportunamente ho ottenuto la base per la parte inferiore della
controplancia (base_plancia.db). Ho poi creato la base
superiore utilizzando la curva 2D del profilo del bottazzo,
traslandola e scalandola opportunamente (base_plancia2.db).
Ho creato la superficie laterale della parte inferiore
della controplancia tramite skinning della due curve base
(plancia_parteinf.db).
La superficie ottenuta,
naturalmente era aperta superiormente. Ho allora creato la superficie
di chiusura tramite skinning della base superiore e di un punto
ottenuto scalando tale base (sup_chiusura1.db).
Allo stesso modo ho creato le parti centrale e superiore
della controplancia: utilizzando la curva della base superiore della
parte inferiore della controplancia, ho ottenuto le basi per la parte
centrale e superiore della cabina (base_plancia_centrale1-2.db,
base_plancia_sup1-2.db), poi per skinning della due basi,
rispettivamente, ho creato le superfici laterali
(plancia_partecentr.db, plancia_partesup.db), e infine ho
creato le due superfici di chiusura (sup_chiusura1.db,
sup_chiusura2.db).
Ecco la controplancia fino a questo punto
(controplancia.obj).
Tuttavia, la controplancia non è ancora stata
completata: occorre disegnare finestre e porta. Il modo più
corretto per fare ciò è utilizzare le superfici di
trimming. Le finestre sono state "ritagliate" solo dalla
superficie laterale della controplancia centrale, mentre la porta è
stata ricavata sia dalla parte inferiore che da quella centrale.
Prima di trimmare la superficie, ho dovuto raffinarla tramite il
comando Modify : Numeric : Refinement. Ho , poi,
utilizzato il comando Trim : a trimming surface : Ok.
Dopo molti tentativi per cercare di capire in che modo
devono essere selezionati i punti per effettuare il trimming sono
riuscita a raggiungere il mio scopo. Ho man mano ritagliato la porta,
le finestre laterali e quelle centrali ottenendo via via delle
superfici con dei "buchi" e delle superfici per la porta e
le finestre (plancia_centrale_nofinestre.dbe,ecc.). Ecco la
griglia utilizzata per il trimming.
Ed ecco la controplancia inferiore e centrale priva di
finestre e porta, che verranno reinserite in fase di resa.
Infine ho ottenuto la controplancia completa
(controplancia_completa.obj).
Per riassemblare correttamente le varie superfici della
controplancia ho dovuto prima raffinarle.
Per realizzare il candeliere ho disegnato la curva del suo profilo in XCCurv (candeliere1.db, candeliere2.db, candeliere.db, asta_candeliere.db, cerchio_piccolissimo.db). Ho caricato il profilo del candeliere in XCSurf e ne ho modificato alcuni control point per renderlo più realistico (profilo_candeliere.db). Ho poi creato la superficie tubolare prendendo come profilo un piccolo cerchio caricato nel piano XZ (candeliere1.db). Ho poi copiato traslato scalato e modificato questo candeliere per crearne un altro (candeliere2.db). Infine, per le aste ho utilizzato la curva 2D asta_candeliere.db e in XCSurf l'ho modificata più volte per ottenere le superfici asta_candeliere_1..._8.db. Ho, quindi, assemblato i vari pezzi fino ad ottenere il candeliere completo (candeliere.obj).
Ecco la motovedetta fino a questo punto.
Per realizzare il passamanno ho disegnato la curva del suo profilo in XCCurv (asta_plancia1-2.db, asta_plancia.db).
Ho poi caricato tale curva in XCSurf e ho
modificato tutti i control point per farla combaciare con la parte
inferiore della controplancia ( asta_plancia.db)e ne ho creato
una superficie tubolare utilizzando un cerchio molto piccolo
disegnato in XCCurv ( asta_passamano.db).
Ho poi realizzato tutte le altre astine utilizzando una
piccola retta, costruendone la superficie tubolare e scalando,
traslando e ruotando quest'ultima (astina1...13.db).
Ho
ottenuto così il passamano completo (passamano.obj).
Le bitte sono state ottenute scalando, traslando e ruotando opportunamente delle superfici cilindriche (bitta1...6.db, bitte.obj).
Per realizzare le quattro antenne piccole ho disegnato il profilo in XCCurv (profilo_antenna.db); passando a XCSurf ho traslato e scalato tale curva; infine ho creato la superficie dell'antenna tramite il comando (NewSurf :Revolution) (antenna1-4.db).
Per realizzare l'antenna grande ho avuto bisogno di più superfici. Come al solito ne ho creato i profili in XCCurv (profilo_antenna_grande.db, prof_antenna_grande.db).
In XCSurf ho modificato la curva traiettoria (profilo_antenna_grande.db)e ho creato una superficie tubolare. Infine, ho creato le altre parti dell'antenna scalando, traslando e ruotando alcune superfici cilindriche (antenna_grande.obj)
Per realizzare la bandiera ho disegnato una curva 3d in XCSurf (bandiera.db), ne ho creato una copia opportunamente traslata e ho creato la superficie per skinning delle due curve (bandiera.db). L'asta che sostiene la bandiera è stata creata scalando, traslando e ruotando una superficie cilindrica.
Per realizzare la tromba ho semplicemente disegnato il profilo e creato una superficie di rotazione. Per il radar ho utilizzato due superfici cilindriche.
Ho posizionato il modellino della motovedetta su
un tavolo posto in una stanza. Ho allora realizzato alcuni oggetti aggiuntivi:
stanza
lampadario
tavolo
piedistallo
quadro
cartina
Per realizzare le pareti della stanza ho traslato ruotato e scalato opportunamente delle superfici piane (parete1-2-3.db, pavimento.db, tetto.db).
Per realizzare il lampadario ho disegnato prima una una curva in XCCurv (profilo_lampadario.db). Passando a XCSurf ho creato la superficie del lampadario facando ruotare la curva profilo intorno all'asse z (NewSurf : Revolution) (lampadario.db).Ho seguito lo stesso procedimento per la lampadina (lampadina.db). Per il filo del lampadario ho scalato opportunamente una superficie cilindrica (filo_lampadario.db).
Per realizzare il piano del tavolo ho utilizzato una superficie cubica (NewSurf : Usual) (tavolo.db); per le gambe ho usato delle superfici cilindriche (piede1...4.db).
Per realizzare il piedistallo ho disegnato la curva profilo in XCCurv (profilo_piedistallo.db).
Per realizzare il quadro ho utilizzato una superficie cubica per la cornice e una superficie piana per la tela (superficie_quadro.db, cornice_quadro.db).
Infine, per la realizzazione della cartina ho disegnato il profilo in XCCurv (profilo_cartina.db). In XCSurf ho modificato tale curva, ne ho creato una copia (profilo_cartina1-2.db) e ho realizzato la superficie della cartina per skinning delle due curve (cartina.db).
Dopo la realizzazione di tutte le superfici utilizzate nella scena ho realizzato la resa tramite uno script.c (motovedetta.c).
Ho creato alcuni attributi, che rappresentano il materiale e in alcuni casi il colore da applicare ai vari oggetti:
legno: utilizzato per il tavolo,
intonaco: utilizzato per le pareti e il pavimento della stanza,
vetro: utilizzato per la lampadina,
azzurro: utilizzato per il lampadario,
vetroresina: utilizzato per quasi tutte componenti della motovedetta,
nero: utilizzato per il filo del lampadario,
metallo: utilizzato per le antenne e il piedistallo,
arancio: utilizzato per il bottazzo,
vetro_scuro: utilizzato per finestre e porta,
metallo_chiaro: utilizzato per l'asta della bandiera,
stoffa: utilizzato per la bandiera,
carta: utilizzato per la cartina.
Naturalmente, questi attributi sono stati realizzati dopo varie prove per il colore, la riflettività e la trasparenza effettuate in
XCRayt.
Ho definito due luci: una point light che arriva frontalmente nella stanza e una warn light che fuoriesce dalla lampadina. Per quanto riguarda l'intensità e il range di tali luci, ho ancora una volta effetuato numerose prove.
Alcune delle texture che ho utilizzato sono state trovate in rete, altre sono state create da me. Quelle trovate in rete sono:
bandiera_texture: utilizzata, appunto, per la bandiera