Kapittel 8 — Eksportformater


Det du ser på bildet: Størrelsesangivelsen under hver formatflis beregnes live ut fra det gjeldende Gaussian-antallet og format-overheaden — ikke hardkodet. Fra samme scene oppstår slik 2,2 MB PLY, 142 KB cPLY, 89 KB SOG, 216 KB SPZ, 2,1 MB glTF og 279 KB .splat; Web ligger på 378 KB og dermed høyere, fordi viseren følger med i filen der. Video og Wiggle viser «Zero KB», fordi størrelsen først er klar etter encoding. Den valgte flisen har blå ramme, og knappen under overtar navnet dens — her «Export PLY (3DGS Standard)». Under overskriften står linjen «Leveling the floor turns the view at once; the chosen orientation and format apply when saving».
Et fullført treningsforløp gir en Gaussian-sky — en samling av noen hundretusen til flere millioner 3D-gaussfordelinger som til sammen rekonstruerer scenen. Dette kapittelet beskriver ti måter å skrive denne skyen til disk på. Seks av dem er rene 3D-dataformater (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), ett bunter skyen sammen med en ferdig HTML-viser (Web Viewer), ett rendrer en MP4-fil ut fra en orbit-kamerakjøring (Orbit Video), og to eksporterer ikke Gaussian-innhold, men kun SfM-resultatet (kameraposer og en grov punktsky) for gjenbruk i andre trenings-pipeliner (transforms.json + COLMAP-workspace).
Åtte av disse veiene er tilgjengelige som fliser i eksport-seksjonen — transforms.json og COLMAP-workspace finnes bare i menyen. I tillegg inneholder rutenettet en niende flis Wiggle, og under eksportknappen står Upload to SuperSplat…, som sender scenen direkte til SuperSplat-editoren på nettet i stedet for til en fil.
Hvilket format som er riktig når, avhenger av målet. For arkivering av de fulle dataene uten kvalitetstap tar man PLY. For nettvisere på egen side holder som regel .splat eller den innebygde Web Viewer. Hvis filen må 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 riktige veiene.
Alle eksportfunksjoner ligger i menyen «Export» samt i Simple-modus på det siste veivisertrinnet. De fleste formatene er fullt sandkasse-kompatible og fungerer i App Store-versjonen. Bare SOG krever en ekstern binærfil (cwebp), som ikke nødvendigvis finnes i App Store-bygget — se detaljer i E4.
E1 — PLY (.ply)
HVOR
Menylinje → Export → 3D Formats → Export PLY… (⌘E). Simple-modus: veivisertrinn Export → formatkort «PLY». Størrelse: typisk 100 % (referanseverdi). Kompatibel med: SuperSplat, PolyCam, alle 3DGS-visere.
TEKNISK
PLY er det kanoniske lagringsformatet for 3D Gaussian Splatting. RadianceKit skriver en binær little-endian-fil med det standardiserte 3DGS-egenskapsoppsettet: per gaussian tredimensjonal posisjon, tre normaler alltid satt til null, tre DC-SH-koeffisienter (f_dc_0..2) for RGB-basisfargen, deretter opptil 45 ytterligere SH-koeffisienter (f_rest_0..44) i den transponerte kanal-major-anordningen definert av Kerbl-2023-artikkelen (først alle R-kanal-koeffisienter, så alle G, så alle B), etterfulgt av logit-opasitet (rå pre-sigmoid-verdier), tre log-space-skalaer og en wxyz-kvaternion-rotasjon. Den maksimalt eksporterte SH-graden klemmes 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-heltall for å fange overflyt ved ekstremt store skyer. Filen skrives atomært, noe som ved store skyer midlertidig belegger dobbel diskplass.
E2 — Compressed PLY (.ply)
HVOR
Menylinje → Export → 3D Formats → Export Compressed PLY…. Simple-modus: formatkort «Compressed PLY». Størrelse: ca. 10–20 % av PLY (5- til 10-gangers komprimering). Kompatibel med: SuperSplat, PlayCanvas-motoren, nettbaserte visere.
TEKNISK
PlayCanvas-varianten av PLY-formatet med chunket kvantisering. Gaussianene grupperes i biter på 256. Per bit lagres min/maks-grenser for posisjon, skala og farge separat i headeren; de enkelte gaussianene refererer til verdiene sine relativt til disse grensene og komprimeres til 32 bit hver: posisjon og skala med 11-10-11-bit-pakking, rotasjon som 2-10-10-10-bit «smallest-three»-kvaternion, farge som 8-8-8-8-RGBA. Høyere SH-koeffisienter kvantiseres med bare 8 bit per komponent (tre byte per koeffisient og gaussian). Selve formatet er fortsatt ASCII-header-PLY og dermed grunnleggende validerbart med PLY-verktøy, men vertex-egenskapene er deklarert som uint-felt. SH-grad er som standard 0 (ingen rest-koeffisienter) for å maksimere komprimeringen — høyere SH-grader kan velges eksplisitt.
E3 — SPZ (.spz)
HVOR
Menylinje → Export → 3D Formats → Export SPZ…. Simple-modus: formatkort «SPZ». Størrelse: ca. 10 % av 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), skalaer som 8-bit-kvantisering i log-rom, rotasjoner som 8-bit-smallest-three (i v2 lagres kun xyz, w utledes i dekoderen fra kvaternion-normen), opasiteter som sigmoidiserte 8-bit-verdier. DC-SH lagres med en SPZ-spesifikk pakkeformel (dc_raw * 0.15 * 255 + 0.5 * 255), høyere SH-bånd med 5 bit (bånd 1) hhv. 4 bit (bånd 2-3) per koeffisient. Hele den pakkede binærblobben komprimeres deretter med standard-gzip (RFC 1952), noe som gir et gzippet containerformat med magiske byte 1f 8b. RadianceKit kaller her system-gzip, fordi Apples innebygde zlib-API skaper proprietær Apple-framing som ikke ville vært kompatibel med SPZ-leserne i Spatial Fields eller MetalSplatter. System-gzip forblir også spawnbar innenfor macOS-sandkassen.
E4 — SOG (.sog)
HVOR
Menylinje → Export → 3D Formats → Export SOG…. Simple-modus: formatkort «SOG». Størrelse: ca. 5–6 % av PLY (15- til 20-gangers komprimering — det minste alternativet). Kompatibel med: PlayCanvas-motoren, SuperSplat-editoren.
TEKNISK
«Spatially Ordered Gaussians» — et PlayCanvas-format som lagrer skyen GPU-klar i flere tapsfrie WebP-bilder. Først sorteres alle gaussianer romlig via 3D-Morton-kode (30-bit Z-order, 10 bit per akse), noe som gir bildene senere cache-lokalitet i rendereren. Deretter kvantiseres posisjoner med symmetrisk log-transformasjon (for bedre dynamikkomfang) til 16-bit-verdier og splittes i to RGBA-bilder (means_l.webp for de nedre 8 bit, means_u.webp for de øvre). Rotasjoner kodes som smallest-three med 3×8 bit pluss 2-bit modus i ett RGBA-bilde (modus havner i alfa som 252 + largest). Skalaer og DC-SH kvantiseres med hver sin 256-oppførings-kodebok (perzentilbasert fordelt over alle verdier), indeksene havner i scales.webp og sh0.webp. De fem bildene pluss en meta.json med kodebøker og grenser pakkes i en ZIP-fil (egen encoder, fordi sandkassen blokkerer system-zip) og lagres med endelsen .sog.
NB sandkasse: SOG er det eneste formatalternativet som krever en ekstern binærfil. WebP-encoder-trinnet kaller cwebp fra /usr/local/bin/cwebp eller /opt/homebrew/bin/cwebp. Hvis ingen cwebp-binærfil finnes, faller koden tilbake til rå PNG-encoding — men: PNG-fallback fungerer ikke i SuperSplat. I App Store-versjonen evalueres tilgjengeligheten ut fra byggevarianten; i utviklervarianten må cwebp installeres via Homebrew (brew install webp).
E5 — glTF (.glb)
HVOR
Menylinje → Export → 3D Formats → Export glTF…. Simple-modus: formatkort «glTF». Størrelse: sammenlignbar med PLY. Kompatibel med: glTF-visere med KHR_gaussian_splatting-utvidelsen (Khronos-utkaststandard).
TEKNISK
Skriver en selvstendig .glb-binærfil (ingen separat bin-fil-vedlegg) i henhold til KHR_gaussian_splatting-utvidelsesspesifikasjonen. Posisjoner lagres som vanlige glTF-POSITION-vertex-data (float3), alle andre attributter (rotasjon som float4, skala som float3, opasitet som float, SH-koeffisienter som float3 × shCoeffCount) ligger i ekstra vertex-attributter og refereres via utvidelsen. Viktig: glTF bruker et høyrehendt Y-up-koordinatsystem, COLMAP/3DGS jobber Y-ned/Z-fremover. Eksportøren utfører derfor en 180-graders rotasjon rundt X-aksen — posisjoner omskrives med (x, -y, -z), kvaternioner tilpasses til (w, x, -y, -z). Det gir en geometrisk korrekt, riktig-hendt (ikke speilvendt) fremstilling i glTF-visere. JSON- og binærblokker paddes til 4-byte-justering, slik GLB-standarden krever.
E6 — Splat (.splat)
HVOR
Menylinje → Export → 3D Formats → Export .splat…. Simple-modus: formatkort «.splat». Størrelse: eksakt 32 byte per gaussian. Kompatibel med: gsplat.js, nettbaserte visere (antimatter15-referansen), de fleste nettleser-3DGS-demoer.
TEKNISK
antimatter15-.splat-formatet — 32 byte per gaussian, ingen header, ingen indireksjon. Oppsett per oppføring: 3 × float32 posisjon (verdenskoordinater), 3 × float32 skala (eksp-transformert fra log-space i den interne bufferen), 4 × uint8 RGBA-farge (DC-SH-koeffisienten skalert med SH_C0 = 0.282... og klemt til [0,255]), 4 × uint8 kvaternion (w,x,y,z, normalisert og kodet i byte-området som 128 + 128*q). Kun DC-SH lagres — høyere SH-bånd forkastes. Det gjør formatet ekstremt kompakt, men koster de blikkvinkelavhengige fargeendringene som oppstår ved speilinger eller spekulare høylys. Skriverekkefølgen er nøyaktig indeksrekkefølgen i skyen (ingen romlig sortering), nettvisere som gsplat.js rendrer ut fra det.

flowers-01.html åpnet direkte fra Finder med dobbeltklikk i standardnettleseren — det innebygde WebGL2-programmet rendrer Gaussian-skyen umiddelbart, uten nett eller server. De svarte markørene rundt buketten er treningskameraene, som kan slås på valgfritt. Musedrag roterer, scroll zoomer.E7 — Web Viewer (.html)
HVOR
Menylinje → Export → Media → Export Web Viewer…. Simple-modus: formatkort «Web Viewer». Størrelse: splat-data base64-kodet (≈ 4/3 overhead) + ca. 5 KB HTML/JS-skall. Kompatibel med: enhver moderne nettleser med WebGL2 (alle stasjonære maskiner, iOS 15+, Android 5+).
TEKNISK
Bunter Gaussian-skyen sammen med en fullstendig inline skrevet WebGL2-renderer i én enkelt .html-fil. Det finnes ingen CDN-avhengigheter, ingen WASM, ingen andre filer. Skyen kodes internt først som .splat-binærfil (samme 32-byte-logikk som E6), deretter base64-innebygd, deretter dekodet med atob i nettleseren. Den innebygde rendereren gjør egen WebGL2-sortering, mus-orbit-styring og CPU-sortering per frame; hele JS-koden (shadere, matematikk, løkke) er synlig i utdata-HTML-en. Akse-konvensjonen på grensen mellom lagring og renderer er nøyaktig den samme som i E5: posisjon (x, -y, -z), kvaternion (w, x, -y, -z). Valgfritt kan et branding-overlegg vises (free-tier-bryter). Siden alt er inline, fungerer filen også direkte fra file://-protokollen — ingen lokal webserver nødvendig for testing.

E8 — Orbit Video (.mp4/.mov)
HVOR
Menylinje → Viewport → Record Turntable Video ELLER Menylinje → Export → Media → Export Orbit Video…. Simple-modus: formatkort «Orbit Video» med varighetsglidebryter 3–30 s. Størrelse: avhengig 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 bilde via AVAssetWriter til en MP4- eller MOV-fil. Orbit-konfigurasjonen styrer rotasjonshastighet (omdreininger), avstand, elevasjon, FOV, varighet og ease-inn/ut-faktor. Orbit-video-eksporten kjører gjennom RadianceKits EGEN rendertrinn med full SH-evaluering — pikselidentisk med in-app-viewporten (WYSIWYG). Per bilde multipliseres verden-tilpasningsmatrisen (beregnet av rendereren for å rotere de interne koordinatene til Y-up-orbit-verdenen) med kameraet, deretter brukes en kamerakonverterings-speiling (orbit-Y-up → COLMAP-Y-ned). Offscreen-render-målet trekkes via IOSurface til en CVPixelBuffer for enkoderen. Enkoderen støtter H.264 og HEVC, konfigurerbar bitrate og oppløsning fra 480p til 8K. Før første bilde venter rendereren 200 ms, slik at den innledende splat-sorteringen er ferdig. Denne eksporten er GPU-bundet — ved 8K og millioner gaussianer ligger rendertiden per bilde på flere sekunder, altså mulige totale rendertider på 10–30 minutter for 6 s video.
E9 — SfM Transforms (transforms.json)
HVOR
Menylinje → Export → Photogrammetry → Export SfM (transforms.json)…. Størrelse: typisk 1–10 KB (kun poser + intrinsics, ingen bilder, ingen gaussianer). Kompatibel med: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, alle moderne feed-forward 3DGS-trenere.
TEKNISK
Skriver nerfstudio-transforms.json-formatet med en liste over kameraposer pluss delte intrinsics. Per kamera inverteres view-matrisen (RadianceKit-internt: world-to-camera i COLMAP-konvensjon), deretter speiles de kameralokale Y- og Z-basisvektorene for å konvertere til nerfstudio-konvensjonen (OpenGL-stil, kameraet ser langs -Z, +Y er opp). Den endelige 4×4-matrisen havner som row-major nested array av doubles i transform_matrix-feltet for hver frame. Intrinsics lagres på toppnivået (brennvidde x/y, hovedpunkt x/y, bildebredde/-høyde, camera_model = "OPENCV", pluss forvrengningskoeffisientene k1, k2, p1, p2) — unntatt når eksportøren oppdager flere ulike intrinsics-sett, da skrives de per frame. Bildebaner skrives som images/<filename> relativt til JSON-filen; brukeren må opprette en søsken-images/-mappe med treningsbildene.
E10 — COLMAP Workspace (sparse/0/)
HVOR
Menylinje → 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 godt 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/-oppsettet med tre binærfiler: cameras.bin, images.bin, points3D.bin. Formatreferansen er den offisielle COLMAP-dokumentasjonen. cameras.bin inneholder den deduplikerte intrinsics-listen (kameraer med identiske intrinsics + bildestørrelse slås sammen til én enkelt oppføring); den brukte kameramodellen er OPENCV (modell 4), med fx/fy/cx/cy pluss de fire forvrengningskoeffisientene k1/k2/p1/p2. images.bin lister for hvert bilde posen som wxyz-kvaternion pluss translasjon, etterfulgt av kamera-ID og filnavn; ingen 2D-3D-korrespondanser lagres. points3D.bin inneholder SfM-punktskyen med posisjon, farge (0-255 RGB) og standardverdier for reprojeksjon og sporlengde. Alt skrives i little-endian. Reimport til RadianceKit fungerer via File-menyen → «Import COLMAP/Metashape Workspace…» (se Q3 i SfM-backend-kapittelet).
Hvilket format når?
| Mål | Format |
|---|---|
| Nettviser på egen side | E7 Web Viewer (.html) |
Nettviser 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 kreves) |
| Markedsførings-/sosiale medier-video | E8 Orbit Video |
| Videreredigere scenen på nettet | Knappen «Upload to SuperSplat…» under formatrutenettet |
Hurtigsammenligning
| Format | Filtype | Sandkasse | Størrelse (1M Gauss) | Best egnet til |
|---|---|---|---|---|
| E1 PLY | .ply | ja | ~250 MB | Arkiv, høyest kompatibilitet |
| E2 Komprimert 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 nettleser |
| E7 Nettvisning | .html | ja | ~45 MB | Frittstående nettleserfil |
| E8 Orbit- video | .mp4/.mov | ja | variabel | Sosiale medier/markedsføring |
| E9 SfM-transformasjoner | .json | ja | ~5 KB | Overføring av poser |
| E10 COLMAP-arbeidsområde | Mappe | ja | ~4–8 MB | Overføring av poser, binært |
Kolonnen for størrelse er grove veiledende verdier for 1 million Gaussians med SH-grad 3. Reelle verdier varierer avhengig av hvor komprimerbar scenen er; SH-grad 0 reduserer PLY/glTF med en faktor på 4.