Kapittel 8 — Eksportformater


Hva bildet viser (2 991 gaussians, SH degree 3, en syntetisk Blender-bukett som IP-clean testsett): Størrelsesangivelsene under hvert formatkort beregnes live ut fra aktuelt gaussian-antall og format-overhead — ikke hardkodet. Av 2 991 gaussians (SH degree 3) oppstår 742 KB PLY, 74 KB SPZ (faktor ~10× mindre via kvantisering), 708 KB glTF (med KHR_gaussian_splatting-extension, derfor nesten PLY-ekvivalent), 96 KB .splat (komprimert 24-byte-per-gaussian-format). Orbit Video viser „~Zero KB", fordi størrelsen først er kjent etter MP4-encoding. Web Viewer (133 KB) samler en selvstendig HTML-fil med innebygd WebGL-viewer og komprimerte splat-data — større enn ren .splat på grunn av viewer-overhead. Export History til høyre lister allerede avsluttet PLY-eksport („training_20260527T211321Z.ply, 743 KB, 23:13") med format-pille og reveal-i-Finder-action.
En avsluttet trening leverer en gaussian-cloud — en samling på noen hundretusen til millioner av 3D-gauss-fordelinger, som til sammen rekonstruerer scenen. RadianceKit kjenner ti måter å skrive denne skyen til disk på. Seks av dem er rene 3D-dataformater (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), én bundler skyen sammen med en ferdig HTML-viewer (Web Viewer), én renderer en MP4-fil ut av en orbit-kamerakjøring (Orbit Video), og to eksporterer ingen gaussian-innhold, men kun SfM-resultatet (kameraposisjoner og grov punktsky) for gjenbruk i andre trenings-pipelines (transforms.json + COLMAP-workspace).
Hvilket format som er det rette når, avhenger av målet. For arkivering av de fulle dataene uten kvalitetstap tar man PLY. For web-viewer på egen side holder som regel .splat eller den innebygde web-vieweren. Hvis filen skal være minimal, lønner SPZ eller SOG seg. For gjenbruk av SfM-resultatet i Nerfstudio, Postshot eller Brush er transforms.json og COLMAP-workspace de rette veiene.
Alle eksportfunksjoner ligger i menyen „Export" og i Simple Mode på det siste wizard-trinnet. De fleste formatene er fullt sandbox-konforme og virker i App Store-versjonen. Bare SOG krever en ekstern binary (cwebp), som ikke nødvendigvis er til stede i App Store-buildet — detaljer se E4.
E1 — PLY (.ply)
HVOR
Menylinjen → Export → 3D Formats → Export PLY… (⌘E). Simple Mode: wizard-trinn Export → formatkort „PLY". Størrelse: typisk 100 % (referanseverdi). Kompatibel med: SuperSplat, PolyCam, alle 3DGS-viewere.
TEKNISK
PLY er det kanoniske lagringsformatet for 3D Gaussian Splatting. RadianceKit skriver en binær Little-Endian-fil med det standardiserte 3DGS-property-oppsettet: per gaussian trekomponents posisjon, tre normaler alltid satt til null, tre DC-SH-koeffisienter (f_dc_0..2) for basis-RGB-fargen, deretter opp til 45 ytterligere SH-koeffisienter (f_rest_0..44) i den i Kerbl-2023-paperet definerte transponerte channel-major-rekkefølgen (først alle R-kanal-koeffisienter, så alle G, så alle B), etterfulgt av logit-opasitet (rå pre-sigmoid-verdier), tre log-space-skaler og en wxyz-quaternion-rotasjon. Den maksimalt eksporterte SH-graden klampes til minimum av brukerønske og faktisk lært grad; standard er 3 (45 rest-koeffisienter). Før skriving beregnes payload-størrelsen i 64-bit integer for å fange overflow ved ekstremt store skyer. Filen skrives atomisk, noe som ved store skyer kortvarig opptar dobbelt diskplass.
E2 — Compressed PLY (.ply)
HVOR
Menylinjen → Export → 3D Formats → Export Compressed PLY…. Simple Mode: formatkort „Compressed PLY". Størrelse: ca. 10–20 % i forhold til PLY (5- til 10-ganger komprimering). Kompatibel med: SuperSplat, PlayCanvas-engine, webbaserte viewere.
TEKNISK
PlayCanvas-varianten av PLY-formatet med chunked kvantisering. Gaussians grupperes i 256-stykkers chunks. Per chunk legges min/max-bounds for posisjon, skala og farge separat i headeren; de enkelte gaussians refererer til verdiene sine relativt til disse boundsene og komprimeres til hver 32 bit: posisjon og skala med 11-10-11-bit-pakking, rotasjon som 2-10-10-10-bit „smallest-three"- quaternion, farge som 8-8-8-8-RGBA. Høyere SH-koeffisienter kvantiseres med bare 8 bit per komponent (shCoeffCount * 3 uchar per gaussian). Selve formatet er fortsatt ASCII-header-PLY og derfor i prinsippet validerbart med PLY-verktøy, men vertex-properties er erklært som uint-felter. SH-grad er som standard 0 (ingen rest-koeffisienter) for å maksimere komprimeringen — høyere SH-grader kan velges eksplisitt.
E3 — SPZ (.spz)
HVOR
Menylinjen → Export → 3D Formats → Export SPZ…. Simple Mode: formatkort „SPZ". Størrelse: ca. 10 % i forhold til PLY (90 % mindre). Kompatibel med: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TEKNISK
Niantics SPZ-v2-format. Posisjoner pakkes som 24-bit-fixed-point (det gir ca. 0,25 mm oppløsning), skaler som 8-bit-kvantisering i log-rom, rotasjoner som 8-bit-smallest-three (i v2 lagres bare xyz, w avledes i dekoderen av quaternion-normen), opasiteter som sigmoiderte 8-bit-verdier. DC-SH lagres med en SPZ-spesifikk pakke-formel (dc_raw * 0.15 * 255 + 0.5 * 255), høyere SH-bånd med 5 bit (bånd 1) henholdsvis 4 bit (bånd 2-3) per koeffisient. Hele den pakkede binær-bloben komprimeres deretter med standard-gzip (RFC 1952), noe som gir et gzipped-container-format med magic bytes 1f 8b. RadianceKit kaller her system-gzip, fordi Apples innebygde zlib-API produserer proprietær Apple-framing som ikke ville være kompatibel med SPZ-leserne i Spatial Fields eller MetalSplatter. System-gzip kan fortsatt spawnes innenfor macOS-sandboxen.
E4 — SOG (.sog)
HVOR
Menylinjen → Export → 3D Formats → Export SOG…. Simple Mode: formatkort „SOG". Størrelse: ca. 5–6 % i forhold til PLY (15- til 20-ganger komprimering — det minste alternativet). Kompatibel med: PlayCanvas-engine, SuperSplat-editor.
TEKNISK
„Spatially Ordered Gaussians" — et PlayCanvas-format som lagrer skyen GPU-ready i flere lossless-WebP-bilder. Først sorteres alle gaussians romlig via 3D-Morton-code (30-bit Z-order, 10 bit per akse), noe som gir bildene senere cache-lokalitet i rendereren. Så kvantiseres posisjoner med symmetrisk log-transformasjon (for bedre dynamikkomfang) til 16-bit-verdier og splittes i to RGBA-bilder (means_l.webp for de nederste 8 bit, means_u.webp for de øverste). Rotasjoner kodes som smallest-three med 3×8-bit pluss 2-bit-mode i et RGBA-bilde (mode lander i alpha som 252 + largest). Skaler og DC-SH kvantiseres hver med en 256-oppførings-codebook (persentil-basert fordelt over alle verdier), indeksene lander i scales.webp og sh0.webp. De fem bildene pluss en meta.json med codebooks og bounds pakkes i en ZIP-fil (custom-encoder, fordi sandboxen blokkerer system-zip) og lagres med endelsen .sog.
Sandbox-advarsel: SOG er det eneste formatalternativet som krever en ekstern binary. WebP-encoder-trinnet kaller cwebp fra /usr/local/bin/cwebp eller /opt/homebrew/bin/cwebp. Hvis ingen cwebp-binary finnes, faller koden tilbake på rå PNG-encoding — men: PNG-fallback fungerer ikke i SuperSplat. I App Store-versjonen evalueres tilgjengeligheten ut fra build-varianten; i developer-varianten må cwebp være installert via Homebrew (brew install webp).
E5 — glTF (.glb)
HVOR
Menylinjen → Export → 3D Formats → Export glTF…. Simple Mode: formatkort „glTF". Størrelse: sammenlignbar med PLY. Kompatibel med: glTF-viewere med KHR_gaussian_splatting-extension (Khronos-draft-standard).
TEKNISK
Skriver en selvstendig .glb-binærfil (ingen separat bin-fil-vedlegg) i samsvar med KHR_gaussian_splatting-extension-spesifikasjonen. Posisjoner lagres som vanlige glTF-POSITION-vertex-data (float3), alle andre attributter (rotasjon som float4, scale som float3, opacity som float, SH-koeffisienter som float3 × shCoeffCount) ligger i ytterligere vertex-attributter og refereres via extensionen. Viktig: glTF bruker høyrehendt Y-up-koordinatsystem, COLMAP/3DGS arbeider Y-down/Z-forward. Eksportøren anvender derfor en 180-graders rotasjon om X-aksen — posisjoner skrives om med (x, -y, -z), quaternioner tilpasses til (w, x, -y, -z). Det gir en geometrisk korrekt, hendet (ikke speilvendt) gjengivelse i glTF-viewere. JSON- og binærchunks paddes til 4-byte-alignment, som GLB-standarden krever.
E6 — Splat (.splat)
HVOR
Menylinjen → Export → 3D Formats → Export .splat…. Simple Mode: formatkort „.splat". Størrelse: nøyaktig 32 bytes per gaussian. Kompatibel med: gsplat.js, webbaserte viewere (antimatter15-referanse), de fleste browser-3DGS-demoer.
TEKNISK
antimatter15-.splat-formatet — 32 bytes per gaussian, ingen header, ingen indirektion. Layout per oppføring: 3 × float32 posisjon (verdens-koordinater), 3 × float32 scale (exp-transformert fra log-space i den interne bufferen), 4 × uint8 RGBA-farge (DC-SH-koeffisient skalert med SH_C0 = 0.282... og klampet til [0,255]), 4 × uint8 quaternion (w,x,y,z, normalisert og kodet som 128 + 128*q i byte-området). Bare DC-SH lagres — høyere SH-bånd forkastes. Det gjør formatet ekstremt kompakt, men koster de view-avhengige fargeendringene som oppstår ved refleksjoner eller spekulære høylys. Skriverekkefølgen er nøyaktig skyens indeksrekkefølge (ingen romlig sortering), web-viewere som gsplat.js rendrer ut fra det.

bukett-01.html åpnet direkte fra Finder ved dobbeltklikk i standardnettleseren — det innebygde WebGL2-programmet rendrer gaussian-skyen umiddelbart uten nettverk eller server. De svarte markørene rundt buketten er treningskameraene, valgfritt kan slås på. Mus-dra roterer, scroll zoomer.E7 — Web Viewer (.html)
HVOR
Menylinjen → Export → Media → Export Web Viewer…. Simple Mode: formatkort „Web Viewer". Størrelse: splat-data base64-kodet (≈ 4/3 overhead) + ca. 5 KB HTML/JS-shell. Kompatibel med: enhver moderne nettleser med WebGL2 (alle desktops, iOS 15+, Android 5+).
TEKNISK
Bundler gaussian-skyen sammen med en fullstendig inline skrevet WebGL2-renderer i en enkelt .html-fil. Det er ingen CDN-avhengigheter, ingen WASM, ingen annen fil. Skyen kodes internt først som .splat-binær (samme 32-byte-logikk som E6), deretter base64-innebygd, deretter dekodet i nettleseren med atob. Den innebygde rendereren gjør egen WebGL2-sortering, mus-orbit-styring og CPU-sortering per frame; hele JS-koden (shadere, matematikk, loop) kan ses i output-HTML-en. Akse-konvensjonen på lagring-til-renderer-grensen er nøyaktig den samme som i E5: posisjon (x, -y, -z), quaternion (w, x, -y, -z). Valgfritt kan et branding-overlay slås på (free-tier-kontakt). Da alt er inline, fungerer filen også direkte fra file://-protokollen — ingen lokal webserver nødvendig for test.

E8 — Orbit Video (.mp4/.mov)
HVOR
Menylinjen → Viewport → Record Turntable Video ELLER menylinjen → Export → Media → Export Orbit Video…. Simple Mode: formatkort „Orbit Video" med varighetsglider 3–30 s. Størrelse: avhenger av varighet, oppløsning, bitrate. Kompatibel med: alle plattformer (H.264 og HEVC er Apple-standard).
TEKNISK
Rendrer gaussian-skyen langs en parametrisk orbit-kamerakjøring og enkoder hvert frame via AVAssetWriter til en MP4- eller MOV-fil. Orbit-konfigurasjonen styrer rotasjonshastighet (omdreininger), avstand, elevasjon, FOV, varighet og ease-in/out-faktor. Per frame multipliseres verdens-tilpasningsmatrisen (beregnet av rendereren for å dreie de interne koordinatene inn i Y-up-orbit-verdenen) med kameraet, deretter brukes den MetalSplatter-spesifikke Y-speilingen. Offscreen-render-targetet trekkes via IOSurface til en CVPixelBuffer for encoderen. Encoderen støtter H.264 og HEVC, konfigurerbar bitrate og oppløsning fra 480p til 8K. Før første frame venter rendereren 200 ms, slik at den innledende splat-sorteringen er avsluttet. Denne eksporten er GPU-bound — ved 8K og millioner av gaussians ligger render-tiden per frame på flere sekunder, altså samlede render-tider på 10–30 minutter for 6 s video mulig.
E9 — SfM Transforms (transforms.json)
HVOR
Menylinjen → Export → Photogrammetry → Export SfM (transforms.json)…. Størrelse: typisk 1–10 KB (kun posisjoner + intrinsics, ingen bilder, ingen gaussians). Kompatibel med: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, alle moderne feed-forward 3DGS-trenere.
TEKNISK
Skriver nerfstudio-transforms.json-formatet med en liste over kameraposisjoner pluss delte intrinsics. Per kamera inverteres view-matrisen (RadianceKit-internt: world-to-camera i COLMAP-konvensjon), deretter speiles kameralokale Y- og Z-basisvektorer for å konvertere til nerfstudio-konvensjonen (OpenGL-stil, kamera ser langs -Z, +Y er opp). Den endelige 4×4-matrisen lander som row-major nested array av doubles i transform_matrix-feltet i hver frame. Intrinsics lagres på toppnivå (brennvidde x/y, hovedpunkt x/y, bildebredde/-høyde, camera_model = "OPENCV", pluss distortion-coefficients k1, k2, p1, p2) — bortsett fra hvis eksportøren gjenkjenner flere forskjellige intrinsics-sett, da skrives de per frame. Bildestier skrives som images/<filename> relativt til JSON-filen; brukeren må opprette en sibling-images/-mappe med treningsfotoene.
E10 — COLMAP Workspace (sparse/0/)
HVOR
Menylinjen → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Størrelse: tre binærfiler til sammen typisk 4–8 MB — points3D.bin dominerer (én linje per 3D-punkt i sparse-skyen), images.bin og cameras.bin er hver markant under 100 KB. Kompatibel med: COLMAP selv, Nerfstudio, Postshot, Meshroom, alle verktøy som forventer et COLMAP-sparse/-katalog.
TEKNISK
Skriver standard-COLMAP-sparse/0/-layoutet med tre binære filer: cameras.bin, images.bin, points3D.bin. Formatreferanse er den offisielle COLMAP-dokumentasjonen. cameras.bin inneholder den dedupliserte intrinsics-listen (kameraer med identiske intrinsics + bildestørrelse samles til en enkelt oppføring); den benyttede kameramodellen er OPENCV (modell 4), med fx/fy/cx/cy pluss de fire distortion-coefficients k1/k2/p1/p2. images.bin lister per bilde posisjonen som wxyz-quaternion pluss translation, etterfulgt av kamera-ID og filnavn; ingen 2D-3D-korrespondanser lagres. points3D.bin inneholder SfM-punktskyen med posisjon, farge (0-255 RGB) og default-verdier for reprojeksjon og track-length. Alt skrives i Little-Endian. Re-import i RadianceKit fungerer via File-menyen → „Import COLMAP/Metashape Workspace…" (se Q3 i SfM-backend-kapittelet).
Hvilket format når?
| Mål | Format |
|---|---|
| Web-viewer på egen side | E7 Web Viewer (.html) |
Web-viewer med gsplat.js | E6 Splat (.splat) |
| Pipeline-gjenbruk i Postshot / Nerfstudio | E9 transforms.json + E10 COLMAP Workspace |
| SuperSplat-redigering | E1 PLY eller E2 Compressed PLY |
| Niantic Scaniverse / Spatial Fields | E3 SPZ |
| Maksimal komprimering | E4 SOG (cwebp påkrevet) |
| Markedsføring/social-video | E8 Orbit Video |
Rask sammenligning
| Format | Endelse | Sandbox | Størrelse (1M gauss) | Best til |
|---|---|---|---|---|
| E1 PLY | .ply | ja | ~250 MB | Arkiv, høyeste kompatibilitet |
| E2 Compressed PLY | .ply | ja | ~40 MB | Web + SuperSplat |
| E3 SPZ | .spz | ja (gzip-spawn) | ~40 MB | Niantic + mobil |
| E4 SOG | .sog | betinget (cwebp) | ~20 MB | Maksimal komprimering |
| 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 | Standalone nettleserfil |
| E8 Orbit Video | .mp4/.mov | ja | variabel | Social/markedsføring |
| E9 SfM Transforms | .json | ja | ~5 KB | Pose-overlevering |
| E10 COLMAP Workspace | Katalog | ja | ~4–8 MB | Pose-overlevering binær |
Størrelseskolonnen er grove pekepinner for 1 mio. gaussians ved SH-grad 3. Reelle verdier varierer avhengig av scenens komprimerbarhet; SH-grad 0 reduserer PLY/glTF med faktor 4.