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


immagine iniziale motovedetta



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.


motovedetta CP 869



motovedetta



motovedetta CP 803



Per realizzare la motovedetta ho scelto di dividerla, per semplicità, in varie parti:

Bottazzo

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).

prima metà del profilo del bottazzo profilo intero del bottazzo



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).

profilo bottazzo bottazzo



Chiglia

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).

curve utilizzate per la chiglia


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)

scheletro  chiglia


Ho, infine, creato la superficie della chiglia con il comando NewSurf : Skinning (chiglia.db).
Ecco la chiglia e il bottazzo insieme:

bottazzo e chiglia



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).

curve 2D della parte superiore della chiglia



Come prima ho traslato e scalato opportunamente tali curve in XCSurf, per ottenere lo scheletro della parte superiore della chiglia (chiglia_up.obj).

scheletro della parte superiore della chiglia



Tramite i comandi Params. - Render Prefs. - Shading - Apply - ok ho ottenuto questa rappresentazione della chiglia completa.

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).

nuova chiglia



nuova chiglia_superiore


Ecco il nuovo bottazzo insieme alle due chiglie.

nuova chiglia

Controplancia


Per realizzare la controplancia, ossia la cabina della motovedetta,ho preferito suddividerla in tre parti:


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).

basi della plancia inferiore



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).

superficie di chiusura



parte inferiore della plancia



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).

parte centrale e superiore della plancia



Ecco la controplancia fino a questo punto (controplancia.obj).

controplancia



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.

griglia per il trimming



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.

griglia per il trimming



Ed ecco la controplancia inferiore e centrale priva di finestre e porta, che verranno reinserite in fase di resa.

plancia inferiore e centrale priva di finestre e porta



Infine ho ottenuto la controplancia completa (controplancia_completa.obj).

controplancia completa



Per riassemblare correttamente le varie superfici della controplancia ho dovuto prima raffinarle.

Durante la fase di resa ho riscontrato alcune difficoltà nell'applicare le texture con le scritte e il logo sulle parti inferiore e superiore della controplancia. Ho, così, dovuto applicare il trimming per ritagliare le parti in cui andavano applicate le texture (plancia_inferiore.dbe, logo_destra, logo_sinistra, plancia_superiore.dbe, cp_destra.db, cp_sinistra.db)

Candeliere

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).

candeliere



Ecco la motovedetta fino a questo punto.

motovedetta



Passamano

Per realizzare il passamanno ho disegnato la curva del suo profilo in XCCurv (asta_plancia1-2.db, asta_plancia.db).

asta 2d del passamano



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).

asta 3d del passamano



superficie asta passamano



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).

passamano



Bitte

Le bitte sono state ottenute scalando, traslando e ruotando opportunamente delle superfici cilindriche (bitta1...6.db, bitte.obj).

bitta posteriore



Antenne

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).

profilo antenne piccole antenna piccola

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).

profilo antenna grande traiettoriaantenna grande

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)

profilo antenna grande 3d antenna grande

Bandiera, tromba,radar

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.

bandiera

Per realizzare la tromba ho semplicemente disegnato il profilo e creato una superficie di rotazione. Per il radar ho utilizzato due superfici cilindriche.

profilo tromba tromba


radar


Descrizone Scena


Ho posizionato il modellino della motovedetta su un tavolo posto in una stanza. Ho allora realizzato alcuni oggetti aggiuntivi:

Stanza

Per realizzare le pareti della stanza ho traslato ruotato e scalato opportunamente delle superfici piane (parete1-2-3.db, pavimento.db, tetto.db).

Lampadario

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).

lampadario

Tavolo

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).

tavolo



stanza

Piedistallo

Per realizzare il piedistallo ho disegnato la curva profilo in XCCurv (profilo_piedistallo.db).

profilo piedistallo 2d

Passando a XCSurf ho creato la superficie di rotazione. Infine ho traslato e scalato tale superficie (piedistalo.db).

Quadro

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).

quadro

Cartina

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).

profilo cartina 2d profili cartina 3d

cartina

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

texture della bandiera


color1: utilizzato per la cornice del quadro

texture per la cornice del quadro


piastrelle: utilizzata per il pavimento

texture per il pavimento


venature: utilizzata per il tavolo

texture per il tavolo


quadro: utilizzata per l'immagine del quadro

immagine del quadro


La texture utilizzata per la cartina posizionata sul tavolo è stata ricavata da una immagine della vera carta nautica di Ravenna. Questa mi è stata fornita dal mio fidanzato, che lavora su una motovedetta della Guardia Costiera proprio a Marina di Ravenna.

carta nautica


Infine, ho relizzato le texture contenenti le scritte e il logo della guardia costiera

logo della Guardia Costiera


utilizzando un programma per editor. Inizialmente non riuscivo a posizionare correttamente tali texture sulla controplancia; inoltre, le scritte erano al contrario. Così ho deciso di ritagliare dalla parte inferiore e da quella superiore della controplancia i pezzi di superficie in cui inserire le texture. Ma rimaneva il problema del capovolgimento delle lettere. Allora, sempre tramite il programma di editor ho reso le scritte leggibili a specchio. Ecco il risultato:




Naturalmente, tutte le texture, per poter essere utilizzate nello script, sono state convertite dal formato .jpg al formato .hr. Inoltre, a tutte le superfici è stata applicata la "domain texture".

Infine, ho realizzato una piccola animazione, ancora tramite lo script in c. Ho inserito le varie componenti della motovedetta in una stessa lista, che ho chiamato scafo_intero. Ho poi fatto ruotare lo scafo di 4 gradi per un totale di 99 frame. Compilando il file.c ho ottenuto il file.ani, che ho caricato in XCRayt. Tuttavia l'animazione avveniva da uno stesso punto di vista: ho, allora, modificato manualmente tutti i file.vw.


Immagini di Resa

Problemi e bug

Ho riscontrato un problema durante la stesura dello script per la resa: XCrayt non accettava i nuovi nomi dati alle superfici. Per il resto non ho riscontrato particolari problemi(!).



Torna su