Capitolo 8 — Formati di esportazione


Cosa si vede nell'immagine: L'indicazione delle dimensioni sotto ogni scheda formato viene calcolata in tempo reale a partire dal numero attuale di Gaussiane e dall' overhead del formato — non è codificata staticamente. Dalla stessa scena nascono così 2,2 MB di PLY, 142 KB di cPLY, 89 KB di SOG, 216 KB di SPZ, 2,1 MB di glTF e 279 KB di .splat; Web è a 378 KB, un valore più alto perché lì il viewer è incluso nel file. Video e Wiggle mostrano „Zero KB", perché la dimensione si conosce solo dopo la codifica. La scheda selezionata ha il bordo blu, e il pulsante sottostante ne assume il nome — qui „Export PLY (3DGS Standard)". Sotto il titolo compare la riga „Leveling the floor turns the view at once; the chosen orientation and format apply when saving".
Un training completato produce una Gaussian Cloud — una raccolta di poche centinaia di migliaia fino a milioni di distribuzioni gaussiane 3D che insieme ricostruiscono la scena. Questo capitolo descrive dieci modi per scrivere questa cloud su disco. Sei di essi sono puri formati di dati 3D (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), uno raggruppa la cloud insieme a un viewer HTML già pronto (Web Viewer), uno esegue il rendering di un file MP4 da una ripresa camera in orbita (Orbit Video), e due non esportano contenuto gaussiano ma solo il risultato SfM (pose camera e nuvola di punti grezza) per il riutilizzo in altre pipeline di training (transforms.json + workspace COLMAP).
Otto di questi modi sono disponibili come scheda nella sezione di esportazione — transforms.json e il workspace COLMAP si trovano solo nel menu. Inoltre la griglia contiene una nona scheda, Wiggle, e sotto il pulsante di esportazione c'è Upload to SuperSplat…, che invia la scena, anziché in un file, direttamente all'editor SuperSplat sul web.
Quale formato sia giusto dipende dall'obiettivo. Per l'archiviazione dei dati completi senza perdita di qualità si usa PLY. Per viewer web sul proprio sito bastano di solito .splat o il Web Viewer integrato. Se il file deve essere minimo, conviene SPZ o SOG. Per riutilizzare il risultato SfM in Nerfstudio, Postshot o Brush, transforms.json e il workspace COLMAP sono la via giusta.
Tutte le funzioni di esportazione si trovano nel menu „Export" e nella modalità Simple nell'ultimo passaggio della procedura guidata. La maggior parte dei formati è completamente conforme alla sandbox e funziona nella versione App Store. Solo SOG richiede un binario esterno (cwebp), che nella build App Store non è necessariamente presente — dettagli in E4.
E1 — PLY (.ply)
DOVE
Barra dei menu → Export → 3D Formats → Export PLY… (⌘E). Modalità Simple: passaggio guidato Export → scheda formato „PLY". Dimensione: tipicamente 100 % (valore di riferimento). Compatibile con: SuperSplat, PolyCam, tutti i viewer 3DGS.
TECNICO
PLY è il formato di archiviazione canonico per 3D Gaussian Splatting. RadianceKit scrive un file binario little-endian con il layout di proprietà 3DGS standardizzato: per ogni Gaussiana una posizione a tre componenti, tre normali sempre impostate a zero, tre coefficienti SH DC (f_dc_0..2) per il colore RGB di base, seguiti da fino a 45 ulteriori coefficienti SH (f_rest_0..44) nella disposizione channel-major trasposta definita dal paper Kerbl 2023 (prima tutti i coefficienti del canale R, poi tutti quelli G, poi tutti quelli B), seguiti da opacità in logit (valori grezzi pre-sigmoid), tre scale in log-space e una rotazione quaternione wxyz. Il grado SH massimo esportato viene limitato al minimo tra il desiderio dell'utente e il grado effettivamente appreso; il default è 3 (45 coefficienti residui). Prima della scrittura la dimensione del payload viene calcolata in interi a 64 bit per intercettare eventuali overflow su cloud estremamente grandi. Il file viene scritto in modo atomico, il che con cloud grandi occupa temporaneamente il doppio dello spazio su disco.
E2 — Compressed PLY (.ply)
DOVE
Barra dei menu → Export → 3D Formats → Export Compressed PLY…. Modalità Simple: scheda formato „Compressed PLY". Dimensione: circa 10–20 % rispetto a PLY (compressione da 5 a 10 volte). Compatibile con: SuperSplat, motore PlayCanvas, viewer basati su web.
TECNICO
La variante PlayCanvas del formato PLY con quantizzazione a chunk. Le Gaussiane vengono raggruppate in chunk da 256. Per ogni chunk vengono salvati nell'header i limiti min/max separati per posizione, scala e colore; le singole Gaussiane fanno riferimento ai propri valori relativamente a questi limiti e vengono compresse a 32 bit ciascuna: posizione e scala con packing 11-10-11 bit, rotazione come quaternione „Smallest-Three" a 2-10-10-10 bit, colore come RGBA 8-8-8-8. I coefficienti SH più alti vengono quantizzati con soli 8 bit per componente (tre byte per coefficiente e Gaussiana). Il formato stesso rimane comunque un PLY con header ASCII e quindi fondamentalmente validabile con strumenti PLY, ma le proprietà dei vertici sono dichiarate come campi uint. Il grado SH è per default 0 (nessun coefficiente residuo), per massimizzare la compressione — gradi SH più alti possono essere scelti esplicitamente.
E3 — SPZ (.spz)
DOVE
Barra dei menu → Export → 3D Formats → Export SPZ…. Modalità Simple: scheda formato „SPZ". Dimensione: circa 10 % rispetto a PLY (90 % più piccolo). Compatibile con: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TECNICO
Il formato SPZ v2 di Niantic. Le posizioni vengono impacchettate come fixed-point a 24 bit (il che dà circa 0,25 mm di risoluzione), le scale come quantizzazione a 8 bit nello spazio logaritmico, le rotazioni come Smallest-Three a 8 bit (nella v2 vengono salvati solo xyz, w viene derivato nel decoder dalla norma del quaternione), le opacità come valori sigmoidizzati a 8 bit. Il DC-SH viene salvato con una formula di packing specifica di SPZ (dc_raw * 0.15 * 255 + 0.5 * 255), le bande SH più alte con 5 bit (banda 1) o 4 bit (banda 2-3) per coefficiente. L'intero blob binario impacchettato viene poi compresso con gzip standard (RFC 1952), il che produce un formato contenitore gzippato con byte magici 1f 8b. RadianceKit chiama a questo scopo il gzip di sistema, perché l'API zlib integrata di Apple genera un framing proprietario Apple, che non sarebbe compatibile con i reader SPZ in Spatial Fields o MetalSplatter. Il gzip di sistema rimane avviabile anche all'interno della sandbox macOS.
E4 — SOG (.sog)
DOVE
Barra dei menu → Export → 3D Formats → Export SOG…. Modalità Simple: scheda formato „SOG". Dimensione: circa 5–6 % rispetto a PLY (compressione da 15 a 20 volte — l'opzione più piccola). Compatibile con: motore PlayCanvas, editor SuperSplat.
TECNICO
„Spatially Ordered Gaussians" — un formato PlayCanvas che salva la cloud pronta per la GPU in diverse immagini WebP lossless. Prima tutte le Gaussiane vengono ordinate spazialmente tramite codice Morton 3D (Z-order a 30 bit, 10 bit per asse), il che garantisce alle immagini una successiva località di cache nel renderer. Poi le posizioni vengono quantizzate a valori a 16 bit con trasformazione logaritmica simmetrica (per un migliore range dinamico) e divise in due immagini RGBA (means_l.webp per gli 8 bit inferiori, means_u.webp per gli 8 bit superiori). Le rotazioni vengono codificate come Smallest-Three con 3×8 bit più 2 bit di modo in un'immagine RGBA (il modo finisce nell'alpha come 252 + largest). Scale e DC-SH vengono quantizzati con un codebook di 256 voci ciascuno (distribuito su base percentile su tutti i valori), gli indici finiscono in scales.webp e sh0.webp. Le cinque immagini più un meta.json con codebook e limiti vengono impacchettate in un file ZIP (encoder personalizzato, perché la sandbox blocca lo zip di sistema) e salvate con l'estensione .sog.
Attenzione sandbox: SOG è l'unica opzione di formato che richiede un binario esterno. La fase di codifica WebP chiama cwebp da /usr/local/bin/cwebp o /opt/homebrew/bin/cwebp. Se non viene trovato alcun binario cwebp, il codice ricade sulla codifica PNG grezza — ma attenzione: il fallback PNG non funziona in SuperSplat. Nella versione App Store valuta la disponibilità in base alla variante di build; nella variante Developer cwebp deve essere installato via Homebrew (brew install webp).
E5 — glTF (.glb)
DOVE
Barra dei menu → Export → 3D Formats → Export glTF…. Modalità Simple: scheda formato „glTF". Dimensione: paragonabile a PLY. Compatibile con: viewer glTF con estensione KHR_gaussian_splatting (standard bozza Khronos).
TECNICO
Scrive un file binario .glb autonomo (nessun file bin separato allegato) secondo la specifica dell'estensione KHR_gaussian_splatting. Le posizioni vengono salvate come normali dati vertice glTF POSITION (float3), tutti gli altri attributi (rotazione come float4, scala come float3, opacità come float, coefficienti SH come float3 × shCoeffCount) risiedono in attributi vertice aggiuntivi e vengono referenziati tramite l'estensione. Importante: glTF usa un sistema di coordinate destrorso Y-up, COLMAP/3DGS lavora Y-down/Z-forward. L'esportatore applica quindi una rotazione di 180 gradi attorno all'asse X — le posizioni vengono riscritte con (x, -y, -z), i quaternioni vengono adattati a (w, x, -y, -z). Il risultato è una rappresentazione geometricamente corretta, con orientamento giusto (non speculare) nei viewer glTF. I chunk JSON e binari vengono paddati ad allineamento a 4 byte, come richiesto dallo standard GLB.
E6 — Splat (.splat)
DOVE
Barra dei menu → Export → 3D Formats → Export .splat…. Modalità Simple: scheda formato „.splat". Dimensione: esattamente 32 byte per Gaussiana. Compatibile con: gsplat.js, viewer basati su web (riferimento antimatter15), la maggior parte delle demo 3DGS da browser.
TECNICO
Il formato .splat di antimatter15 — 32 byte per Gaussiana, nessun header, nessuna indirezione. Layout per voce: 3 × float32 posizione (coordinate mondo), 3 × float32 scala (trasformata con exp dallo spazio logaritmico del buffer interno), 4 × uint8 colore RGBA (coefficiente DC-SH scalato con SH_C0 = 0.282... e limitato a [0,255]), 4 × uint8 quaternione (w,x,y,z, normalizzato e codificato nell'intervallo byte come 128 + 128*q). Viene salvato solo il DC-SH — le bande SH più alte vengono scartate. Ciò rende il formato estremamente compatto, ma costa i cambiamenti di colore dipendenti dal punto di vista, che si presentano con riflessi o highlight speculari. L'ordine di scrittura è esattamente l'ordine degli indici della cloud (nessun ordinamento spaziale), i viewer web come gsplat.js fanno il rendering partendo da questo presupposto.

flowers-01.html aperto direttamente dal Finder con doppio clic nel browser predefinito — il programma WebGL2 incorporato renderizza subito la Gaussian Cloud, senza rete o server. I marker neri attorno al bouquet sono le camere di training, opzionalmente visualizzabili. Il trascinamento del mouse ruota, lo scroll zooma.E7 — Web Viewer (.html)
DOVE
Barra dei menu → Export → Media → Export Web Viewer…. Modalità Simple: scheda formato „Web Viewer". Dimensione: dati splat codificati in base64 (≈ overhead 4/3) + circa 5 KB di shell HTML/JS. Compatibile con: ogni browser moderno con WebGL2 (tutti i desktop, iOS 15+, Android 5+).
TECNICO
Raggruppa la Gaussian Cloud insieme a un renderer WebGL2 scritto completamente inline in un unico file .html. Non ci sono dipendenze CDN, nessun WASM, nessun secondo file. La cloud viene prima codificata internamente come binario .splat (stessa logica a 32 byte di E6), poi incorporata in base64, poi decodificata con atob nel browser. Il renderer integrato esegue una propria ordinazione WebGL2, un controllo mouse-orbit e ordinazione lato CPU per frame; l'intero codice JS (shader, matematica, loop) è visibile nell'HTML di output. La convenzione degli assi al confine tra memorizzazione e renderer è esattamente la stessa di E5: posizione (x, -y, -z), quaternione (w, x, -y, -z). Opzionalmente si può visualizzare un overlay di branding (interruttore per il livello free). Poiché tutto è inline, il file funziona anche direttamente dal protocollo file:// — non serve un webserver locale per testare.

E8 — Orbit Video (.mp4/.mov)
DOVE
Barra dei menu → Viewport → Record Turntable Video OPPURE Barra dei menu → Export → Media → Export Orbit Video…. Modalità Simple: scheda formato „Orbit Video" con cursore durata 3–30 s. Dimensione: dipende da durata, risoluzione, bitrate. Compatibile con: tutte le piattaforme (H.264 e HEVC sono lo standard Apple).
TECNICO
Renderizza la Gaussian Cloud lungo una ripresa camera in orbita parametrica e codifica ogni frame tramite AVAssetWriter in un file MP4 o MOV. La configurazione dell'orbita controlla velocità di rotazione (giri), distanza, elevazione, FOV, durata e fattore di ease-in/out. L'esportazione Orbit Video passa per la FASE di rendering PROPRIA di RadianceKit con valutazione SH completa — pixel-per-pixel identica al viewport in-app (WYSIWYG). Per ogni frame la matrice di adattamento del mondo (calcolata dal renderer per ruotare le coordinate interne nel mondo orbita Y-up) viene moltiplicata per la camera, poi viene applicata una speculazione di conversione della camera (Orbit Y-up → COLMAP Y-down). Il target di rendering offscreen viene trasferito tramite IOSurface in un CVPixelBuffer per l'encoder. L'encoder supporta H.264 e HEVC, bitrate e risoluzione configurabili da 480p a 8K. Prima del primo frame il renderer attende 200 ms, affinché l'ordinamento iniziale dello splat sia completato. Questa esportazione è vincolata dalla GPU — a 8K e con milioni di Gaussiane il tempo di rendering per frame è di diversi secondi, quindi sono possibili tempi totali di rendering di 10–30 minuti per 6 s di video.
E9 — SfM Transforms (transforms.json)
DOVE
Barra dei menu → Export → Photogrammetry → Export SfM (transforms.json)…. Dimensione: tipicamente 1–10 KB (solo pose + intrinseci, nessuna immagine, nessuna Gaussiana). Compatibile con: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, tutti i moderni trainer 3DGS feed-forward.
TECNICO
Scrive il formato transforms.json di nerfstudio con un elenco di pose camera più intrinseci condivisi. Per ogni camera viene invertita la matrice di vista (interna a RadianceKit: World-to-Camera in convenzione COLMAP), poi vengono riflessi i vettori base locali alla camera Y e Z, per convertire nella convenzione nerfstudio (stile OpenGL, la camera guarda lungo -Z, +Y è verso l'alto). La matrice 4×4 finale finisce come array annidato row-major di double nel campo transform_matrix di ogni frame. Gli intrinseci vengono salvati a livello superiore (lunghezza focale x/y, punto principale x/y, larghezza/altezza immagine, camera_model = "OPENCV", più i coefficienti di distorsione k1, k2, p1, p2) — tranne quando l'esportatore rileva più set di intrinseci diversi, nel qual caso vengono scritti per frame. I percorsi delle immagini vengono scritti come images/<filename> relativi al file JSON; l'utente deve creare una cartella images/ gemella con le foto di training.
E10 — COLMAP Workspace (sparse/0/)
DOVE
Barra dei menu → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Dimensione: tre file binari insieme tipicamente 4–8 MB — points3D.bin domina (una riga per punto 3D della sparse cloud), images.bin e cameras.bin sono entrambi ben sotto i 100 KB. Compatibile con: COLMAP stesso, Nerfstudio, Postshot, Meshroom, tutti gli strumenti che si aspettano una directory sparse/ di COLMAP.
TECNICO
Scrive il layout standard COLMAP sparse/0/ con tre file binari: cameras.bin, images.bin, points3D.bin. Il riferimento di formato è la documentazione ufficiale COLMAP. cameras.bin contiene l'elenco deduplicato degli intrinseci (camere con intrinseci identici + dimensione immagine identica vengono unite in un'unica voce); il modello camera utilizzato è OPENCV (modello 4), con fx/fy/cx/cy più i quattro coefficienti di distorsione k1/k2/p1/p2. images.bin elenca per ogni immagine la posa come quaternione wxyz più traslazione, seguiti dall'ID camera e dal nome file; non vengono salvate corrispondenze 2D-3D. points3D.bin contiene la nuvola di punti SfM con posizione, colore (RGB 0-255) e valori predefiniti per riproiezione e lunghezza track. Tutto viene scritto in little-endian. La re-importazione in RadianceKit funziona tramite il menu File → „Import COLMAP/Metashape Workspace…" (vedi Q3 nel capitolo sul backend SfM).
Quale formato quando?
| Obiettivo | Formato |
|---|---|
| Web viewer sul proprio sito | E7 Web Viewer (.html) |
Web viewer con gsplat.js | E6 Splat (.splat) |
| Riutilizzo della pipeline in Postshot / Nerfstudio | E9 transforms.json + E10 COLMAP Workspace |
| Modifica in SuperSplat | E1 PLY oppure E2 Compressed PLY |
| Niantic Scaniverse / Spatial Fields | E3 SPZ |
| Massima compressione | E4 SOG (richiede cwebp) |
| Video marketing/social | E8 Orbit Video |
| Continuare a modificare la scena online | Pulsante „Upload to SuperSplat…" sotto la griglia dei formati |
Confronto rapido
| Formato | Estensione | Sandbox | Dimensione (1M Gauss) | Uso ideale |
|---|---|---|---|---|
| E1 PLY | .ply | sì | ~250 MB | Archivio, massima compatibilità |
| E2 Compressed PLY | .ply | sì | ~40 MB | Web + SuperSplat |
| E3 SPZ | .spz | sì (gzip-Spawn) | ~40 MB | Niantic + Mobile |
| E4 SOG | .sog | condizionato (cwebp) | ~20 MB | Compressione massima |
| E5 glTF | .glb | sì | ~250 MB | Pipeline Khronos |
| E6 Splat | .splat | sì | ~32 MB | gsplat.js Web-Viewer |
| E7 Web Viewer | .html | sì | ~45 MB | File browser standalone |
| E8 Video orbitale | .mp4/.mov | sì | variabile | Social/Marketing |
| E9 SfM Transforms | .json | sì | ~5 KB | Trasferimento pose |
| E10 COLMAP Workspace | Cartella | sì | ~4–8 MB | Trasferimento pose binario |
La colonna delle dimensioni riporta valori indicativi approssimativi per 1 milione di Gaussians con grado SH 3. I valori reali variano in base alla comprimibilità della scena; il grado SH 0 riduce PLY/glTF di un fattore 4.