E57, spiegato: il "PDF delle nuvole di punti"
Immagina di fotografare una stanza, ma invece di ottenere un'immagine piatta acquisisci la posizione esatta di un milione di minuscoli punti che ricoprono pareti, sedie e tazze. Fai ruotare rapidamente un laser e misura la distanza di ogni oggetto: il risultato è una nuvola di punti, una "fotografia" 3D composta da punti misurati. Questa guida semplice e senza tecnicismi mostra che cosa contiene davvero un file E57 e un ingegnoso espediente usato dal nostro software.
Perché serve un formato speciale?
Una normale foto è solo una griglia di pixel colorati: semplice. Una scansione 3D è più complessa. Per ognuno dei suoi milioni di punti occorre memorizzare dove si trova nello spazio (tre numeri: X, Y, Z), di che colore è, con quale intensità viene riflesso il raggio laser (la sua intensità, simile a una "foto laser" in bianco e nero) e, spesso, le foto panoramiche scattate contemporaneamente dallo scanner.
Immagina ora che una persona esegua la scansione con uno scanner Faro, un collega ne usi uno Leica e il cliente apra il risultato in un software Autodesk. Tre dispositivi e tre programmi diversi, che devono poter leggere lo stesso file anche a distanza di anni, senza dover chiedere a un produttore un decodificatore segreto. È questo il problema risolto da E57: uno standard aperto e indipendente dai produttori (pubblicato come ASTM E2807 e basato sulla libreria open source libE57). Viene chiamato il "PDF delle nuvole di punti": un unico file portabile che tutti possono leggere nello stesso modo.
L'idea chiave: una mappa testuale con la potenza dei dati binari
In sostanza, un file E57 è un ibrido che unisce due elementi molto diversi: una piccola sezione XML, cioè testo semplice e leggibile che funge da indice, e grandi blocchi di dati binari contenenti milioni di numeri grezzi, archiviati in modo compatto per velocizzare l'accesso.
Perché mettere la mappa alla fine? Perché mentre uno scanner sta scrivendo il file non ne conosce ancora le dimensioni complessive, quindi scrive prima i dati grezzi in sequenza e, una volta terminato, aggiunge un riepilogo ordinato. Il vantaggio è enorme: per estrarre una scansione da un file di 20 gigabyte, il software legge la minuscola intestazione, passa alla mappa XML, trova la riga che dice "la scansione #3 si trova al byte 4.812.000.000" e va dritto lì.
Un sistema di sicurezza discreto: l'intero file è suddiviso in "pagine" da 1024 byte e gli ultimi 4 byte di ogni pagina sono riservati a una somma di controllo, un'impronta che consente al software di rilevare eventuali danneggiamenti del file.
Tutto si dirama da un'unica radice
Apri quella mappa XML e trovi un albero — proprio come le cartelle sul tuo computer. C'è un solo root e due rami fanno la maggior parte del lavoro: data3D, un elenco numerato di scansioni, e images2D, un elenco numerato di foto (di solito i panorami a 360° scattati dallo scanner).
Due modi di scrivere un punto
Uno scanner laser non ragiona realmente in termini di X, Y, Z. Rimane fermo in un punto e ruota, rilevando per ogni punto tre valori: la distanza percorsa dal raggio, l'azimut (l'angolo orizzontale, da sinistra a destra) e l'elevazione (l'angolo verso l'alto o il basso). Queste sono coordinate sferiche, il linguaggio naturale dello scanner. La maggior parte dei software, invece, preferisce le normali coordinate cartesiane X, Y, Z. E57 può memorizzare coordinate dell'uno o dell'altro tipo e per passare da un tipo all'altro basta un po' di trigonometria.
Tre tipi di foto incorporate
Le foto in images2D non sono link a file contenuti in qualche cartella — il file JPEG o PNG vero e proprio è incorporato direttamente all'interno dell'E57. E c'è più di un tipo di foto incorporata. E57 racchiude ciascuna foto in una "rappresentazione" che indica al software quanto l'immagine sia affidabile dal punto di vista geometrico. La differenza si riduce a una sola domanda: quanto è completa la descrizione della fotocamera?
sphericalRepresentation— un panorama completo a 360° × 180°, la classica immagine equirettangolare 2:1 allungata. Poiché la proiezione è nota, ogni pixel corrisponde a una direzione precisa e si allinea perfettamente con la nuvola di punti. È il percorso principale del nostro flusso di elaborazione: leggiamo l'immagine, la adattiamo a un rapporto 2:1 esatto e la passiamo al visualizzatore di panorami.pinholeRepresentation— una normale foto scattata con un obiettivo, descritta dal classico modello di camera stenopeica (lunghezza focale, dimensioni del sensore, centro ottico). Anche in questo caso il software può determinare la direzione di ogni pixel, ma solo entro un campo visivo più ristretto. In pratica, è soprattutto così che funziona Leica: inserisce direttamente nel file E57 una cubemap già pronta, composta dalle sei facce piane di un cubo rivolte verso l'esterno, e il nostro processo dedicato le unisce per creare un panorama completo. È uno dei casi più semplici da riconvertire in un'immagine a 360° pulita.visualReferenceRepresentation— una foto senza alcun modello di camera, esplicitamente "solo per l'occhio umano". Non la si può usare per misurare né proiettarla sulla nuvola; è solo un'immagine di riferimento. Il nostro importatore conserva queste immagini come commenti allegati invece di collocarle in 3D.
Ecco il punto. sphericalRepresentation è la scelta più diffusa, ma è sorprendentemente facile commettere piccoli errori — ed è proprio per questo che la stessa scansione può apparire diversa da un programma all'altro.
- Le zone cieche vengono ritagliate. Ogni scanner ha un punto che non riesce a vedere, in genere quello immediatamente sotto di sé, dove si trova il treppiede. Alcuni software di esportazione si limitano a ritagliare il panorama in quel punto, lasciando uno spazio vuoto o un'altezza non standard.
- Pixel non quadrati. Un panorama corretto ha pixel quadrati (
pixelWidth=pixelHeight); in alcuni file non lo sono, quindi l'immagine appare deformata finché non viene ridimensionata. - La direzione sbagliata è “avanti”. La rotazione memorizzata con un panorama indica quale direzione si trova al centro dell'immagine, e non esiste un accordo universale su cosa significhi davvero “avanti” — alcuni esportatori la orientano a nord, altri a est. Basta un piccolo errore per ruotare l'intera vista.
- Gli strumenti di modifica possono perdere dati. Il passaggio di un file E57 attraverso CloudCompare, per esempio, può far perdere la posizione di acquisizione delle immagini
pinholeRepresentation— le foto restano, ma non conservano più l'informazione su dove sono state scattate.
In sintesi, software diversi spesso visualizzano lo stesso file E57 in modo diverso. Il nostro importatore cerca di compensare le anomalie più comuni, ridimensionando i pixel non quadrati, correggendo l'orientamento del panorama e uniformando l'immagine al formato 2:1, affinché il tour appaia corretto indipendentemente dallo strumento che ha generato il file.
Quando il panorama è incorporato nella nuvola di punti stessa
Ecco una delle idee più eleganti — e meno apprezzate — dell'intero formato. Oltre ai panorami archiviati come immagini separate, un panorama può anche nascondersi all'interno della nuvola di punti stessa. Uno scanner laser non emette impulsi in modo casuale — scandisce una griglia ordinata di angoli, riga per riga, colonna per colonna, come un vecchio televisore che compone un'immagine sullo schermo. E57 può preservare quest'ordine: ogni punto riceve un rowIndex e un columnIndex che indicano da quale cella della griglia proviene. Una scansione salvata in questo modo si chiama strutturata.
Il vantaggio: se i punti sono disposti su una griglia, la nuvola di punti è già un'immagine. Leggila riga per riga e ogni punto finisce su un pixel — il panorama riappare senza bisogno di alcuna sofisticata riproiezione. Il file registra persino la dimensione della griglia nei suoi indexBounds (columnMaximum, rowMaximum), così il software conosce in anticipo la risoluzione — il nostro sintetizzatore ricava la larghezza dell'immagine risultante direttamente da columnMaximum + 1.
Ma una griglia deve essere un rettangolo perfetto, e il mondo reale non lo è. Che dire delle direzioni in cui il raggio è stato emesso verso il cielo aperto e non è tornato nulla? La risposta è pragmatica: riempire quelle celle con punti fittizi — molto spesso con una distanza esattamente pari a 0, cioè "raggio emesso, nessun oggetto colpito". Questi punti mantengono integro il rettangolo, ma non rappresentano geometria reale, quindi chi legge il file deve avere cura di escluderli. Il nostro software contrassegna ogni punto a distanza zero, lo colloca a una distanza fittizia molto elevata affinché i calcoli sulla griglia continuino a funzionare e non tratta mai quei punti fantasma nel cielo come superfici reali quando costruisce la mappa di profondità o esporta la nuvola di punti.
Ritrasformare una scansione in una foto in cui puoi immergerti
Non tutte le scansioni arrivano su una griglia già pronta — alcune sono solo un insieme sparso e non strutturato di punti. La buona notizia: il panorama è ancora recuperabile, ed è qui che il formato incontra il nostro lavoro. Poiché una scansione è in realtà "una sfera completa di punti misurati come angoli attorno a un unico punto", puoi srotolarla in un panorama piatto.
Proietta ogni punto in base al suo angolo — da sinistra a destra lungo la larghezza dell'immagine e dall'alto verso il basso lungo l'altezza — su un pixel del panorama allungato nel classico formato equirettangolare 2:1. La mappa di profondità è l'ingrediente magico: con una distanza associata a ogni pixel, un panorama apparentemente piatto diventa misurabile e percorribile — fai clic su due punti di una parete e il software può calcolare la distanza reale, perché conserva i dati 3D sottostanti.
Allora, perché E57 è importante?
Perché è il punto d'incontro neutrale. Un tecnico del rilievo esegue la scansione di un ponte con hardware di una marca, un ingegnere apre il file con un software diverso e un architetto lo archivia per i vent'anni successivi — ed E57 è il formato su cui tutti e tre possono contare, senza dipendere da un singolo fornitore. Conserva insieme, in un unico file, colore, intensità, geometria, panorami e le fondamentali posizioni del sensore, secondo uno standard aperto che chiunque può implementare.
Un'ultima curiosità: il momento dell'acquisizione memorizzato in un file E57 è espresso in tempo GPS, ovvero in secondi trascorsi dal 6 gennaio 1980, quando è iniziato il conteggio del tempo GPS, e non dalla consueta epoca informatica del 1970. Se lo interpreti male, una scansione eseguita oggi sembra risalire al 2013.
Vuoi approfondire?
- libE57.org — la libreria open source di riferimento e la risorsa principale dedicata al formato
- ASTM E2807 — lo standard ufficiale
- libE57Format · Image2D — le definizioni esatte delle rappresentazioni sferica, stenopeica e di riferimento visivo
- Paul Bourke’s E57 notes — una breve descrizione tecnica dell'intestazione e della struttura