E57, spiegato: il "PDF delle nuvole di punti"
Immagina di fotografare una stanza — ma invece di un'immagine piatta catturi la posizione esatta di un milione di minuscoli punti che coprono ogni parete, sedia e tazza di caffè. Fai ruotare un laser abbastanza velocemente e misura quanto è lontano tutto, ed ecco cosa ottieni: una nuvola di punti, una "fotografia" 3D fatta di punti misurati. Questo è un tour semplice e senza tecnicismi di ciò che vive davvero dentro un file E57 — e di un trucco intelligente che il nostro software fa con esso.
Perché serve un formato speciale?
Una foto normale è solo una griglia di pixel colorati — semplice. Una scansione 3D è più complessa. Per ciascuno dei suoi milioni di punti vuoi salvare dove si trova nello spazio (tre numeri: X, Y, Z), di che colore è, con quale intensità il laser è rimbalzato (la sua intensità — pensa a una "foto laser" in bianco e nero) e spesso le foto panoramiche scattate dallo scanner nello stesso momento.
Ora immagina che una persona scansioni con un Faro, un collega usi un Leica e il cliente apra il risultato in un software Autodesk. Tre macchine, tre programmi — e tutti devono poter leggere lo stesso file, anni dopo, senza supplicare un fornitore per un decodificatore segreto. Questo è il problema che E57 risolve. È uno standard aperto e neutrale rispetto ai fornitori (pubblicato come ASTM E2807 e basato sulla libreria open source libE57). Lo chiamano il "PDF delle nuvole di punti": un file portabile che tutti sanno leggere.
L'idea chiave: una mappa di testo con muscoli binari
In sostanza, un file E57 è un ibrido di due cose molto diverse unite insieme: un piccolo blocco di XML — testo semplice, leggibile dall'uomo, che funge da indice — e grandi blocchi di dati binari che contengono i milioni di numeri grezzi, archiviati in modo compatto per velocità.
Perché mettere la mappa alla fine? Perché mentre uno scanner sta scrivendo il file non sa ancora quanto sarà grande tutto, quindi trasmette prima i dati grezzi e scrive un riepilogo ordinato quando ha finito. Il vantaggio è enorme: per estrarre una scansione da un file da 20 gigabyte, il software legge la piccola intestazione, salta alla mappa XML, trova la riga che dice "la scansione #3 si trova al byte 4.812.000.000" e va dritto lì.
Una rete di sicurezza discreta: l'intero file è suddiviso in "pagine" da 1024 byte e ogni pagina riserva i suoi ultimi 4 byte a un checksum — un'impronta che permette al software di accorgersi se il file è stato danneggiato.
Tutto pende da una sola 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 davvero in X, Y, Z. Sta fermo in un punto e ruota, e per ogni punto conosce tre cose: portata (quanto ha viaggiato il raggio), azimut (quanto gira attorno, da sinistra a destra) ed elevazione (quanto sale o scende). Queste sono coordinate sferiche — la lingua madre dello scanner. La maggior parte dei software, però, preferisce le coordinate cartesiane X, Y, Z. E57 memorizza volentieri entrambe, e convertirle è solo un po' di trigonometria veloce.
Tre tipi di foto incorporata
Le foto in images2D non sono link a file in qualche cartella — il vero JPEG o PNG è nascosto direttamente dentro l'E57. E c'è più di un tipo di foto incorporata. E57 avvolge ciascuna in una "rappresentazione" che dice al software quanto può fidarsi dell'immagine dal punto di vista geometrico. La differenza si riduce a una sola domanda: quanto è descritta completamente la fotocamera?
sphericalRepresentation— un panorama completo a 360° × 180°, la familiare immagine allungata equirettangolare 2:1. Poiché la proiezione è nota, ogni pixel corrisponde a una direzione esatta, quindi si allinea perfettamente con la nuvola. Questa è la strada principale nella nostra pipeline: lo leggiamo, sistemiamo la tela in un 2:1 pulito e lo passiamo al visualizzatore di panorami.pinholeRepresentation— una foto con obiettivo normale, descritta dal classico modello di camera stenopeica (lunghezza focale, dimensione del sensore, centro ottico). Questo basta al software per conoscere anche la direzione di ogni pixel, solo con un campo visivo più stretto. In pratica è soprattutto così che funziona Leica: scrive un cubemap già pronto — le sei facce piatte del cubo rivolte verso l'esterno — direttamente nell'E57, e il nostro percorso delle facce del cubo le unisce esattamente in un panorama completo. È uno dei casi più semplici da trasformare di nuovo in una pulita immagine a 360°.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 le conserva come commenti allegati invece di collocarle in 3D.
Ecco il punto. sphericalRepresentation è la scelta più diffusa, ma è sorprendentemente facile sbagliarla in modo sottile — ed è proprio per questo che lo stesso scan può apparire diverso da un programma all'altro.
- Le zone cieche vengono ritagliate. Ogni scanner ha un punto che non può vedere — in genere proprio verso il basso, dove si trova il suo treppiede. Alcuni esportatori si limitano a ritagliare lì il panorama, lasciando un vuoto o un'altezza non standard.
- Pixel rettangolari. Un panorama pulito ha pixel quadrati (
pixelWidth=pixelHeight); alcuni file non li hanno, quindi l'immagine appare deformata finché non viene ridimensionata. - La direzione sbagliata è “forward”. 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 “forward” — alcuni esportatori la orientano a nord, altri a est. Un piccolo errore qui ruota l'intera vista.
- Gli strumenti di modifica possono perdere dati. Il round-trip di un E57 tramite CloudCompare, per esempio, può far perdere la posizione di acquisizione delle immagini
pinholeRepresentation— le foto restano, ma non sanno più dove sono state scattate.
In sintesi: sul campo, software diversi mostrano spesso lo stesso E57 in modo diverso. Il nostro importatore cerca di attenuare le stranezze più comuni — rendere quadrati i pixel rettangolari, correggere l'orientamento del panorama e standardizzare la tela 2:1 — così un tour risulta corretto indipendentemente dallo strumento che ha scritto il file.
Quando il panorama è incorporato nella nuvola 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 spara a caso — percorre una griglia ordinata di angoli, riga per riga, colonna per colonna, come un vecchio televisore che disegna uno 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 è già un'immagine. Leggila riga per riga e ogni punto finisce su un pixel — il panorama torna senza alcuna reproiezione ingegnosa. Il file registra persino la dimensione della griglia nei suoi indexBounds (columnMaximum, rowMaximum), così il software conosce in anticipo la risoluzione — il nostro sintetizzatore prende la larghezza di output 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 sparato 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 inviato, nessun colpo". Mantengono integro il rettangolo, ma non sono geometria reale, quindi un lettore attento deve metterli da parte. Il nostro segnala ogni punto a distanza zero, lo parcheggia a una distanza fittizia molto lontana così che la matematica della griglia continui a funzionare, e non tratta mai quei punti fantasma del cielo come superfici reali quando costruisce la mappa di profondità o esporta la nuvola.
Trasformare una scansione di nuovo in una foto in cui puoi entrare
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. Perché una scansione è in realtà "una sfera completa di punti misurati come angoli attorno a un unico punto", quindi puoi srotolarla in un panorama piatto.
Annota l'angolo di ogni punto, lascia che sinistra-destra scorra sulla larghezza dell'immagine e su-giù sulla sua altezza, e ogni punto finisce su un pixel — il familiare panorama equirettangolare 2:1 allungato. La mappa di profondità è l'ingrediente magico: con una distanza dietro ogni pixel, un panorama che sembra piatto diventa misurabile e percorribile — fai clic su due punti di una parete e il software conosce la distanza reale, perché non ha mai dimenticato i dati 3D sottostanti.
Allora, perché E57 è importante?
Perché è il punto d'incontro neutrale. Un rilevatore scansiona un ponte con un marchio di hardware, un ingegnere lo apre in un software diverso e un architetto lo archivia per i prossimi vent'anni — ed E57 è l'unico file su cui tutti e tre possono contare, senza che un fornitore tenga le chiavi. Tiene insieme colore, intensità, geometria, panorami e le importantissime posizioni del sensore in un unico posto, come standard aperto che chiunque può implementare.
Un ultimo fatto curioso: l'ora di acquisizione dentro un E57 è conteggiata in tempo GPS — secondi dal 6 gennaio 1980, il momento in cui gli orologi dei satelliti GPS si sono accesi — e non dalla solita epoca informatica del 1970. Sbagliare questo dettaglio fa leggere una scansione di oggi come se fosse avvenuta nel 2013.
Vuoi approfondire?
- libE57.org — la libreria open source di riferimento e la base del formato.
- ASTM E2807 — lo standard ufficiale.
- libE57Format · Image2D — definizioni esatte delle rappresentazioni sferica, pinhole e di riferimento visivo.
- Paul Bourke’s E57 notes — una sintesi tecnica concisa dell'intestazione e della struttura.