Hoofdstuk 8 — Exportformaten


Wat op de afbeelding te zien is: De groottevermelding onder elke formaatkaart wordt live berekend uit het huidige aantal Gaussians en de format-overhead — niet hardcoded. Uit dezelfde scene ontstaan zo 2,2 MB PLY, 142 KB cPLY, 89 KB SOG, 216 KB SPZ, 2,1 MB glTF en 279 KB .splat; Web ligt met 378 KB daarboven, omdat daar de viewer mee in het bestand zit. Video en Wiggle tonen „Zero KB", omdat de grootte pas na het encoderen vaststaat. De geselecteerde tegel is blauw omrand, en de knop eronder neemt de naam ervan over — hier „Export PLY (3DGS Standard)". Onder de kop staat de regel „Leveling the floor turns the view at once; the chosen orientation and format apply when saving".
Een voltooide training levert een Gaussian-cloud op — een verzameling van een paar honderdduizend tot miljoenen 3D-Gaussverdelingen, die samen de scene reconstrueren. Dit hoofdstuk beschrijft tien manieren om die cloud naar de schijf weg te schrijven. Zes daarvan zijn pure 3D-data-formaten (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), één bundelt de cloud samen met een kant-en-klare HTML-viewer (Web Viewer), één rendert een MP4-bestand uit een orbit-camerabeweging (Orbit Video), en twee exporteren geen Gaussian-inhoud maar alleen het SfM-resultaat (camera-posities en grove puntenwolk) voor hergebruik in andere trainings-pipelines (transforms.json + COLMAP-workspace).
Acht van deze manieren staan in de exportsectie als tegel klaar — transforms.json en de COLMAP-workspace bevinden zich alleen in het menu. Daarnaast bevat het raster een negende tegel Wiggle, en onder de exportknop staat Upload to SuperSplat…, die de scene in plaats van naar een bestand direct naar de SuperSplat-editor op het web stuurt.
Welk formaat wanneer het juiste is, hangt van het doel af. Voor de archivering van de volledige data zonder kwaliteitsverlies neem je PLY. Voor webviewers op je eigen site volstaat meestal .splat of de ingebouwde web-viewer. Als het bestand minimaal moet zijn, loont het om SPZ of SOG te nemen. Voor het hergebruik van het SfM-resultaat in Nerfstudio, Postshot of Brush zijn transforms.json en de COLMAP-workspace de juiste weg.
Alle exportfuncties bevinden zich in het menu „Export" en in de Simple-mode op de laatste wizard-stap. De meeste formaten zijn volledig sandbox-conform en werken in de App Store-versie. Alleen SOG vereist een externe binary (cwebp), die in de App Store-build niet noodzakelijk aanwezig is — details zie E4.
E1 — PLY (.ply)
WAAR
Menubalk → Export → 3D Formats → Export PLY… (⌘E). Simple-mode: wizardstap Export → formaatkaart „PLY". Grootte: typisch 100 % (referentiewaarde). Compatibel met: SuperSplat, PolyCam, alle 3DGS-viewers.
TECHNISCH
PLY is het canonieke opslagformaat voor 3D Gaussian Splatting. RadianceKit schrijft een binair little-endian-bestand met de gestandaardiseerde 3DGS-property-layout: per Gaussian een driecomponentige positie, drie steeds op nul gezette normalen, drie DC-SH-coëfficiënten (f_dc_0..2) voor de basis-RGB-kleur, vervolgens tot 45 verdere SH-coëfficiënten (f_rest_0..44) in de door het Kerbl-2023-paper gedefinieerde getransponeerde channel-major-volgorde (eerst alle R-kanaal-coëfficiënten, dan alle G, dan alle B), gevolgd door logit-opaciteit (rauwe pre-sigmoid-waarden), drie log-space-schalen en een wxyz-quaternionrotatie. De maximaal geëxporteerde SH-graad wordt op het minimum van gebruikerswens en daadwerkelijk geleerde graad geclampt; standaard is 3 (45 rest-coëfficiënten). Voor het schrijven wordt de payload-grootte in 64-bit-integer berekend, om overflow bij extreem grote clouds op te vangen. Het bestand wordt atomair geschreven, wat bij grote clouds tijdelijk de dubbele schijfruimte in beslag neemt.
E2 — Compressed PLY (.ply)
WAAR
Menubalk → Export → 3D Formats → Export Compressed PLY…. Simple-mode: formaatkaart „Compressed PLY". Grootte: ca. 10–20 % ten opzichte van PLY (5- tot 10-voudige compressie). Compatibel met: SuperSplat, PlayCanvas-engine, webgebaseerde viewers.
TECHNISCH
De PlayCanvas-variant van het PLY-formaat met chunked kwantisatie. De Gaussians worden in groepen van 256 gebundeld. Per chunk worden min/max-bounds voor positie, schaal en kleur apart in de header opgeslagen; de afzonderlijke Gaussians refereren aan hun waarden ten opzichte van deze bounds en worden naar elk 32 bit gecomprimeerd: positie en schaal met 11-10-11-bit-packing, rotatie als 2-10-10-10-bit „smallest-three"-quaternion, kleur als 8-8-8-8-RGBA. Hogere SH-coëfficiënten worden met slechts 8 bit per component gekwantiseerd (drie bytes per coëfficiënt en Gaussian). Het formaat zelf is nog steeds ASCII-header-PLY en daarmee in principe valideerbaar met PLY-tools, maar de vertex-properties zijn als uint-velden gedeclareerd. SH-graad is standaard 0 (geen rest-coëfficiënten), om de compressie te maximaliseren — hogere SH-graden kunnen expliciet worden gekozen.
E3 — SPZ (.spz)
WAAR
Menubalk → Export → 3D Formats → Export SPZ…. Simple-mode: formaatkaart „SPZ". Grootte: ca. 10 % ten opzichte van PLY (90 % kleiner). Compatibel met: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TECHNISCH
Niantics SPZ-v2-formaat. Posities worden als 24-bit-fixed-point gepakt (dat geeft ca. 0,25 mm resolutie), schalen als 8-bit-kwantisatie in de log-ruimte, rotaties als 8-bit-smallest-three (in v2 worden alleen xyz opgeslagen, w wordt in de decoder uit de quaternion-norm afgeleid), opaciteiten als gesigmoïdeerde 8-bit-waarden. DC-SH wordt met een SPZ-specifieke pack-formule (dc_raw * 0.15 * 255 + 0.5 * 255) opgeslagen, hogere SH-banden met 5 bit (band 1) resp. 4 bit (band 2-3) per coëfficiënt. De gehele gepakte binaire blob wordt vervolgens met standaard-gzip (RFC 1952) gecomprimeerd, wat een gzipped-containerformaat met magic bytes 1f 8b oplevert. RadianceKit roept hiervoor het systeem-gzip aan, omdat Apples ingebouwde zlib-API proprietaire Apple-framing genereert, die niet compatibel zou zijn met de SPZ-readers in Spatial Fields of MetalSplatter. Het systeem-gzip blijft ook binnen de macOS-sandbox spawnbaar.
E4 — SOG (.sog)
WAAR
Menubalk → Export → 3D Formats → Export SOG…. Simple-mode: formaatkaart „SOG". Grootte: ca. 5–6 % ten opzichte van PLY (15- tot 20-voudige compressie — de kleinste optie). Compatibel met: PlayCanvas-engine, SuperSplat-editor.
TECHNISCH
„Spatially Ordered Gaussians" — een PlayCanvas-formaat dat de cloud GPU-ready in meerdere lossless-WebP-afbeeldingen opslaat. Eerst worden alle Gaussians via 3D-Morton-code (30-bit Z-order, elk 10 bit per as) ruimtelijk gesorteerd, wat de afbeeldingen latere cache-locality in de renderer bezorgt. Dan worden posities met symmetrische log-transformatie (voor beter dynamisch bereik) naar 16-bit-waarden gekwantiseerd en in twee RGBA-afbeeldingen gesplitst (means_l.webp voor de onderste 8 bit, means_u.webp voor de bovenste). Rotaties worden als smallest-three met 3×8-bit plus 2-bit-mode in één RGBA-afbeelding gecodeerd (mode komt in alpha terecht als 252 + largest). Schalen en DC-SH worden met elk een codebook van 256 items gekwantiseerd (percentiel-gebaseerd over alle waarden verdeeld), de indices komen in scales.webp en sh0.webp terecht. De vijf afbeeldingen plus een meta.json met codebooks en bounds worden in een ZIP-bestand gepakt (custom encoder, omdat de sandbox het systeem-zip blokkeert) en met de extensie .sog opgeslagen.
Let op sandbox: SOG is de enige formaatoptie die een externe binary vereist. De WebP-encoder-fase roept cwebp uit /usr/local/bin/cwebp of /opt/homebrew/bin/cwebp aan. Als geen cwebp-binary wordt gevonden, valt de code terug op ruwe PNG-encoding — maar: PNG-fallback werkt niet in SuperSplat. In de App Store-versie evalueer je de beschikbaarheid aan de hand van de build-variant; in de developer-variant moet cwebp via Homebrew geïnstalleerd zijn (brew install webp).
E5 — glTF (.glb)
WAAR
Menubalk → Export → 3D Formats → Export glTF…. Simple-mode: formaatkaart „glTF". Grootte: vergelijkbaar met PLY. Compatibel met: glTF-viewers met KHR_gaussian_splatting-extensie (Khronos-draftstandaard).
TECHNISCH
Schrijft een zelfstandig .glb-binair bestand (geen aparte bin-file-bijlage) volgens de KHR_gaussian_splatting-extensiespecificatie. Posities worden als reguliere glTF-POSITION-vertex-data (float3) opgeslagen, alle andere attributen (rotatie als float4, schaal als float3, opaciteit als float, SH-coëfficiënten als float3 × shCoeffCount) bevinden zich in aanvullende vertex-attributen en worden via de extensie gerefereerd. Belangrijk: glTF gebruikt een rechtshandig Y-up-coördinatensysteem, COLMAP/3DGS werkt met Y-down/Z-forward. De exporter past daarom een rotatie van 180 graden om de X-as toe — posities worden herschreven met (x, -y, -z), quaternionen worden aangepast naar (w, x, -y, -z). Dat levert een geometrisch correcte, handige (niet gespiegelde) weergave in glTF-viewers op. JSON- en binaire chunks worden op 4-byte-alignment gepadd, zoals door de GLB-standaard vereist.
E6 — Splat (.splat)
WAAR
Menubalk → Export → 3D Formats → Export .splat…. Simple-mode: formaatkaart „.splat". Grootte: exact 32 bytes per Gaussian. Compatibel met: gsplat.js, webgebaseerde viewers (antimatter15-referentie), de meeste browser-3DGS-demo's.
TECHNISCH
Het antimatter15-.splat-formaat — 32 bytes per Gaussian, geen header, geen indirectie. Layout per item: 3 × float32 positie (wereldcoördinaten), 3 × float32 schaal (exp-getransformeerd uit de log-ruimte van de interne buffer), 4 × uint8 RGBA-kleur (DC-SH-coëfficiënt geschaald met SH_C0 = 0.282... en geclampt naar [0,255]), 4 × uint8 quaternion (w,x,y,z, genormaliseerd en als 128 + 128*q naar het byte-bereik gecodeerd). Alleen DC-SH wordt opgeslagen — hogere SH-banden worden weggegooid. Dat maakt het formaat extreem compact, maar kost wel de blikafhankelijke kleurveranderingen die bij spiegelingen of speculaire highlights optreden. De schrijfvolgorde is exact de indexvolgorde van de cloud (geen ruimtelijke sortering), webviewers zoals gsplat.js renderen daarvan uitgaand.

flowers-01.html direct vanuit de Finder met een dubbelklik in de standaardbrowser geopend — het ingebedde WebGL2-programma rendert de Gaussian-cloud onmiddellijk, zonder netwerk of server. De zwarte markers rond het bouquet zijn de trainingscamera's, optioneel in te schakelen. Muis-drag roteert, scroll zoomt.E7 — Web Viewer (.html)
WAAR
Menubalk → Export → Media → Export Web Viewer…. Simple-mode: formaatkaart „Web Viewer". Grootte: splat-data base64-gecodeerd (≈ 4/3 overhead) + ca. 5 KB HTML/JS-shell. Compatibel met: elke moderne browser met WebGL2 (alle desktops, iOS 15+, Android 5+).
TECHNISCH
Bundelt de Gaussian-cloud samen met een volledig inline geschreven WebGL2-renderer in één enkel .html-bestand. Er zijn geen CDN-afhankelijkheden, geen WASM, geen tweede bestand. De cloud wordt intern eerst als .splat-binary gecodeerd (dezelfde 32-byte-logica als E6), dan base64-ingebed, dan met atob in de browser gedecodeerd. De ingebouwde renderer doet eigen WebGL2-sortering, muis-orbit-besturing en CPU-sortering per frame; de gehele JS-code (shaders, wiskunde, loop) is in de output-HTML te zien. De as-conventie op de grens tussen opslag en renderer is exact dezelfde als in E5: positie (x, -y, -z), quaternion (w, x, -y, -z). Optioneel kan een branding-overlay worden weergegeven (free-tier-schakelaar). Omdat alles inline is, werkt het bestand ook direct vanuit het file://-protocol — geen lokale webserver nodig om te testen.

E8 — Orbit Video (.mp4/.mov)
WAAR
Menubalk → Viewport → Record Turntable Video OF Menubalk → Export → Media → Export Orbit Video…. Simple-mode: formaatkaart „Orbit Video" met duur-slider 3–30 s. Grootte: afhankelijk van duur, resolutie, bitrate. Compatibel met: alle platformen (H.264 en HEVC zijn Apple-standaard).
TECHNISCH
Rendert de Gaussian-cloud langs een parametrische orbit-camerabeweging en codeert elk frame via AVAssetWriter naar een MP4- of MOV-bestand. De orbit-configuratie regelt rotatiesnelheid (omwentelingen), afstand, elevatie, FOV, duur en ease-in/out-factor. De orbit-video-export loopt via RadianceKits EIGEN render-fase met volledige SH-evaluatie — pixelgelijk aan de in-app-viewport (WYSIWYG). Per frame wordt de wereld-aanpassingsmatrix (door de renderer berekend om de interne coördinaten naar de Y-up-orbit-wereld te roteren) met de camera vermenigvuldigd, vervolgens een camera-conversie-spiegeling (orbit-Y-up → COLMAP-Y-down) toegepast. Het offscreen-rendertarget wordt via IOSurface naar een CVPixelBuffer voor de encoder getrokken. De encoder ondersteunt H.264 en HEVC, configureerbare bitrate en resolutie van 480p tot 8K. Voor het eerste frame wacht de renderer 200 ms, zodat de initiële splat-sortering is afgerond. Deze export is GPU-bound — bij 8K en miljoenen Gaussians ligt de rendertijd per frame op meerdere seconden, dus totale rendertijden van 10–30 minuten voor 6 s video mogelijk.
E9 — SfM Transforms (transforms.json)
WAAR
Menubalk → Export → Photogrammetry → Export SfM (transforms.json)…. Grootte: typisch 1–10 KB (alleen posities + intrinsics, geen afbeeldingen, geen Gaussians). Compatibel met: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, alle moderne feed-forward-3DGS-trainers.
TECHNISCH
Schrijft het nerfstudio-transforms.json-formaat met een lijst van camera-posities plus gedeelde intrinsics. Per camera wordt de view-matrix (RadianceKit-intern: world-to-camera in COLMAP-conventie) geïnverteerd, vervolgens worden de cameralokale Y- en Z-basisvectoren gespiegeld, om naar de nerfstudio-conventie (OpenGL-stijl, camera kijkt langs -Z, +Y is boven) te converteren. De finale 4×4-matrix komt als row-major geneste array van doubles in het transform_matrix-veld van elk frame terecht. Intrinsics worden op het top-level opgeslagen (brandpuntsafstand x/y, hoofdpunt x/y, breedte/hoogte van de afbeelding, camera_model = "OPENCV", plus de distortion-coëfficiënten k1, k2, p1, p2) — behalve wanneer de exporter meerdere verschillende intrinsics-sets herkent, dan worden ze per frame geschreven. Afbeeldingspaden worden als images/<filename> relatief ten opzichte van het JSON-bestand geschreven; de gebruiker moet een sibling-images/-map met de trainingsfoto's aanmaken.
E10 — COLMAP Workspace (sparse/0/)
WAAR
Menubalk → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Grootte: drie binaire bestanden samen typisch 4–8 MB — points3D.bin domineert (één regel per 3D-punt van de sparse-cloud), images.bin en cameras.bin liggen elk ruim onder 100 KB. Compatibel met: COLMAP zelf, Nerfstudio, Postshot, Meshroom, alle tools die een COLMAP-sparse/-map verwachten.
TECHNISCH
Schrijft de standaard-COLMAP-sparse/0/-layout met drie binaire bestanden: cameras.bin, images.bin, points3D.bin. Formaatreferentie is de officiële COLMAP-documentatie. cameras.bin bevat de gededupliceerde intrinsics-lijst (camera's met identieke intrinsics + beeldgrootte worden tot één enkel item samengevoegd); het gebruikte camera-model is OPENCV (model 4), met fx/fy/cx/cy plus de vier distortion-coëfficiënten k1/k2/p1/p2. images.bin vermeldt per afbeelding de positie als wxyz-quaternion plus translatie, gevolgd door het camera-ID en de bestandsnaam; er worden geen 2D-3D-correspondenties opgeslagen. points3D.bin bevat de SfM-puntenwolk met positie, kleur (0-255 RGB) en standaardwaarden voor reprojectie en track-length. Alles wordt in little-endian geschreven. Her-import in RadianceKit werkt via het File-menu → „Import COLMAP/Metashape Workspace…" (zie Q3 in het SfM-backend-hoofdstuk).
Welk formaat wanneer?
| Doel | Formaat |
|---|---|
| Webviewer op eigen pagina | E7 Web Viewer (.html) |
Webviewer met gsplat.js | E6 Splat (.splat) |
| Hergebruik in pipeline voor Postshot / Nerfstudio | E9 transforms.json + E10 COLMAP Workspace |
| SuperSplat-bewerking | E1 PLY of E2 Compressed PLY |
| Niantic Scaniverse / Spatial Fields | E3 SPZ |
| Maximale compressie | E4 SOG (cwebp vereist) |
| Marketing-/social-video | E8 Orbit Video |
| Scène online verder bewerken | Knop „Upload to SuperSplat…" onder het formaatraster |
Snelle vergelijking
| Formaat | Extensie | Sandbox | Grootte (1M Gauss) | Beste toepassing |
|---|---|---|---|---|
| E1 PLY | .ply | ja | ~250 MB | Archief, hoogste compatibiliteit |
| E2 Compressed PLY | .ply | ja | ~40 MB | Web + SuperSplat |
| E3 SPZ | .spz | ja (gzip-spawn) | ~40 MB | Niantic + Mobiel |
| E4 SOG | .sog | voorwaardelijk (cwebp) | ~20 MB | Maximale compressie |
| E5 glTF | .glb | ja | ~250 MB | Khronos-pipeline |
| E6 Splat | .splat | ja | ~32 MB | gsplat.js webviewer |
| E7 Web Viewer | .html | ja | ~45 MB | Standalone browserbestand |
| E8 Orbit Video | .mp4/.mov | ja | variabel | Social/marketing |
| E9 SfM Transforms | .json | ja | ~5 KB | Pose-overdracht |
| E10 COLMAP Workspace | Map | ja | ~4–8 MB | Pose-overdracht binair |
De kolom Grootte bevat grove richtwaarden voor 1 miljoen Gaussians met SH-graad 3. Werkelijke waarden variëren afhankelijk van de comprimeerbaarheid van de scène; SH-graad 0 reduceert PLY/glTF met een factor 4.