3.2 Funzionalità dell’editor
3.2.3 Costruzione della height map a partire dalla normal map Teoria sui cerchi osculator
A partire dalle normal map è possibile calcolare un’altra forma di height map, sfruttando i cerchi osculatori [22].
Come sappiamo la mappa delle normali alla superficie indicano il modo in cui la pendenza della superficie varia e riflette la luce. La normale è, per definizione, la perpendicolare alla superficie. Sul piano cartesiano, la normale di una linea curva in un punto è la perpendicolare alla retta tangente in quel punto. In particolare, data una curva M(, ) = 0, la sua retta tangente nel punto (', ') è M ∙ ( ') + M ∙ ( ') = 0, mentre la normale è M ∙ ( ') M ∙ ( ') = 0.
44 Graficamente, le normale (?e 3) e le tangenti (NO? e NO3) per i punti (?, ?) e (3, 3) sono raffigurate nella Figura 10.
Si definisce cerchio osculatore di una curva P = M(, ) in un dato punto J(', ') la circonferenza che ha la stessa tangente di P nel punto J e la sua stessa curvatura. Proprio come la tangente è la migliore retta che approssima la curva nel punto J, il cerchio osculatore è la miglior circonferenza che approssima la curva in J.
Ad esempio, se si considera un’ellisse centrata nel punto (, 0), e supponendo che = 9 + per un qualche Q 0, quindi l’ellisse si sviluppa nel primo e nel quarto quadrante del piano
Figura 10: Tangenti e Normali.
45 cartesiano ( Q 0), definita dall’equazione
( )3
93 + 3
R3 = 1
il cerchio osculatore ha equazione ( :)3+ ( S)3 = T3, come nella Figura 11 che rappresenta la situazione tipica.
È necessario quindi determinare :, S e T al fine di ricavare l’equazione del cerchio osculatore, che, nel caso in esempio, deve soddisfare le seguenti condizioni:
1. La circonferenza deve passare dal punto (, 0);
2. La tangente alla circonferenza nel punto (, 0) deve coincidere con la tangente all’ellisse nello stesso punto;
3. La curvatura della circonferenza nel punto (, 0) deve coincidere con la curvatura dell’ellisse nello stesso punto.
Si tratta quindi di un sistema di tre equazioni in tre variabili. La condizione 2 viene soddisfatta se il centro del cerchio osculatore è posto sull’asse delle ascisse, il che riduce l’equazione della circonferenza in ( :)3+ 3 = T3, quindi S = 0. Per determinare la condizione 3,
sappiamo che la curvatura della circonferenza è ?
U e la curvatura
dell’ellisse in (, 0) è data da VV(, 0) per cui ′′ denota la derivata seconda X4
X 4. Una volta ottenuto T è possibile ottenere facilmente :.
Oltre che alle ellissi, si possono calcolare i cerchi osculatori anche per le curve. Data una curva M(, ), infatti, esiste un unico cerchio osculatore in un dato punto (, ). Rispetto a una retta ((), invece, per qualsiasi punto di essa esistono infiniti cerchi osculatori, a raggio variabile. Si tratta infatti del fascio di circonferenze avente per retta tangente la retta
46
Figura 12: Cerchi osculatori di una retta.
data (() e passante per il punto (, ). Ogni cerchio osculatore appartenente al fascio di circonferenze ha l’interessante proprietà di possedere il centro nella retta perpendicolare alla retta ((), come mostra la Figura 12.
Come sappiamo, per ogni fascio di circonferenze esiste una sola circonferenza tangente a una retta e passante per due punti. Data quindi una curva M(, ) passante per J?(?, ?) e J3(3, 3), e le due normali ? e 3, esiste un solo cerchio osculatore P? alla normale ? passante
per J? e per J3 e un solo cerchio osculatore P3 alla normale 3 passante per J3e per J?, e P? = P3, infatti posto il sistema le tre condizioni:
1. Circonferenza passante per il punto J?;
2. Circonferenza passante per il punto J3; 3. Circonferenza tangente a ? in J?.
Il sistema ha una unica soluzione, che risolve anche il sistema: 1. Circonferenza passante per il punto J?;
2. Circonferenza passante per il punto J3;
4. Circonferenza tangente a 3 in J3.
La circonferenza ottenuta ha il centro nel punto di intersezione tra le tangenti a M(, ) nei punti J? e J3, rispettivamente NO? e NO3 (Figura 13).
47 Questa proprietà può essere sfruttata per calcolare la height map di un’immagine, data la sua normal map. Supponendo che ogni altezza è mappata sull’ordinata del piano cartesiano, è infatti possibile calcolare localmente, punto per punto, le varie altezze in base alla normale alla superficie, i due coefficienti angolari delle normali ? e 3, le coordinate di uno dei due punti J?o J3 e l’ascissa dell’altro punto, risolvendo il seguente sistema a tre equazioni e tre incognite
Y Z [ Z \( ?)3+ ( ?)3 = ( 3)3+ ( 3)3 ( ?) = 1 ?( ?) ( 3) = 1 3( 3)
le cui equazioni corrispondono a:
Figura 13: Cerchio osculatore di una retta normale a una curva F(x,y) nel punto P, passante per due punti di cui uno il punto P.
48 1. Il raggio della circonferenza con centro nel punto J? è uguale al
raggio della circonferenza con centro in J3. Data l’equazione generica della circonferenza
( ])3+ ( ])3 = T3
è sufficiente porre uguali i raggi delle due circonferenze, in modo che J? = J3.
2. L’equazione della retta tangente alla curva M(, ) passante per il punto J? e perpendicolare alla normale ?, di cui è noto il coefficiente angolare ?;
3. L’equazione della retta tangente alla curva M(, ) passante per il punto J3 e perpendicolare alla normale 3, di cui è noto il coefficiente angolare 3.
Conoscendo quindi i valori ? e 3, le coordinate di J? e 3 di J3, risolvendo il sistema è possibile ottenere il valore di 3 (Figura 14).
49 Essendo di secondo grado, il sistema ha due soluzioni. Sono due, infatti, le circonferenze che risolvono le condizioni date. La Figura 15, con i limiti di spazio dovuti alla lontanante delle due soluzioni, mostra le due soluzione in (3, 3) e in (3, 3V). La figura è ben chiara se si immagina la circonferenza tracciata con la linea tratteggiata continuare fino ad incontrarsi nel secondo punto. La soluzione scelta tra le due fornite dal sistema sarà sempre quella che minimizza il raggio della circonferenza del cerchio osculatore, dato che si sta operando per ogni pixel dell’immagine.
Il sistema soffre inoltre di un altro problema. Nel caso in cui le due normali fossero parallele, ovvero il coefficiente angolare ? della prima normale alla curva nel punto (?, ?) sia uguale al coefficiente angolare 3 della seconda normale alla curva nel punto (3, 3), il sistema
risulterebbe indeterminato, perché le equazioni 2 e 3 del sistema risulterebbero equivalenti. La geometria, in questo caso viene in aiuto, in quanto se ? = 3, allora anche le
tangenti alla curva NO? e NO3 sono parallele, e ciò
significa che la curva è sovrapponibile alle tangenti. Per questo, il punto (3, 3) si può dire
Figura 15: I due punti del cerchio osculatore che risolvono il sistema.
50 collocato sulla retta tangente alla superficie nel punto (?, ?).
Formalmente, se ? = 3 allora ? = ?
^_( ?) , ossia :
3 = 1
?( ?) + ?
Ripetendo la risoluzione del sistema per qualsiasi punto successivo J;… Ja, tenendo conto delle eccezioni analizzate e avendo le ascisse di
ogni punto e i coefficienti angolari delle normali ;… a, è possibile calcolare la serie completa della ordinate per tutta la curva, come viene mostrato dalla Figura 16.
Sappiamo che una normal map è una texture che fornisce le normali alla superficie piana: in altre parole è un sistema per salvare le informazioni relative ai coefficienti angolari delle normali in ciascun punto. Nella normal map del piano di dimensione (b, *), tenuto * costante, è possibile calcolare l’altezza relativa al piano considerando b come l’ascissa e come l’ordinata, con la procedura descritta poco sopra, procedendo lungo il profilo del piano. Allo stesso modo è possibile
51 calcolare l’altezza relativa al piano tenendo b costante e considerando * come ascissa. In questo modo è possibile costruire la mappa delle altezze di tutta l’immagine a partire da un qualsiasi punto dell’immagine a cui viene data un’altezza iniziale (ad esempio = 0). Le altre altezze verranno calcolate in base alla prima, e si potrà in seguito traslare verticalmente le altezze facendo coincidere il minimo valore ^ca = 0, quindi eseguire la proporzione per far ottenere ^d = 255, così da rendere il formato dei dati compatibile col formato RGB. Per ogni pixel i avremo quindi 0 ≤ c ≤ 255 per ogni canale di colore, ottenendo quindi un’immagine in scala di grigio, cioè la height map ricavata sfruttando i cerchi osculatori.