Proiezione di immagini bitmap
su superfici generiche
e contro-proiezione su piano

Camillo Trevisan
trevisan@iuav.it

Copiare il freeware proietta.exe,
funzionante in tutte le versioni
di Windows (22 kB)

Data creazione: 31 Maggio 2001
Aggiornamento: 3 Giugno 2001

Homepage
IUAV Istituto Universitario di Architettura di Venezia 
DPA Dipartimento di Progettazione Architettonica

Abraham Bosse, Moyen universel de pratiquer la perspective sur les tableaux ou surfaces irrégulières, Paris 1653

 

 

La geometria
Si consideri un generico Centro di proiezione O, un generico piano alfa ed una generica superficie gamma. Una qualsiasi immagine posta su alfa potrà pertanto essere proiettata da O su gamma (a patto che tutte le rette proiettanti, per ciascun punto appartenente al rettangolo che racchiude l'immagine, intersechino la superficie gamma).
Definito un ulteriore piano beta ed un generico Punto di vista, sarà infine possibile contro-proiettare su beta l'immagine proiettata su gamma.
Il software Proietta consente, ad esempio, a partire da una generica fotografia della volta della chiesa di S. Ignazio a Roma, di ottenere una immagine nadirale (conoscendo la forma della volta, la posizione del fuoco dell'obiettivo e la giacitura del piano della pellicola).
Uso del programma
Il programma Proietta è un freeware di uso completamente gratuito.
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, il programma richiede esclusivamente l'immissione del nome del file di testo contenente 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), ottenuti in AutoCAD per mezzo del comando DXFOUT o per mezzo di altri software CAD;
- file bitmap di tipo PPM, in formato ASCII ed a 24 bit di profondità di colore, ottenuti, ad esempio, per mezzo del programma PaintShop.

Esempio di file di testo contenente i parametri d'uso del programma:
immagine.dxf
base.ppm
0.0 1500.0 -1500.0
superficie.dxf
immagine1.dxf
prova.ppm
1000.0 -2500.0 -2000.0
1000
5

La prima riga contiene il nome del file, di tipo DXF e salvato nella versione 12, contenente un'unica faccia rettangolare e piana, comunque disposta nello spazio (se il file contiene più di una faccia sarà considerata solo l'ultima). Alla faccia sarà fatta corrispondere dal software l'immagine bitmap di partenza, quella da proiettare sulla superficie generica. Il primo punto della faccia indica il vertice in alto a sinistra dell'immagine, il secondo il vertice in alto a destra, il terzo punto indica il vertice in basso a destra dell'immagine ed infine il quarto punto indica il vertice in basso a sinistra. Le proporzioni della faccia dovrebbero essere le stesse dell'immagine: in caso contrario l'immagine sarà deformata in modo da adattarsi alla faccia.

La seconda riga contiene il nome del file PPM dell'immagine iniziale (posta sul piano alfa e definita dalla faccia indicata dal primo parametro).

La terza riga contiene le coordinate X, Y, Z del Centro di proiezione, utile per la proiezione dell'immagine sulla superficie generica gamma.

La quarta riga contiene il nome del file DXF (ancora una volta salvato nella versione 12 di AutoCAD), contenente le facce che definiscono la superficie generica gamma. Il numero massimo di facce triangolari è 50000 (il software divide automaticamente ciascuna faccia quadrangolare in due facce triangolari: la prima sul 1°, 2° e 3° punto, la seconda sul 3°, 4° e 1° punto della faccia quadrangolare, eliminando eventuali facce ad area nulla o minore di 0.00001 unità del disegno). Saranno lette esclusivamente entità 3Dface (usando mesh sarà dunque necessario 'esploderle' prima di salvarle nel formato DXF; usando solidi sarà invece necessario esportarli con il comando 3DSOUT [dopo aver impostato la variabile FACETRES a 5 o 10], importarli con 3DSIN ed 'esplodere' le mesh). Nel caso alcune rette proiettanti non intersechino nessuna faccia di questa superficie, il programma lo segnalerà all'inizio del calcolo. Infine, è da notare che, per ciascuna retta proiettante, verrà presa in considerazione dal software la prima faccia triangolare intersecata. Infatti, definita la lista di facce triangolari che compongono la superficie gamma, questa viene scorsa verificando per ciascuna faccia se il punto di intersezione tra la retta proiettante e il piano che contiene quella faccia è interno al perimetro della faccia stessa. Se nessuna faccia verifica questa condizione, il pixel non si proietta su gamma. Pertanto, se una retta proiettante interseca più di una faccia, il risultato potrebbe non essere quello previsto. Dunque, anche per rendere più veloce la fase di calcolo, è opportuno eliminare preventivamente tutte le facce certamente non interessate alla proiezione. 

La quinta riga contiene il nome del file DXF contenente un'unica faccia (triangolare o quadrangolare) che definisce il piano di contro-proiezione. Tale piano è considerato dal software come infinito: l'unica attenzione consiste pertanto nel far sì che il Centro di contro-proiezione non giaccia su questo piano.

La sesta riga contiene le coordinate X, Y, Z del Centro di contro-proiezione.

La settima riga contiene il nome del file PPM dell'immagine finale (posta sul piano beta), creata dal programma. L'immagine è ottenuta ribaltando beta sul piano XY e inquadrandola in un rettangolo avente i lati paralleli agli assi X e Y. L'immagine potrà poi essere importata, ad esempio in PaintShop, ed esportata in altro formato grafico.

L'ottava riga contiene il numero di pixel del lato maggiore di tale immagine (il numero di pixel dell'altro lato sarà calcolato dal software). 

Infine, la nona riga contiene un valore intero relativo all'accuratezza di calcolo (valore compreso tra 1 e 50). Infatti, se la superficie gamma non è piana (nel caso di superficie piana l'accuratezza potrà essere posta a 1), ciascun pixel dell'immagine iniziale si deformerà in modo non facilmente prevedibile e, di norma, si proietterà su di un'area non piana. Così se, ad esempio, il valore dell'accuratezza è posto a 10, ciascun lato di ciascun pixel dell'immagine iniziale sarà suddiviso in 10 parti (ciascun pixel sarà dunque suddiviso in 100 sub-pixel ed il perimetro in 40 parti, mentre con l'accuratezza posta a 50 il pixel sarà diviso in 2500 sub-pixel ed il perimetro in 200 parti). Ogni sub-pixel di contorno sarà proiettato sulla superficie gamma e contro-proiettato su beta: i sub-pixel interni al contorno su alfa sono considerati interni anche su beta.
Evidentemente, il parametro Accuratezza influenza notevolmente il tempo di calcolo, con fattore moltiplicativo circa pari a quattro: sarà pertanto opportuno eseguire alcune prove con valori bassi, prima di eseguire il calcolo finale con valore più elevato.