Anamorfosi speculari
di immagini bitmap

Camillo Trevisan
trevisan@iuav.it

Data creazione: 21 Maggio 2001
Aggiornamento: 21 Maggio 2001

Copiare il software cono.exe, cilindro.exe, generico.exe, specchio.exe, funzionanti in tutte le versioni di Windows (80 kB)
 

 

La geometria

Si supponga di costruire la prospettiva piana di un oggetto: ponendo l'occhio nel centro di proiezione (PV), un generico punto P dell'oggetto reale si proietta sul suo omologo P' appartenente al piano alfa della prospettiva e viceversa.
Supponiamo ora - mantenendo immobile il Centro di proiezione e di vista, il Quadro prospettico e l'oggetto - di anteporre al Quadro una generica superficie semi-riflettente beta. In tal modo, ciascuna semiretta r, uscente dal PV e passante per P, oltre ad intersecare il piano prospettico in P', intersecherà anche la superficie semi-riflettente in P'' e sarà da questa riflessa in q (con P''' intersezione di q con il piano orizzontale XY), seguendo le leggi della riflessione:
a) il raggio incidente r, il raggio riflesso q e la normale o alla superficie di incidenza nel punto di incidenza appartengono ad un piano;
b) l'angolo di incidenza, calcolato rispetto alla normale o, è uguale all'angolo di riflessione, calcolato rispetto alla stessa normale.
Dunque, dal PV, i punti P, P', P'' risultano coincidenti (appartengono, infatti, alla stessa retta r), con P'' punto di riflessione di P''' dal PV.

È da notare che non in tutti i casi si otterrà l'intersezione P''' di q con il piano XY: questo, evidentemente, dipende dalla conformazione della superficie riflettente e dalla giacitura del PV e di P.
Come risultato finale, dal PV si 'vedrà' la stessa scena sia osservando direttamente l'oggetto P, sia osservando la sua prospettiva P' oppure, infine, osservando la riflessione di P''' in P'' sulla superficie beta.

In tal modo sarà possibile creare anamorfosi speculari anche di ombre e, comunque, di oggetti complessi o di immagini ottenute da scanner: sarà sufficiente possedere una immagine raster e conoscere, o definire, il Punto di Vista di quell'immagine.

 

L'algoritmo

A questo punto è immediato comprendere il funzionamento del software:
- Si definisce una qualsiasi immagine bitmap come la prospettiva di una scena della quale si conosce la giacitura del quadro alfa e la posizione del centro di proiezione e di vista PV.
- Si definisce una superficie riflettente beta.
- Ciascun pixel di alfa sarà pertanto deformato in una nuova immagine bitmap, appartenente al piano XY, in modo tale che l'immagine finale sia identica all'immagine contenuta in alfa, vista dal PV.
Evidentemente, in funzione della forma della superficie riflettente beta, il pixel si deformerà in vario modo, occupando di norma un'area superiore e comunque di forma diversa da quella originaria: lo specchio curvo, infatti, di norma non conserva le caratteristiche proiettive.
Operativamente, poiché si lavora nello spazio cartesiano XYZ, all'immagine di partenza (definita da un certo numero di pixel in lunghezza e altezza) si fa corrispondere un rettangolo di altrettante unità (il rettangolo azzurro dell'immagine). Pertanto, per ciascun pixel di alfa è possibile individuare un quadrato definito da quattro vertici, espressi in coordinate XYZ, appartenente al piano di alfa. I lati del quadrato sono divisi dal software in un certo numero di parti (definite dall'utente mediante il parametro Accuratezza e comprese tra 1 e 20), ottenendo così un poligono (formato da 4 a 80 punti). I punti che formano il poligono sono trasformati seguendo il procedimento descritto, costruendo un nuovo poligono, non più 'quadrato' e appartenente al piano orizzontale XY.
Fissato il numero di pixel del lato maggiore dell'immagine finale e noto il rettangolo, appartenente al piano XY, che include completamente l'immagine in anamorfosi, sarà pertanto possibile stabilire se un qualsiasi pixel di tale immagine è interno o esterno al poligono.
Nel caso sia interno, ad esso sono assegnati gli stessi valori RGB (Red, Green, Blue) del pixel di alfa.

Il software
Esempi ottenuti con il software cono.exe
Esempi ottenuti con il software cilindro.exe
Esempi ottenuti con il software generico.exe

I quattro programmi operano in modo del tutto analogo tra loro, pur richiedendo l'immissione di parametri diversi, in funzione delle loro caratteristiche specifiche.
In tutti i casi, i parametri sono contenuti in un file di testo (in formato ASCII, che si potrà creare, ad esempio, con WordPad) che sarà l'unico file immesso direttamente dall'utente: infatti, ciascun programma richiede esclusivamente l'immissione del nome del file di testo che contiene i parametri di lavoro.
I file usati dai programmi sono di due tipi:
- file di tipo DXF contenenti entità 3Dfaccia (o 3Dface, nella versione inglese di AutoCAD);
- file bitmap di tipo PPM, in formato ASCII ed a 24 bit di profondità di colore, ottenuti, ad esempio, per mezzo del programma PaintShop.

Il programma Cono.exe considera un cono verticale retto a base circolare come superficie specchiante e richiede la seguente struttura del file di ingresso:
Coordinate X e Y dell'asse del cono verticale
Raggio della base del cono
Altezza del cono
Nome del file (di tipo DXF) contenente la faccia che definisce l'immagine
Nome file bitmap (PPM) di ingresso che contiene l'immagine di partenza 
Nome file bitmap (PPM) di uscita che conterrà l'immagine in anamorfosi
Coordinate X Y Z del Centro di Proiezione e di Vista 
Numero di pixel del lato maggiore dell'immagine finale (massimo 5000, valore espresso con un numero intero)
Accuratezza di calcolo (valori accettati: interi compresi tra 1 e 20)

Esempio:
1000.0 1000.0
800.0
900.0
immagine.dxf
base.ppm
cono.ppm
1000.0 1000.0 950.0
1000
20

L'esempio indica un cono avente l'asse posto nelle coordinate X = 1000, Y= 1000 (Z è sempre posta pari a zero); avente un raggio di 800 unità ed una altezza di 900 unità (rispetto al piano XY che contiene la base). Il nome del file contenente la faccia che racchiude l'immagine di partenza è immagine.dxf (conterrà un'unica faccia ed in ogni caso verrà usata l'ultima faccia letta nel file). Il nome del file che contiene l'immagine è base.ppm. Il nome del file che sarà prodotto dal programma è cono.ppm. Le coordinate X, Y, Z del centro di proiezione sono X = 1000; Y = 1000; Z = 950. Il lato maggiore dell'immagine prodotta sarà di 1000 pixel. Infine, l'accuratezza sarà di 20 (il valore massimo).

Il programma Cilindro.exe considera un cilindro verticale retto a base circolare come superficie specchiante (in questo caso il cilindro è considerato di altezza infinita) e richiede la seguente struttura del file di ingresso:
Coordinate X e Y dell' asse del cilindro verticale
Raggio della base del cilindro
Nome del file DXF contenente la faccia che definisce l'immagine
Nome file bitmap PPM di ingresso che contiene l'immagine di partenza 
Nome file bitmap PPM di uscita che conterrà l'immagine in anamorfosi
Coordinate X Y Z del Centro di Proiezione 
Numero di pixel del lato maggiore dell'immagine finale 
Accuratezza di calcolo (1..20)

Il programma Generico.exe considera come superficie specchiante un generico insieme di facce, contenute in un file DXF (massimo 50.000 facce triangolari), e richiede la seguente struttura del file di ingresso:
Nome del file DXF contenente le facce che definiscono la superficie dello specchio
Nome del file DXF contenente la faccia che definisce l'immagine
Nome file bitmap PPM di ingresso che contiene l'immagine di partenza 
Nome file bitmap PPM di uscita che conterrà l'immagine in anamorfosi
Coordinate X Y Z del Centro di Proiezione 
Numero di pixel del lato maggiore dell'immagine finale 
Accuratezza di calcolo (1..20)
Valore che indica se l'asse principale di vista è verticale ed è posto sul vertice di un cono generico (1 = sì, qualsiasi altro valore intero = no).

Infatti, ad esempio, è possibile definire un cono retto a base ellittica o di qualsiasi altra forma: se il Centro di Proiezione è posto sull'asse del cono riflettente, il programma potrebbe non trovare nessuna intersezione con le facce dello specchio. Il flag 0/1 permette dunque al programma di operare in modo corretto, eliminando dal calcolo l'areola in corrispondenza del vertice del cono.
Il programma Generico.exe, non conoscendo a priori la forma della superficie dello specchio, opera seguendo lo schema:
- per ciascun punto P, da trasformare in anamorfosi in P''', costruisce la retta PV-P;
- verifica se tale retta interseca uno dei triangoli che definiscono la superficie riflettente (in ogni caso prende in considerazione il primo triangolo intersecato dalla retta PV-P);
- se nessun triangolo è intersecato dalla retta PV-P, il punto P non è trasformabile;
- in caso contrario, calcola la perpendicolare al piano - definito dal triangolo - in P'', punto di intersezione interno al triangolo;
- infine, calcola la retta riflessa e l'intersezione - se esistente - tra tale retta ed il piano XY: tale punto è il punto P''', anamorfosi speculare di P'' dal PV.
L'approssimazione di una superficie curva per mezzo di triangoli può produrre risultati non del tutto corretti: infatti, in tal modo, la superficie risulta non continua ed un singolo pixel 'di partenza' può contenere punti appartenenti a facce anche molto angolate tra loro (se l'interpolazione ha previsto la creazione di poche facce). Pertanto, è utile definire un gran numero di facce interpolanti, anche a scapito dei tempi di calcolo ed in ogni caso non più di 50.000.

Il programma Specchio.exe, infine, considera un generico piano come superficie specchiante (in tal caso, poiché la deformazione mantiene le caratteristiche proiettive, l'accuratezza è posta automaticamente ad 1) e richiede la seguente struttura del file di ingresso:
Nome del file DXF contenente la faccia che definisce l'immagine
Nome del file DXF contenente la faccia che definisce il piano dello specchio (considerato come un piano infinito)
Nome file bitmap PPM di ingresso che contiene l'immagine di partenza 
Nome file bitmap PPM di uscita che conterrà l'immagine in anamorfosi
Coordinate X Y Z del Centro di Proiezione 
Numero di pixel del lato maggiore dell'immagine finale 

Note operative generali:
- Poiché i tempi di calcolo possono essere anche molto lunghi (specialmente per il programma generico.exe) è opportuno eseguire alcune prove con valore 1 per l'accuratezza, definendo poi un valore più elevato per l'immagine definitiva (un valore 20 per l'accuratezza moltiplica per 20 il tempo di calcolo!).
- Per evitare inversioni dell'immagine (destra/sinistra o alto/basso) è opportuno che il primo punto del rettangolo che definisce l'immagine di partenza (3Dface o 3Dfaccia, in AutoCAD) sia posto in alto a sinistra, il secondo in alto a destra, il terzo in basso a destra ed infine il quarto in basso a sinistra (rispetto al PV). Inoltre, è necessario che i quattro punti che definiscono la faccia giacciano su di un piano.
- Creare i file DXF nella versione 12 e nel formato ASCII (in AutoCAD, usando l’opzione ‘Seleziona oggetti’).
- Salvare il file dell'immagine bitmap in formato PPM (Portable Pixelmap, 24 bit), ad esempio usando il software Paint Shop (in futuro sarà implementato il formato TIF).
- Nel caso del programma generico.exe, conviene costruire lo specchio come solido AutoCAD, esportandolo con il comando 3DSOUT, importandolo con 3DSIN ed esplodendo la mesh prima di salvare le facce nel formato DXF (usare la variabile AutoCAD facetres con un valore elevato, posto a 10 oppure a 5, definendola prima di esportare il solido con il comando 3DSOUT).

Nota finale. Il problema inverso – data l’immagine prodotta da un’anamorfosi speculare, trovare il Punto di Vista e la superficie che producono un’immagine ‘regolare’ – è risolvibile per mezzo di un normale programma di rendering. Infatti, si dovrà procedere in ogni caso per tentativi, definendo via via la posizione del PV, tipo e giacitura della superficie riflettente e applicando l’immagine in anamorfosi come mappa su di una superficie piana: l’immagine prodotta dal programma sarà quella cercata.