CurvED
-
Upload
graphitech -
Category
Education
-
view
380 -
download
8
description
Transcript of CurvED
Principi di Computer Graphics- CurvEd -
Tarcisio Fedrizzi
10 settembre 2009
Sommario
CurvEd e stato realizzato nell’ambito del progetto dell’esame di“Principi di Computer Graphics”. L’applicazione e costituita da un’in-terfaccia che consente all’utente di creare delle curve parametriche didiversi tipi e agire su diverse caratteristiche delle stesse.
Indice
1 Descrizione del progetto 2
2 Manuale d’uso 32.1 Creazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Modifica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Descrizione dell’implementazione 83.1 Libcurve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.2 Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4 Cenni teorici 114.1 Hermite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.2 Hermite spline . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.2.1 4 punti . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.2.2 5 punti . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.2.3 6 punti . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.3 Bezier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.3.1 4 punti . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.3.2 5 punti . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.3.3 6 punti . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1
4.4 B-Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.5 B-Spline nonuniformi . . . . . . . . . . . . . . . . . . . . . . . 144.6 Conversione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.6.1 Da Bezier 4p a Hermite 2p 2d . . . . . . . . . . . . . . 154.6.2 Da Bezier 4p a Hermite 4p . . . . . . . . . . . . . . . . 164.6.3 Da Bezier 5p a Hermite 5p . . . . . . . . . . . . . . . . 164.6.4 Da Bezier 6p a Hermite 6p . . . . . . . . . . . . . . . . 164.6.5 Da Hermite 4p a Hermite 2p 2d . . . . . . . . . . . . . 164.6.6 Da Hermite 2p 2d a Hermite 4p . . . . . . . . . . . . . 164.6.7 Da Hermite 2p 2d a Bezier 4p . . . . . . . . . . . . . . 164.6.8 Da Hermite 4p a Bezier 4p . . . . . . . . . . . . . . . . 174.6.9 Da Hermite 5p a Bezier 5p . . . . . . . . . . . . . . . . 174.6.10 Da Hermite 6p a Bezier 6p . . . . . . . . . . . . . . . . 17
4.7 Riparametrizzazione . . . . . . . . . . . . . . . . . . . . . . . 17
1 Descrizione del progetto
Le specifiche del progetto prevedevano l’implementazione di un editor dicurve parametriche che ne implementasse svariati tipi e la possibilita di agiresu di esse in varie maniere.In particolare nel progetto sono state implementate le seguenti funzionalita:
• Creazione di vari tipi di curva parametrica:
– Hermite (2 punti, 2 derivate)
– Hermite spline (4, 5, 6 punti)
– Bezier (4, 5, 6 punti)
– B-Splines (4 o piu punti)
– B-Splines non uniformi (2 o piu punti)
• Cancellazione delle curve
• Mirroring rispetto ad un piano mobile
• Riparametrizzazione (per Hermite, Hermite spline e Bezier)
• Conversione tra diversi tipi di curva (Hermite, Hermite spline e Bezier)
• Modifica della risoluzione della curva (il numero di punti in cui il valoredella curva e calcolato)
• Stretching e scaling delle curve con bounding box
2
• Visualizzazione di derivata prima e seconda (Hermite, Hermite spline,Bezier, B-Splines)
• Visualizzazione del poligono di controllo per le curve di Bezier e dellederivate per le curve di Hermite
• Centratura della curva alla selezione
• Navigazione all’interno della scena
2 Manuale d’uso
L’editor presenta due modalita di azione: creazione e modifica.
2.1 Creazione
Nella modalita creazione e ( in Figura 1) possibile scegliere il tipo di curvache si vuole disegnare la sua risoluzione e per le B-Spline non uniformi alcuniparametri per la determinazione del vettore dei nodi.Per creare una curva e sufficiente impostare il tipo di curva desiderate e suc-
Figura 1: Schermata per la creazione delle curve, in giallo si puo vedere ilpiano su cui e possibile creare i punti di controllo per la curva
3
cessivamente premere sul piano dove desiderato, per avvicinare/allontanareil piano dalla visuale basta agire con la rotella del mouse. E possibile inqualunque momento modificare la visuale tenendo premuto il tasto maius-colo e utilizzando i tasti del mouse da sinistra a destra rispettivamente perruotare la visuale, muovere la visuale (facendo ruotare la wheel e possibilezoommare), agire in maniera fluida sullo zoom. Quando si inserisce una curvadi tipo spline non-uniforme e possibile scegliere, come gia accennato prima,alcuni parametri aggiuntivi ovvero il grado della curva (il parametro K), iltipo di vettore dei nodi (uniforme, uniforme aperto: con gli estremi dellacurva connessi rispettivamente al primo e all’ultimo punto di controllo), edinfine l’offset tra i nodi (per consentire una piu agevole modifica dei valori deipunti). E possibile vedere un’immagine della creazione di una curva B-Splinenon uniforme in figura 2.
Figura 2: Schermata per la creazione delle curve e possibile vedere nel pan-nello sulla destra i parametri aggiuntivi per la creazione delle curve B-splinenonuniformi
2.2 Modifica
Per quanto riguarda la modalita modifica e possibile accedere a varie funzionitramite di essa (si puo vedere un l’interfaccia di modifica in figura 3).Innanzitutto l’interfaccia visualizza una lista delle curve, da qui esse si pos-
4
Figura 3: Schermata per la modifica delle curve.
sono selezionare ed inoltre e possibile inoltre, attivando l’opzione “aim onselect”, far sı che la curva selezionata venga inquadrata.Si passa poi quindi alle funzioni di editing vere e proprie la prima e la can-cellazione che permette di eliminare una delle curve esistenti.Il mirroring (vedi Figura 4) permette di creare delle copie delle curve spec-ulari rispetto ad un piano che puo essere spostato e ruotato a piacimento,perche la funzione di mirroring sia attiva e necessario visualizzare il pianodi mirroring nella parte bassa della finestra. Una volta fatto questo il pianoe visibile ed e possibile spostarlo tramite il dragger e specchiare le curve apiacimento.La terza funzionalita e quella della riparametrizzazione ovvero il taglio della
curva, essa e disponibile per le curve di Hermite, per le spline di Hermitee per le curve di Bezier. Una volta scelta la curva che si vuole tagliare esufficiente premere il pulsante “Reparametrize” che fa entrare in modalitadi riparametrizzazione, una volta entrati in questa modalita e possibile se-lezionare lungo la curva le nuove estremita ed infine scegliere se tagliare lacurva o meno. Una volta scelti i punti verranno visualizzate due sfere incorrispondenza del punto di taglio, la sfera di colore viola indica il puntoprescelto lungo la curva disegnata, mentre una seconda sfera trasparente dicolore arancio indica il punto esatto in cui iniziera la nuova curva (i puntipossono differire di molto se la risoluzione della curva tagliata e bassa) come
5
Figura 4: Curva specchiata rispetto al piano.
visibile in figura 5.Altra funzione importante e la funzione di conversione, questa permette di
convertire le curve tra diversi tipi, mantenendone la forma inalterata. E pos-sibile convertire le seguenti curve tra loro: Hermite, Hermite spline, Bezier (leconversioni sono possibili a seconda del grado della curva, quindi ad esempiouna curva hermite puo essere convertita in tutte e tre le forme, mentre unacurva di Bezier di grado 4 puo essere convertita solo in una Hermite splinedi grado 4 ma non in una Hermite dato che e disponibile solo il grado 3).Effettuare la conversione e molto semplice, e sufficiente scegliere il tipo dicurva di destinazione e premere il pulsante “Convert”.E possibile poi cambiare la risoluzione della curva che verra ricalcolata im-mediatamenteVi e poi la possibilita di deformare le curve lungo uno dei 3 assi, per farequesto e necessario passare in modalita “Bounding Box”(visibile in figura6). Facendo questo verra visualizzato un box attorno alla curva (e i draggerin corrispondenza dei punti di controllo verranno nascosti) dotato di drag-ger negli angoli, trascinando i dragger in una delle direzioni possibili la curvaverra deformata assieme al box. Inoltre e possibile selezionare lo scaling nellaparte destra dell’interfaccia, cosı facendo la curva verra deformata uniforme-mente nelle 3 direzioni, mantenendo cosı il rapporto tra le stesse inalterato.
Altra funzione, non propriamente di modifica, e la visualizzazione delle
6
Figura 5: Punti di riparametrizzazione.
derivate prima e seconda (vedi figura 7) (questa e disponibile per le curvedi Hermite, Hermite Spline, Bezier, e B-Splines). E possibile mantenere lavisualizzazione delle derivate durante la modifica delle curve, vedendo quindicome esse cambiano.
L’ultima funzionalita di modifica e specifica per una tipologia di curve,ovvero le B-Spline nonuniformi in questo caso e possibile agire su 3 tipidi parametri: il grado della curva (K), il tipo di vettore dei nodi, i valoristessi dei nodi (soltanto scegliendo un vettore dei nodi non-uniforme). Permodificare il grado della curva e sufficiente trascinare la barra sul numerodesiderato. E possibile cambiare la tipologia di vettore dei nodi e l’offset tragli stessi selezionando la tipologia di nodi nel menu a tendina, agendo sulcontrollo che permette di scegliere il valore desiderato per l’offset e quindipremendo il pulsante di conferma (cambiando l’offset la forma della curvanon cambia, ma questo serve per rendere piu semplice la modifica del valoredei nodi in modalita nonuniforme). Infine e possibile modificare il valore deinodi, questo soltanto scegliendo la modalita nonuniforme. Per modificareun nodo e sufficiente fare un doppio click su di esso e questo permettera la
7
Figura 6: Box per la deformazione della curva.
modifica, per convalidare la modifica basta cliccare in qualsiasi altro punto.E possibile vedere i controlli per la modifica dei parametri delle b-spline infigura 8.
3 Descrizione dell’implementazione
Il progetto e stato implementato in linguaggio C++, questo ha permesso dimantenere la parte di calcolo delle curve separata dal resto in maniera dapoterne favorire il riutilizzo. Il progetto e quindi suddiviso in due parti:
libcurve : ovvero la parte per il calcolo delle curve;
editor : contiene il codice riguardante l’interfaccia grafica e la visualiz-zazione.
3.1 Libcurve
Per quanto riguarda questa parte essa e stata implementata senza l’ausilio dilibrerie esterne, questa libreria e costituita da alcune classi: Point, Points eCurve. Inoltre ci sono svariati header file contenenti informazioni necessariecome ad esempio i vari file contenenti le matrici necessarie al calcolo dellecurve. Diamo ora una breve descrizione delle classi sovraelencate:
8
Figura 7: Visualizzazione delle derivate prima e seconda.
Point : questa classe permette di gestire le informazioni riguardanti unpunto in 3 dimensioni;
Points : questa classe permette la gestione di una lista ordinata di punti,l’aggiunta, la cancellazione.
Curve : questa classe si occupa invece di tutti i calcoli necessari per la ges-tione delle curve. Nella sua implementazione si e cercato di rendere ilcalcolo delle curve il piu uniforme possibile in maniera da poter facil-mente aggiungere nuovi tipi di curve. L’obiettivo e stato raggiunto soloin parte dato che aluni tipi di curve hanno delle differenze di base tali darendere difficile un uniformazione. Comunque probabilmente data l’es-perienza acquisita a seguito di quest’implementazione una riscritturaparziale permetterebbe di riuscire a scrivere codice piu generico.
3.2 Editor
Per la realizzazione della parte di interfaccia grafica (quindi di visualizzazionedelle curve, e di interazione con l’utente), sono state utilizzate due librerie:
QT : questa libreria in particolare e stata utilizzata per la scrittura del-l’interfaccia grafica del programma. La libreria Qt permette infatti la
9
Figura 8: Schermata specifica per la modifica delle curve B-Splinenonuniformi.
realizzazione di intere applicazioni multipiattaforma in maniera velocee semplice.
OpenSG : questa libreria invece e stata utilizzata per la parte di visualiz-zazione della scena contenente le curve. Essa infatti permette di gestireanche scene molto complesse potendo addirittura permettere la realiz-zazione di applicazioni multithreaded. Questa libreria pure essendoben strutturata e completa da alcuni punti di vista e carente sotto altriaspetti come quello dell’interazione con l’utente e dal punto di vistadella documentazione.
Questa parte dell’applicazione e suddivisa in tre gruppi di classi:
classi per la gestione : esse sono InteractionManager che permette digestire il flusso di eventi tra l’utente e il resto dell’applicazione, eCurveManager che permette invece di gestire le istanze delle classi chemantengono i dati riguardanti le curve e quelli che gestiscono la lorovisualizzazione.
classi legate a QT : queste classi sono legate in particolar modo alla partedi interfaccia grafica tra di esse molto importanti sono la classe Gui che
10
implementazione la gran parte dell’interfaccia e GlWidget che gestisceil canvas per il disegno delle curve.
classi legate ad OpenSG : queste classi sono invege maggiormente legatead OpenSG, esse gestiscono la parte di disegno delle curve, in parti-colare quindi di gestione della scena. Importanti tra queste ci sonola classe SceneManager che effettua la gestione di base della scena,come ad esempio la telecamera e OsgCurve che gestisce l’intera partedi disegno delle curve.
4 Cenni teorici
Le curve parametriche permettono di avere una rappresentazione matemat-ica molto flessibile di una curva in n dimensioni (nel nostro caso 3). Larappresentazione parametrica delle curve permette in particolare di definirel’andamento delle coordinate di una curva nelle varie dimensioni in terminidi un parametro che puo essere immaginato come il tempo (quindi utilizzan-do una dimensione aggiuntiva oltre a quelle che si intendono rappresentare).Una curva parametrica in n dimensioni ha la seguente struttura:
cn(u) =n∑
i=0
aiui
ad esempio una curva cubica e rappresentata con la seguente formula
c(u) = au3 + bu2 + cu + d
Per poter utilizzare questa rappresentazione delle curve e necessario quindideterminare i valori dei coefficienti. Solitamente quindi i vari termini dellacurva vengono espressi in una forma differente:
c(u) =n∑
i=0
Fi(u)pi
dove le F sono delle funzioni di u chiamate “funzioni di miscelamento” e i psono i cosiddetti “punti di controllo” che determinano la forma che la curvadeve avere. In pratica le funzioni di miscelamento definiscono la maniera incui i vari punti di controllo influenzano la forma della curva. Passiamo ora apresentare la teoria specifica per le varie curve.
11
4.1 Hermite
I parametri necessari al calcolo delle curve di Hermite sono i punti iniziali efinali per cui passera la curva e le rispettive derivate prime negli stessi punti.Questa curva necessita quindi di 4 parametri ed e una curva cubica essendoil suo grado 3. La matrice geometrica dei coefficienti e la seguente:
2 −2 1 1−3 3 −2 −10 0 1 01 0 0 0
La matrice utilizzata in realta nel programma e differente ed in particolare ela seguente:
−1 3 −3 13 −6 3 0−3 3 0 01 0 0 0
questa e stata ottenuta moltiplicando la matrice originale per la seguentematrice:
0 1 0 00 0 0 11 −1 0 00 0 −1 1
Questo serve per non dover distinguere il caso delle curve di Hermite, chenecessita di avere come parametri 2 punti e 2 vettori dagli altri tipi di curveche come parametri hanno soltanto dei punti.
4.2 Hermite spline
Queste curve sono delle curve interpolanti ovvero passano per i punti dicontrollo. La loro derivazione e simile a quella che delle curve di Hermite condue punti e due derivate. Queste curve sono interessanti dal punto di vistateorico ma di difficile utilizzo dal punto di vista pratico in quanto la modificadi un punto nella curva ha effetto su tutta la forma della curva, e quindidifficile realizzare la forma desiderata. Vediamo le matrici dei coefficientigeometrici per le curve rappresentabili nel programma:
4.2.1 4 punti
Qui di seguito vediamo la matrice dei coefficienti per il grado 3:
12
−92
272
−272
92
9 −452
18 −92
−112
9 −92
11 0 0 0
4.2.2 5 punti
Qui di seguito vediamo la matrice dei coefficienti per il grado 4:323
−1283
64 −1283
323
−803
96 −128 2243−16
703
−2083
76 −1123
223
−253
16 −12 163
−11 0 0 0 0
4.2.3 6 punti
Qui di seguito vediamo la matrice dei coefficienti per il grado 5:
−62524
312524
−312512
312512
−312524
62524
6258
−437512
812512
−625 687524
−62512
−212524
887524
−737512
612512
−512524
87524
3758
−192512
267512
−3252
152524
−12512
−13712
25 −25 503
−254
11 0 0 0 0 0
4.3 Bezier
Le curve di Bezier interpolano solo i punti di controllo all’inizio e alla finedella curva ed approssimano gli altri. Questo tipo di curve e molto utilizzatoinfatti la modifica di un punto di controllo non stravolge l’intera curva mala modifica sempre meno piu ci si allontana dal punto su cui si sta agendo.Vediamo qui di seguito le matrici dei coefficienti geometrici delle curve dibezier. Queste matrici possono essere derivate a partire dai polinomi diBerstein:
4.3.1 4 punti
Qui di seguito vediamo la matrice dei coefficienti per il grado 3:
13
−1 3 −3 13 −6 3 0−3 3 0 01 0 0 0
4.3.2 5 punti
Qui di seguito vediamo la matrice dei coefficienti per il grado 4:1 −4 6 −4 1−4 12 −12 4 06 −12 6 0 0−4 4 0 0 01 0 0 0 0
4.3.3 6 punti
Qui di seguito vediamo la matrice dei coefficienti per il grado 5:−1 5 −10 10 −5 15 −20 30 −20 5 0−10 30 −30 10 0 010 −20 10 0 0 0−5 5 0 0 0 01 0 0 0 0 0
4.4 B-Splines
Le B-Spline sono un’altra forma di curve parametriche. Qui sotto vediamola loro matrice dei coefficienti:
−16
12
−12
16
12−1 1
20
−12
0 12
016
23
16
0
4.5 B-Spline nonuniformi
Le B-Spline nonuniformi sono un tipo di curve molto flessibile, esse infattihanno la caratteristica che il movimento di un punto influenza soltanto unapiccola parte della curva. A differenza delle altre forme non hanno una ma-trice dei coefficienti fissa, infatti esse sono costruite in maniera da utilizzare
14
una serie di numeri definiti come nodi che influenzano la forma della curva.Le funzioni di miscelamento per queste curve possono essere calcolate con laseguente formula:
Bi,1(t) =
{1 ti ≤ t < ti+1
0 altrimenti
Bi,n(t) = t−titi+n−1−ti
Bi,n−1(t) + ti+n−tti+n−ti+1
Bi+1,n−1(t)
dove i vari ti sono i nodi. L’unico vincolo sui valori dei nodi e che questisiano non-decrescenti, possono quindi esserci dei casi in cui il denominatorenelle funzioni di miscelamento e zero, in questi casi si assume che l’interotermine della somma sia zero.
4.6 Conversione
La conversione tra le curve e abbastanza semplice per le curve che hanno unamatrice dei coefficienti, infatti in questi casi e sufficiente risolvere il seguentesistema per ottenere la nuova rappresentazione. Se la matrice della primacurva e M1 e quella della seconda curva e M2 e G1 e il vettore geometricocontenente i punti di controllo per la curva di tipo 1, per ottenere una matricedi conversione dal tipo 1 al tipo 2 basta eguagliare i rispettivi sistemi nellaseguente maniera:
M2G2 = M1G1
abbiamo quindi cheG2 = M−1
2 M1G1 = M1,2G1
. Quindi riepilogando per ottenere una matrice di conversione da una forma1 ad una forma 2 e sufficiente calcolare la matrice
M1,2 = M−12 M1
. Qui di seguito sono riportate le matrici per effettuare le conversioni utiliz-zate nel programma
4.6.1 Da Bezier 4p a Hermite 2p 2d−2 3 0 01 0 0 00 0 0 10 0 −3 4
15
4.6.2 Da Bezier 4p a Hermite 4p1 0 0 0827
49
29
127
127
29
49
827
0 0 0 1
4.6.3 Da Bezier 5p a Hermite 5p
1 0 0 0 081256
2764
27128
364
1256
116
14
38
14
116
1256
364
27128
2764
81256
0 0 0 0 1
4.6.4 Da Bezier 6p a Hermite 6p
1 0 0 0 0 010243125
256625
128625
32625
4625
13125
2433125
162625
216625
144625
48625
323125
323125
48625
144625
216625
162625
2433125
13125
4625
32625
128625
256625
10243125
0 0 0 0 0 1
4.6.5 Da Hermite 4p a Hermite 2p 2d
−92
9 −92
11 0 0 00 0 0 1−1 9
2−9 13
2
4.6.6 Da Hermite 2p 2d a Hermite 4p
0 1 0 0427
1627
13
−227
227
527
89
−427
0 0 1 0
4.6.7 Da Hermite 2p 2d a Bezier 4p
0 1 0 013
23
0 00 0 4
3−13
0 0 1 0
16
4.6.8 Da Hermite 4p a Bezier 4p1 0 0 0−56
3 −32
13
13
−32
3 −56
0 0 0 1
4.6.9 Da Hermite 5p a Bezier 5p
1 0 0 0 0−1312
4 −3 43
−14
1318
−329
203
−329
1318
−14
43−3 4 −13
12
0 0 0 0 1
4.6.10 Da Hermite 6p a Bezier 6p
1 0 0 0 0 0−7760
5 −5 103
−54
15
269240
−14524
29524
−11512
18548
−77120
−77120
18548
−11512
29524
−14524
269240
15
−54
103
−5 5 −7760
0 0 0 0 0 1
4.7 Riparametrizzazione
Per poter avere una procedura di riparametrizzazione uniforme per i varitipi di curva essa e stata svolta in maniera un po particolare, ovvero vienecalcolata come per le spline in cui i nuovi punti sono lungo la curva e sonodistribuiti in maniera regolare e poi i punti vengono convertiti nella correttaforma utilizzando le matrici di conversione sopra riportate. Ad esempio seabbiamo una curva di grado 3 e i punti di riparametrizzazione sono u1 ed u2
i nuovi punti di controllo saranno:
pi = c(iu2 − u1
3+ u1) dove i ∈ N e 0 ≤ i ≤ 3
Una volta calcolati i nuovi punti di controllo e sufficiente effettuare la con-versione dalla spline alla forma desiderata e cosı otteniamo i nuovi punti dicontrollo.
17