Handleiding

Hoofdstuk 8 — Exportformaten

Exportformaat-keuze in de beginnersmodus — zes formaatkaarten
Exportformaat-keuze in de beginnersmodus — zes formaatkaarten
Exportformaat-rooster live na 5K-iter-training op flowers-boeket — alle zes kaarten met dynamische groottelijke berekening (PLY 742 KB geselecteerd, SPZ 74 KB, glTF 708 KB, .splat 96 KB, Orbit Video ~Zero KB, Web Viewer 133 KB), Export History rechts met al opgeslagen PLY
Exportformaat-rooster live na 5K-iter-training op flowers-boeket — alle zes kaarten met dynamische groottelijke berekening (PLY 742 KB geselecteerd, SPZ 74 KB, glTF 708 KB, .splat 96 KB, Orbit Video ~Zero KB, Web Viewer 133 KB), Export History rechts met reeds opgeslagen PLY

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.

Web Viewer geopend in Firefox — bouquet-splat gerenderd met omringende camera-marker-bollen, browser-tab-bar bovenaan zichtbaar, geen CDN-/server-setup nodig
Web Viewer geopend in Firefox — bouquet-splat gerenderd met omringende camera-marker-bollen, browser-tab-bar bovenaan zichtbaar, geen CDN-/server-setup nodig. Zelfstandig 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.

Enkel frame uit flowers-01.mp4 — boeket in profielrender, wit platform met camera-markers zichtbaar, zwarte achtergrond — typisch orbit-cameravlucht-frame ca. 5s in de video-run
Enkel frame uit flowers-01.mp4 — boeket in profielrender, wit platform met camera-markers zichtbaar, zwarte achtergrond (standaard viewport-achtergrond, in instellingen wijzigbaar). De camera cirkelt om de scène op een parametrische baan (elevation + afstand vast, yaw roteert), duur typisch 6–10 seconden bij 30 of 60 fps. Frameresolutie schaalbaar van 480p tot 8K via VideoPreset.

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?

DoelFormaat
Web-viewer op eigen paginaE7 Web Viewer (.html)
Web-viewer met gsplat.jsE6 Splat (.splat)
Pipeline-reuse in Postshot / NerfstudioE9 transforms.json + E10 COLMAP Workspace
SuperSplat-editE1 PLY of E2 Compressed PLY
Niantic Scaniverse / Spatial FieldsE3 SPZ
Maximale compressieE4 SOG (cwebp vereist)
Marketing-/social-videoE8 Orbit Video

Snelvergelijking

FormaatExtensieSandboxGrootte (1M Gauss)Beste gebruik
E1 PLY.plyja~250 MBArchief, hoogste compatibiliteit
E2 Compressed PLY.plyja~40 MBWeb + SuperSplat
E3 SPZ.spzja (gzip-spawn)~40 MBNiantic + mobiel
E4 SOG.sogvoorwaardelijk (cwebp)~20 MBMaximale compressie
E5 glTF.glbja~250 MBKhronos-pipeline
E6 Splat.splatja~32 MBgsplat.js web-viewer
E7 Web Viewer.htmlja~45 MBZelfstandig browser-bestand
E8 Orbit Video.mp4/.movjavariabelSocial/marketing
E9 SfM Transforms.jsonja~5 KBPose-overdracht
E10 COLMAP WorkspaceDirectoryja~4–8 MBPose-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.