Kapitel 8 — Eksportformater


Hvad man ser på billedet: Størrelsesangivelsen under hver formatflise beregnes live ud fra det aktuelle antal gaussere og format-overheadet — ikke hardkodet. Fra den samme scene opstår dermed 2,2 MB PLY, 142 KB cPLY, 89 KB SOG, 216 KB SPZ, 2,1 MB glTF og 279 KB .splat; Web ligger med 378 KB højere, fordi viewer'en her er indlejret i filen. Video og Wiggle viser „Zero KB", fordi størrelsen først er kendt efter encoding. Den valgte flise har blåt omrids, og knappen nedenunder overtager dens navn — 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".
En afsluttet træning giver en gaussisk sky — en samling af et par hundrede tusind til millioner af 3D-gaussfordelinger, der tilsammen rekonstruerer scenen. Dette kapitel beskriver ti måder at skrive denne sky til disken på. Seks af dem er rene 3D-dataformater (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), en samler skyen sammen med en færdig HTML-viewer (Web Viewer), en renderer en MP4-fil ud fra en orbit-kamerakørsel (Orbit Video), og to eksporterer ikke gaussisk indhold, men blot SfM-resultatet (kamera-positurer og en grov punktsky) til genbrug i andre trænings-pipelines (transforms.json + COLMAP-workspace).
Otte af disse måder er tilgængelige som flise i eksportafsnittet — transforms.json og COLMAP-workspace'et findes kun i menuen. Derudover indeholder gitteret en niende flise, Wiggle, og under eksportknappen står Upload to SuperSplat…, der sender scenen direkte til SuperSplat-editoren på nettet i stedet for til en fil.
Hvilket format der er det rigtige hvornår, afhænger af målet. Til arkivering af de fulde data uden kvalitetstab tager man PLY. Til web-viewere på ens egen side rækker som regel .splat eller den indbyggede web-viewer. Hvis filen skal være minimal, kan det betale sig med SPZ eller SOG. Til genbrug af SfM-resultatet i Nerfstudio, Postshot eller Brush er transforms.json og COLMAP-workspace'et de rigtige veje.
Alle eksportfunktioner findes i menuen „Export" samt i Simple-tilstand på det sidste wizard-trin. De fleste formater er fuldt sandbox-kompatible og fungerer i App Store-versionen. Kun SOG kræver en ekstern binary (cwebp), som ikke nødvendigvis findes i App Store-buildet — se detaljer i E4.
E1 — PLY (.ply)
HVOR
Menulinje → Export → 3D Formats → Export PLY… (⌘E). Simple-tilstand: wizard-trinnet Export → formatkortet „PLY". Størrelse: typisk 100 % (referenceværdi). Kompatibel med: SuperSplat, PolyCam, alle 3DGS-viewere.
TEKNISK
PLY er det kanoniske lagringsformat for 3D Gaussian Splatting. RadianceKit skriver en binær little-endian-fil med det standardiserede 3DGS-property-layout: pr. gausser en tre-komponent position, tre normaler der altid er sat til nul, tre DC-SH-koefficienter (f_dc_0..2) til basis-RGB-farven, efterfulgt af op til 45 yderligere SH-koefficienter (f_rest_0..44) i den transponerede channel-major-ordning defineret i Kerbl-2023-papiret (først alle R-kanal-koefficienter, så alle G, så alle B), efterfulgt af logit-opacitet (rå pre-sigmoid-værdier), tre log-space-skalaer og en wxyz-kvaternion-rotation. Den maksimalt eksporterede SH-grad clampes til minimum af brugerens ønske og den faktisk lærte grad; standard er 3 (45 rest-koefficienter). Før skrivning beregnes payload-størrelsen som 64-bit-heltal for at fange overløb ved ekstremt store skyer. Filen skrives atomart, hvilket kortvarigt optager dobbelt diskplads ved store skyer.
E2 — Compressed PLY (.ply)
HVOR
Menulinje → Export → 3D Formats → Export Compressed PLY…. Simple-tilstand: formatkortet „Compressed PLY". Størrelse: ca. 10–20 % i forhold til PLY (5- til 10-fold kompression). Kompatibel med: SuperSplat, PlayCanvas-engine, web-baserede viewere.
TEKNISK
PlayCanvas-varianten af PLY-formatet med chunked kvantisering. Gausserne grupperes i chunks à 256. Pr. chunk gemmes min/max-grænser for position, skala og farve separat i headeren; de enkelte gaussere refererer deres værdier relativt til disse grænser og komprimeres til 32 bit hver: position og skala med 11-10-11-bit-pakning, rotation som 2-10-10-10-bit „smallest-three"-kvaternion, farve som 8-8-8-8-RGBA. Højere SH-koefficienter kvantiseres med kun 8 bit pr. komponent (tre byte pr. koefficient og gausser). Selve formatet er stadig ASCII-header-PLY og dermed grundlæggende validérbart med PLY-værktøjer, men vertex-egenskaberne er deklareret som uint-felter. SH-grad er som standard 0 (ingen rest-koefficienter) for at maksimere kompressionen — højere SH-grader kan vælges eksplicit.
E3 — SPZ (.spz)
HVOR
Menulinje → Export → 3D Formats → Export SPZ…. Simple-tilstand: formatkortet „SPZ". Størrelse: ca. 10 % i forhold til PLY (90 % mindre). Kompatibel med: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TEKNISK
Niantics SPZ-v2-format. Positioner pakkes som 24-bit fixed-point (det giver ca. 0,25 mm opløsning), skalaer som 8-bit kvantisering i log-rummet, rotationer som 8-bit smallest-three (i v2 gemmes kun xyz, w udledes af decoderen fra kvaternion-normen), opaciteter som sigmoidiserede 8-bit-værdier. DC-SH gemmes med en SPZ-specifik pakningsformel (dc_raw * 0.15 * 255 + 0.5 * 255), højere SH-bånd med 5 bit (bånd 1) hhv. 4 bit (bånd 2-3) pr. koefficient. Hele den pakkede binærblob komprimeres derefter med standard-gzip (RFC 1952), hvilket giver et gzippet container-format med magic bytes 1f 8b. RadianceKit kalder her systemets gzip, fordi Apples indbyggede zlib-API genererer proprietær Apple-framing, som ikke ville være kompatibel med SPZ-readerne i Spatial Fields eller MetalSplatter. Systemets gzip kan stadig spawnes inden for macOS-sandboxen.
E4 — SOG (.sog)
HVOR
Menulinje → Export → 3D Formats → Export SOG…. Simple-tilstand: formatkortet „SOG". Størrelse: ca. 5–6 % i forhold til PLY (15- til 20-fold kompression — den mindste mulighed). Kompatibel med: PlayCanvas-engine, SuperSplat-editor.
TEKNISK
„Spatially Ordered Gaussians" — et PlayCanvas-format, der gemmer skyen GPU-klar i flere lossless-WebP-billeder. Først sorteres alle gaussere rumligt via 3D-Morton-kode (30-bit Z-order, 10 bit pr. akse), hvilket giver billederne senere cache-locality i renderen. Så kvantiseres positioner med symmetrisk log-transformation (for bedre dynamikområde) til 16-bit-værdier og splittes i to RGBA-billeder (means_l.webp for de nedre 8 bit, means_u.webp for de øvre). Rotationer kodes som smallest-three med 3×8 bit plus 2-bit mode i et RGBA-billede (mode havner i alpha som 252 + largest). Skalaer og DC-SH kvantiseres med hver et 256-indgangs-codebook (percentilbaseret fordelt over alle værdier), indekserne havner i scales.webp og sh0.webp. De fem billeder plus en meta.json med codebooks og grænser pakkes i en ZIP-fil (custom encoder, fordi sandboxen blokerer systemets zip) og gemmes med endelsen .sog.
Bemærk sandbox: SOG er den eneste formatmulighed, der kræver en ekstern binary. WebP-encoder-trinnet kalder cwebp fra /usr/local/bin/cwebp eller /opt/homebrew/bin/cwebp. Hvis ingen cwebp-binary findes, falder koden tilbage til rå PNG-encoding — men: PNG-fallback fungerer ikke i SuperSplat. I App Store-versionen evalueres tilgængeligheden ud fra build-varianten; i developer-varianten skal cwebp installeres via Homebrew (brew install webp).
E5 — glTF (.glb)
HVOR
Menulinje → Export → 3D Formats → Export glTF…. Simple-tilstand: formatkortet „glTF". Størrelse: sammenlignelig med PLY. Kompatibel med: glTF-viewere med KHR_gaussian_splatting-udvidelsen (Khronos-udkast-standard).
TEKNISK
Skriver en selvbærende .glb-binærfil (ingen separat bin-file-vedhæftning) i henhold til KHR_gaussian_splatting-udvidelsesspecifikationen. Positioner gemmes som almindelige glTF-POSITION-vertex-data (float3), alle andre attributter (rotation som float4, skala som float3, opacity som float, SH-koefficienter som float3 × shCoeffCount) ligger i yderligere vertex-attributter og refereres via udvidelsen. Vigtigt: glTF bruger et højrehåndet Y-up-koordinatsystem, COLMAP/3DGS arbejder med Y-down/Z-forward. Eksportøren anvender derfor en 180-graders rotation om X-aksen — positioner omskrives med (x, -y, -z), kvaternioner tilpasses til (w, x, -y, -z). Det giver en geometrisk korrekt, handet (ikke spejlvendt) fremstilling i glTF-viewere. JSON- og binærblokke paddes til 4-byte-alignment, som krævet af GLB-standarden.
E6 — Splat (.splat)
HVOR
Menulinje → Export → 3D Formats → Export .splat…. Simple-tilstand: formatkortet „.splat". Størrelse: præcis 32 byte pr. gausser. Kompatibel med: gsplat.js, web-baserede viewere (antimatter15-referencen), de fleste browser-3DGS-demoer.
TEKNISK
Antimatter15-.splat-formatet — 32 byte pr. gausser, ingen header, ingen indirection. Layout pr. post: 3 × float32 position (verdenskoordinater), 3 × float32 skala (eksp-transformeret fra det interne buffers log-space), 4 × uint8 RGBA-farve (DC-SH-koefficient skaleret med SH_C0 = 0.282... og clampet til [0,255]), 4 × uint8 kvaternion (w,x,y,z, normaliseret og kodet som 128 + 128*q i byte-intervallet). Kun DC-SH gemmes — højere SH-bånd kasseres. Det gør formatet ekstremt kompakt, men koster de synsvinkelafhængige farveændringer, der optræder ved spejlinger eller spekulære highlights. Skriverækkefølgen er præcis indeks-rækkefølgen i skyen (ingen rumlig sortering), web-viewere som gsplat.js renderer ud fra det.

flowers-01.html åbnet direkte fra Finder ved dobbeltklik i standardbrowseren — det indlejrede WebGL2-program renderer den gaussiske sky med det samme, uden netværk eller server. De sorte markører rundt om buketten er træningskameraerne, kan valgfrit vises. Museklik-træk roterer, scroll zoomer.E7 — Web Viewer (.html)
HVOR
Menulinje → Export → Media → Export Web Viewer…. Simple-tilstand: formatkortet „Web Viewer". Størrelse: splat-data base64-kodet (≈ 4/3 overhead) + ca. 5 KB HTML/JS-shell. Kompatibel med: enhver moderne browser med WebGL2 (alle desktops, iOS 15+, Android 5+).
TEKNISK
Samler den gaussiske sky sammen med en fuldt inline skrevet WebGL2-renderer i en enkelt .html-fil. Der er ingen CDN-afhængigheder, ingen WASM, ingen anden fil. Skyen kodes internt først som en .splat-binary (samme 32-byte-logik som E6), derefter base64-indlejres den, derefter afkodes den med atob i browseren. Den indbyggede renderer laver egen WebGL2-sortering, muse-orbit-styring og CPU-sortering pr. frame; al JS-koden (shaders, matematik, loop) er synlig i output-HTML'en. Aksekonventionen ved grænsen mellem lager og renderer er præcis den samme som i E5: position (x, -y, -z), kvaternion (w, x, -y, -z). Valgfrit kan et branding-overlay vises (free-tier-kontakt). Da alt er inline, fungerer filen også direkte via file://-protokollen — ingen lokal webserver nødvendig til test.

E8 — Orbit Video (.mp4/.mov)
HVOR
Menulinje → Viewport → Record Turntable Video ELLER Menulinje → Export → Media → Export Orbit Video…. Simple-tilstand: formatkortet „Orbit Video" med varighedsslider 3–30 s. Størrelse: afhænger af varighed, opløsning, bitrate. Kompatibel med: alle platforme (H.264 og HEVC er Apple-standard).
TEKNISK
Renderer den gaussiske sky langs en parametrisk orbit-kamerakørsel og enkoder hvert frame via AVAssetWriter til en MP4- eller MOV-fil. Orbit-konfigurationen styrer omdrejningshastighed (omdrejninger), afstand, elevation, FOV, varighed og ease-in/out-faktor. Orbit-video-eksporten kører gennem RadianceKits EGEN render-stadie med fuld SH-evaluering — pixelidentisk med in-app-viewporten (WYSIWYG). Pr. frame ganges verdens-tilpasningsmatricen (beregnet af renderen for at rotere de interne koordinater ind i den Y-up-orienterede orbit-verden) med kameraet, hvorefter en kamera-konverteringsspejling (orbit-Y-up → COLMAP-Y-down) anvendes. Offscreen-render-målet trækkes via IOSurface til en CVPixelBuffer til encoderen. Encoderen understøtter H.264 og HEVC, konfigurerbar bitrate og opløsning fra 480p til 8K. Før det første frame venter renderen 200 ms, så den indledende splat-sortering er afsluttet. Denne eksport er GPU-bound — ved 8K og millioner gaussere ligger render-tiden pr. frame på flere sekunder, altså mulige samlede rendertider på 10–30 minutter for 6 s video.
E9 — SfM Transforms (transforms.json)
HVOR
Menulinje → Export → Photogrammetry → Export SfM (transforms.json)…. Størrelse: typisk 1–10 KB (kun positurer + intrinsics, ingen billeder, ingen gaussere). Kompatibel med: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, alle moderne feed-forward 3DGS-trænere.
TEKNISK
Skriver nerfstudio-transforms.json-formatet med en liste af kamerapositurer plus fælles intrinsics. Pr. kamera inverteres view-matricen (RadianceKit-internt: world-to-camera i COLMAP-konvention), derefter spejles de kameralokale Y- og Z-basisvektorer for at konvertere til nerfstudio-konventionen (OpenGL-stil, kameraet kigger langs -Z, +Y er op). Den endelige 4×4-matrix havner som row-major nested array af doubles i transform_matrix-feltet for hvert frame. Intrinsics gemmes på top-niveau (brændvidde x/y, hovedpunkt x/y, billedbredde/-højde, camera_model = "OPENCV", plus distortion-koefficienterne k1, k2, p1, p2) — undtagen når eksportøren opdager flere forskellige intrinsics-sæt, i så fald skrives de pr. frame. Billedstier skrives som images/<filename> relativt til JSON-filen; brugeren skal oprette en sibling-images/-mappe med træningsfotoene.
E10 — COLMAP Workspace (sparse/0/)
HVOR
Menulinje → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Størrelse: tre binærfiler tilsammen typisk 4–8 MB — points3D.bin dominerer (en linje pr. 3D-punkt i den sparse sky), images.bin og cameras.bin er hver især markant under 100 KB. Kompatibel med: COLMAP selv, Nerfstudio, Postshot, Meshroom, alle værktøjer, der forventer en COLMAP-sparse/-mappe.
TEKNISK
Skriver det standard COLMAP-sparse/0/-layout med tre binære filer: cameras.bin, images.bin, points3D.bin. Formatreferencen er den officielle COLMAP-dokumentation. cameras.bin indeholder den dedupliserede intrinsics-liste (kameraer med identiske intrinsics + billedstørrelse samles til én enkelt post); det anvendte kameramodel er OPENCV (model 4), med fx/fy/cx/cy plus de fire distortion-koefficienter k1/k2/p1/p2. images.bin viser pr. billede positurer som wxyz-kvaternion plus translation, efterfulgt af kamera-ID og filnavn; der gemmes ingen 2D-3D-korrespondancer. points3D.bin indeholder SfM-punktskyen med position, farve (0-255 RGB) og standardværdier for reprojektion og track-length. Alt skrives i little-endian. Genimport i RadianceKit fungerer via fil-menuen → „Import COLMAP/Metashape Workspace…" (se Q3 i SfM-backend-kapitlet).
Hvilket format hvornår?
| Mål | Format |
|---|---|
| Web-viewer på egen side | E7 Web Viewer (.html) |
Web-viewer med gsplat.js | E6 Splat (.splat) |
| Pipeline-genbrug 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åkrævet) |
| Marketing-/social video | E8 Orbit Video |
| Videreredigering af scenen på nettet | Knappen „Upload to SuperSplat…" under formatgitteret |
Hurtig sammenligning
| Format | Filtype | Sandbox | Størrelse (1 mio. Gauss) | Bedst til |
|---|---|---|---|---|
| E1 PLY | .ply | ja | ~250 MB | Arkiv, højeste 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-webviewer |
| E7 Web Viewer | .html | ja | ~45 MB | Selvstændig browserfil |
| E8 Orbit Video | .mp4/.mov | ja | variabel | Social/marketing |
| E9 SfM Transforms | .json | ja | ~5 KB | Overførsel af positurer |
| E10 COLMAP Workspace | Mappe | ja | ~4–8 MB | Overførsel af positurer, binær |
Størrelseskolonnen viser grove vejledende værdier for 1 mio. Gaussians med SH-grad 3. De reelle værdier varierer afhængigt af, hvor komprimerbar scenen er; SH-grad 0 reducerer PLY/glTF med en faktor 4.