Hoofdstuk 8 — Exportformaten


Wat de afbeelding toont (2.991 Gaussians, SH degree 3, een synthetisch Blender-boeket als IP-clean testset): De groottelijke aanduidingen onder elke formaatkaart worden live uit de actuele Gaussian-count en formaat-overhead berekend — niet hard-gecodeerd. Uit 2.991 Gaussians (SH degree 3) ontstaan zo 742 KB PLY, 74 KB SPZ (factor ~10× kleiner door kwantisatie), 708 KB glTF (met KHR_gaussian_splatting-extension, daardoor bijna PLY-equivalent), 96 KB .splat (gecomprimeerd 24-byte-per-Gaussian-formaat). Orbit Video toont „~Zero KB", omdat de grootte pas na de MP4-encoding bekend is. Web Viewer (133 KB) bundelt een zelfstandig HTML-bestand met ingebedde WebGL-viewer en gecomprimeerde splat-data — groter dan puur .splat vanwege de viewer-overhead. Export-History rechts toont reeds voltooide PLY-export („training_20260527T211321Z.ply, 743 KB, 23:13") met formaat-pill en reveal-in-Finder-actie.
Een voltooide training levert een Gaussian-cloud — een verzameling van enkele honderdduizenden tot miljoenen 3D-Gauss-verdelingen, die samen de scène reconstrueren. RadianceKit kent tien manieren om deze cloud naar de harde schijf te schrijven. Zes daarvan zijn pure 3D-dataformaten (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-cameravlucht (Orbit Video), en twee exporteren geen Gaussian-inhoud, maar slechts het SfM-resultaat (cameraposes en grove puntenwolk) voor hergebruik in andere trainingspipelines (transforms.json + COLMAP-Workspace).
Welk formaat wanneer het juiste is, hangt af van het doel. Voor de archivering van de volle gegevens zonder kwaliteitsverlies neem je PLY. Voor web-viewer op je eigen pagina volstaat meestal .splat of de ingebouwde web-viewer. Wanneer het bestand minimaal moet zijn, loont SPZ of SOG. Voor hergebruik van het SfM-resultaat in Nerfstudio, Postshot of Brush zijn transforms.json en de COLMAP-workspace de juiste wegen.
Alle exportfuncties zitten in het menu „Export" en in de beginnersmodus 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 verplicht aanwezig is — details zie E4.
E1 — PLY (.ply)
WAAR
Menubalk → Export → 3D Formats → Export PLY… (⌘E). Beginnersmodus: wizard-stap 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 driecomponentige positie, drie altijd 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-ordening (eerst alle R-kanaal-coëfficiënten, dan alle G, dan alle B), gevolgd door logit-opacity (rauwe pre-sigmoid-waarden), drie log-space-schalen en een wxyz-quaternion-rotatie. De maximaal geëxporteerde SH-graad wordt op het minimum van user-wens en daadwerkelijk geleerde graad geclampt; standaard is 3 (45 rest-coëfficiënten). Vóór het schrijven wordt de payload-grootte in 64-bit-integer berekend, om overflow bij extreem grote clouds te vangen. Het bestand wordt atomair geschreven, wat bij grote clouds kortstondig de dubbele schijfruimte gebruikt.
E2 — Compressed PLY (.ply)
WAAR
Menubalk → Export → 3D Formats → Export Compressed PLY…. Beginnersmodus: formaatkaart „Compressed PLY". Grootte: ca. 10–20% t.o.v. 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 chunks van 256 gegroepeerd. Per chunk worden min/max-bounds voor positie, schaal en kleur apart in de header opgeslagen; de afzonderlijke Gaussians refereren aan hun waarden relatief aan deze bounds en worden op 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 (shCoeffCount * 3 uchar per 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…. Beginnersmodus: formaatkaart „SPZ". Grootte: ca. 10% t.o.v. PLY (90% kleiner). Compatibel met: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TECHNISCH
Niantic's SPZ-v2-formaat. Posities worden als 24-bit-fixed-point gepakt (dat levert ca. 0,25 mm resolutie op), 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), opacities als gesigmoidiseerde 8-bit-waarden. DC-SH wordt met een SPZ-specifieke pack-formule (dc_raw * 0.15 * 255 + 0.5 * 255) opgeslagen, hogere SH-bands met 5 bit (band 1) resp. 4 bit (band 2-3) per coëfficiënt. De gehele gepakte binair-blob wordt vervolgens met standaard-gzip (RFC 1952) gecomprimeerd, wat een gzipped-container-formaat met magic bytes 1f 8b oplevert. RadianceKit roept hiervoor de systeem-gzip aan, omdat Apple's ingebouwde zlib-API proprietary Apple-framing genereert, wat niet compatibel zou zijn met de SPZ-readers in Spatial Fields of MetalSplatter. De systeem-gzip blijft ook binnen de macOS-sandbox spawnbaar.
E4 — SOG (.sog)
WAAR
Menubalk → Export → 3D Formats → Export SOG…. Beginnersmodus: formaatkaart „SOG". Grootte: ca. 5–6% t.o.v. 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-beelden opslaat. Eerst worden alle Gaussians via 3D-Morton-code (30-bit Z-order, 10 bit per as) ruimtelijk gesorteerd, wat de beelden later cache-locality in de renderer bezorgt. Vervolgens worden posities met symmetrische log-transformatie (voor betere dynamiek-omvang) op 16-bit-waarden gekwantiseerd en in twee RGBA-beelden gesplitst (means_l.webp voor de onderste 8 bits, means_u.webp voor de bovenste). Rotaties worden als smallest-three met 3×8-bit plus 2-bit-mode in een RGBA-beeld gecodeerd (mode komt in alpha als 252 + largest). Schalen en DC-SH worden met elk een 256-entry-codebook gekwantiseerd (percentielgebaseerd over alle waarden verdeeld), de indexen komen in scales.webp en sh0.webp. De vijf beelden plus een meta.json met codebooks en bounds worden in een ZIP-bestand gepakt (custom-encoder, omdat de sandbox de 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 de beschikbaarheid aan de hand van de build-variant; in de developer-variant moet cwebp via Homebrew zijn geïnstalleerd (brew install webp).
E5 — glTF (.glb)
WAAR
Menubalk → Export → 3D Formats → Export glTF…. Beginnersmodus: formaatkaart „glTF". Grootte: vergelijkbaar met PLY. Compatibel met: glTF-viewers met KHR_gaussian_splatting-extension (Khronos-draft-standaard).
TECHNISCH
Schrijft een zelf-onderhoudend .glb-binair bestand (geen apart bin-bestandsaanhangsel) volgens de KHR_gaussian_splatting-extension-specificatie. Posities worden als reguliere glTF-POSITION-vertex-data (float3) opgeslagen, alle andere attributen (rotatie als float4, scale als float3, opacity als float, SH-coëfficiënten als float3 × shCoeffCount) zitten in extra vertex-attributen en worden via de extension gerefereerd. Belangrijk: glTF gebruikt een rechtshandig Y-up-coördinatensysteem, COLMAP/3DGS werkt Y-down/Z-forward. De exporter past daarom een 180-graden-rotatie om de X-as toe — posities worden met (x, -y, -z) herschreven, quaternions worden naar (w, x, -y, -z) aangepast. Dat levert een geometrisch correcte, handige (niet spiegelverkeerde) weergave in glTF-viewers op. JSON- en binary-chunks worden naar 4-byte-alignment gepad, zoals door de GLB-standaard vereist.
E6 — Splat (.splat)
WAAR
Menubalk → Export → 3D Formats → Export .splat…. Beginnersmodus: 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 entry: 3 × float32 positie (wereld-coördinaten), 3 × float32 scale (exp-getransformeerd vanuit de log-space van de interne buffer), 4 × uint8 RGBA-kleur (DC-SH-coëfficiënt met SH_C0 = 0.282... geschaald en op [0,255] geclampt), 4 × uint8 quaternion (w,x,y,z, genormaliseerd en als 128 + 128*q in het byte-bereik gecodeerd). Alleen DC-SH wordt opgeslagen — hogere SH-banden worden verworpen. Dat maakt het formaat extreem compact, maar kost de view-afhankelijke kleurveranderingen die bij reflecties of speculaire highlights optreden. De schrijfvolgorde is exact de index-volgorde van de cloud (geen ruimtelijke sortering), web-viewers zoals gsplat.js renderen daarvan uit.

flowers-01.html direct vanuit de Finder per dubbelklik in de standaardbrowser geopend — het ingebedde WebGL2-programma rendert de Gaussian-cloud onmiddellijk, zonder netwerk of server. De zwarte markers rond het boeket zijn de trainingscamera's, optioneel in te schakelen. Muis-drag roteert, scroll zoomt.E7 — Web Viewer (.html)
WAAR
Menubalk → Export → Media → Export Web Viewer…. Beginnersmodus: 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 een enkel .html-bestand. Er zijn geen CDN-afhankelijkheden, geen WASM, geen tweede bestand. De cloud wordt intern eerst als .splat-binary gecodeerd (zelfde 32-byte-logica als E6), vervolgens base64-ingebed, vervolgens met atob in de browser gedecodeerd. De ingebouwde renderer doet zijn eigen WebGL2-sortering, muis-orbit-besturing en CPU-sortering per frame; de gehele JS-code (shader, wiskunde, loop) is in de output-HTML te zien. De assen-conventie aan de opslag-tot-renderer-grens is exact dezelfde als in E5: positie (x, -y, -z), quaternion (w, x, -y, -z). Optioneel kan een branding-overlay worden ingeschakeld (free-tier-schakelaar). Omdat alles inline is, werkt het bestand ook direct vanaf 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…. Beginnersmodus: formaatkaart „Orbit Video" met duur-schuif 3–30 s. Grootte: afhankelijk van duur, resolutie, bitrate. Compatibel met: alle platforms (H.264 en HEVC zijn Apple-standaard).
TECHNISCH
Rendert de Gaussian-cloud langs een parametrische orbit-cameravlucht en encodeert elk frame via AVAssetWriter naar een MP4- of MOV-bestand. De orbit-configuratie stuurt rotatiesnelheid (omwentelingen), afstand, elevation, FOV, duur en ease-in/out-factor. Per frame wordt de wereldaanpassingsmatrix (door de renderer berekend om de interne coördinaten naar de Y-up-orbit-wereld te draaien) met de camera vermenigvuldigd, vervolgens wordt de MetalSplatter-specifieke Y-spiegeling toegepast. Het offscreen-rendertarget wordt via IOSurface naar een CVPixelBuffer voor de encoder gestreamd. De encoder ondersteunt H.264 en HEVC, instelbare bitrate en resolutie van 480p tot 8K. Vóór de eerste frame wacht de renderer 200 ms, zodat de initiële splat-sortering voltooid is. Deze export is GPU-bound — bij 8K en miljoenen Gaussians ligt de rendertijd per frame in 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 poses + intrinsics, geen beelden, 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 cameraposes 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) om te zetten. De finale 4×4-matrix komt als row-major nested array van doubles in het transform_matrix-veld van elke frame. Intrinsics worden op het top-level opgeslagen (brandpuntsafstand x/y, hoofdpunt x/y, beeldbreedte/-hoogte, 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. Beeldpaden worden als images/<bestandsnaam> relatief aan 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 zijn elk ruim onder 100 KB. Compatibel met: COLMAP zelf, Nerfstudio, Postshot, Meshroom, alle tools die een COLMAP-sparse/-directory 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 ontdubbelde intrinsics-lijst (camera's met identieke intrinsics + beeldgrootte worden tot één enkele entry samengevat); 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 somt per beeld de pose als wxyz-quaternion plus translatie op, gevolgd door de camera-ID en de bestandsnaam; geen 2D-3D-correspondenties worden opgeslagen. points3D.bin bevat de SfM-puntenwolk met positie, kleur (0-255 RGB) en standaardwaarden voor reprojectie en track-lengte. Alles wordt in little-endian geschreven. Re-import in RadianceKit werkt via het File-menu → „Import COLMAP/Metashape Workspace…" (zie Q3 in het SfM-backend-hoofdstuk).
Welk formaat wanneer?
| Doel | Formaat |
|---|---|
| Web-viewer op eigen pagina | E7 Web Viewer (.html) |
Web-viewer met gsplat.js | E6 Splat (.splat) |
| Pipeline-reuse in Postshot / Nerfstudio | E9 transforms.json + E10 COLMAP Workspace |
| SuperSplat-edit | E1 PLY of E2 Compressed PLY |
| Niantic Scaniverse / Spatial Fields | E3 SPZ |
| Maximale compressie | E4 SOG (cwebp vereist) |
| Marketing-/social-video | E8 Orbit Video |
Snelvergelijking
| Formaat | Extensie | Sandbox | Grootte (1M Gauss) | Beste gebruik |
|---|---|---|---|---|
| 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 web-viewer |
| E7 Web Viewer | .html | ja | ~45 MB | Zelfstandig browser-bestand |
| E8 Orbit Video | .mp4/.mov | ja | variabel | Social/marketing |
| E9 SfM Transforms | .json | ja | ~5 KB | Pose-overdracht |
| E10 COLMAP Workspace | Directory | ja | ~4–8 MB | Pose-overdracht binair |
Grootte-kolom zijn grove richtwaarden voor 1 miljoen Gaussians met SH-graad 3. Reële waarden variëren al naar gelang de comprimeerbaarheid van de scène; SH-graad 0 reduceert PLY/glTF met factor 4.