Kapitel 8 — Eksportformater


Hvad billedet viser (2 991 gaussians, SH degree 3, Bjoerns syntetiske Blender-buket som IP-clean test-sæt): Størrelsesangivelserne under hvert format-kort beregnes live ud fra aktuelt gaussian-antal og format-overhead — ikke hårdkodet. Ud af 2 991 gaussians (SH degree 3) opstår 742 KB PLY, 74 KB SPZ (faktor ~10× mindre via kvantisering), 708 KB glTF (med KHR_gaussian_splatting-extension, derfor næsten PLY-ækvivalent), 96 KB .splat (komprimeret 24-byte-pr.-gaussian-format). Orbit Video viser „~Zero KB", fordi størrelsen først kendes efter MP4-encoding. Web Viewer (133 KB) samler en selvstændig HTML-fil med indlejret WebGL-viewer og komprimerede splat-data — større end rent .splat på grund af viewer-overhead. Export History til højre lister allerede afsluttet PLY-eksport („training_20260527T211321Z.ply, 743 KB, 23:13") med format-pille og reveal-i-Finder-action.
En afsluttet træning leverer en gaussian-cloud — en samling på nogle hundredtusinde til millioner af 3D-gauss-fordelinger, der tilsammen rekonstruerer scenen. RadianceKit kender ti måder at skrive denne sky til disk på. Seks af dem er rene 3D-dataformater (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), et bundler skyen sammen med en færdig HTML-viewer (Web Viewer), et renderer en MP4-fil ud af en orbit-kamerakørsel (Orbit Video), og to eksporterer ingen gaussian-indhold, men kun SfM-resultatet (kamerapositioner og grov punktsky) til genbrug i andre trænings-pipelines (transforms.json + COLMAP-workspace).
Hvilket format der er det rette hvornår, afhænger af målet. Til arkivering af de fulde data uden kvalitetstab tager man PLY. Til web-viewer på egen side rækker som regel .splat eller den indbyggede web-viewer. Hvis filen skal være minimal, betaler SPZ eller SOG sig. Til genbrug af SfM-resultatet i Nerfstudio, Postshot eller Brush er transforms.json og COLMAP-workspace de rigtige veje.
Alle eksportfunktioner ligger i menuen „Export" og i Simple Mode på det sidste wizard-trin. De fleste formater er fuldt sandbox-konforme og virker i App Store-versionen. Kun SOG kræver en ekstern binary (cwebp), som ikke nødvendigvis er til stede i App Store-buildet — detaljer se E4.
E1 — PLY (.ply)
HVOR
Menulinjen → Export → 3D Formats → Export PLY… (⌘E). Simple Mode: wizard-trin Export → format-kort „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. gaussian trekomponent position, tre normaler altid sat til nul, tre DC-SH-koefficienter (f_dc_0..2) for basis-RGB-farven, derefter op til 45 yderligere SH-koefficienter (f_rest_0..44) i den i Kerbl-2023-papiret definerede transponerede channel-major-ordning (først alle R-kanal-koefficienter, så alle G, så alle B), efterfulgt af logit-opacitet (rå pre-sigmoid-værdier), tre log-space-skaler og en wxyz-quaternion-rotation. Den maksimalt eksporterede SH-grad klampes til minimum af brugerønske og faktisk lært grad; default er 3 (45 rest-koefficienter). Før skrivning beregnes payload-størrelsen i 64-bit integer for at fange overflow ved ekstremt store skyer. Filen skrives atomisk, hvilket ved store skyer kortvarigt optager dobbelt diskplads.
E2 — Compressed PLY (.ply)
HVOR
Menulinjen → Export → 3D Formats → Export Compressed PLY…. Simple Mode: format-kort „Compressed PLY". Størrelse: ca. 10–20 % i forhold til PLY (5- til 10-gange komprimering). Kompatibel med: SuperSplat, PlayCanvas-engine, webbaserede viewere.
TEKNISK
PlayCanvas-varianten af PLY-formatet med chunked kvantisering. Gaussians grupperes i 256-stykker-chunks. Pr. chunk lægges min/max-bounds for position, scale og color separat i headeren; de enkelte gaussians refererer deres værdier relativt til disse bounds og komprimeres til hver 32 bit: position og skala med 11-10-11-bit-pakning, rotation som 2-10-10-10-bit „smallest-three"- quaternion, farve som 8-8-8-8-RGBA. Højere SH-koefficienter kvantiseres med kun 8 bit pr. komponent (shCoeffCount * 3 uchar pr. gaussian). Selve formatet er stadig ASCII-header-PLY og derfor principielt validerbart med PLY-værktøjer, men vertex-properties er erklæret som uint-felter. SH-grad er pr. default 0 (ingen rest-koefficienter) for at maksimere komprimeringen — højere SH-grader kan vælges eksplicit.
E3 — SPZ (.spz)
HVOR
Menulinjen → Export → 3D Formats → Export SPZ…. Simple Mode: format-kort „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), skaler som 8-bit-kvantisering i log-rum, rotationer som 8-bit-smallest-three (i v2 gemmes kun xyz, w afledes i decoderen af quaternion-normen), opaciteter som sigmoideret 8-bit-værdier. DC-SH gemmes med en SPZ-specifik pakke-formel (dc_raw * 0.15 * 255 + 0.5 * 255), højere SH-bånd med 5 bit (bånd 1) henholdsvis 4 bit (bånd 2-3) pr. koefficient. Hele den pakkede binær-blob komprimeres derefter med standard-gzip (RFC 1952), hvilket giver et gzipped-container-format med magic bytes 1f 8b. RadianceKit kalder hertil system-gzip, fordi Apples indbyggede zlib-API producerer proprietær Apple-framing, der ikke ville være kompatibel med SPZ-readerne i Spatial Fields eller MetalSplatter. System-gzip kan stadig spawnes inden for macOS-sandboxen.
E4 — SOG (.sog)
HVOR
Menulinjen → Export → 3D Formats → Export SOG…. Simple Mode: format-kort „SOG". Størrelse: ca. 5–6 % i forhold til PLY (15- til 20-gange komprimering — den mindste mulighed). Kompatibel med: PlayCanvas-engine, SuperSplat-editor.
TEKNISK
„Spatially Ordered Gaussians" — et PlayCanvas-format, der gemmer skyen GPU-ready i flere lossless-WebP-billeder. Først sorteres alle gaussians rumligt via 3D-Morton-code (30-bit Z-order, 10 bit pr. akse), hvilket giver billederne senere cache-lokalitet i rendereren. Så kvantiseres positioner med symmetrisk log-transformation (for bedre dynamikomfang) til 16-bit-værdier og splittes i to RGBA-billeder (means_l.webp for de nederste 8 bit, means_u.webp for de øverste). Rotationer kodes som smallest-three med 3×8-bit plus 2-bit-mode i et RGBA-billede (mode lander i alpha som 252 + largest). Skaler og DC-SH kvantiseres hver med en 256-indgangs-codebook (percentil-baseret fordelt over alle værdier), indekserne lander i scales.webp og sh0.webp. De fem billeder plus en meta.json med codebooks og bounds pakkes i en ZIP-fil (custom-encoder, fordi sandboxen blokerer system-zip) og gemmes med endelsen .sog.
Sandbox-advarsel: SOG er den eneste format-mulighed, der kræver en ekstern binary. WebP-encoder-trinet kalder cwebp fra /usr/local/bin/cwebp eller /opt/homebrew/bin/cwebp. Hvis ingen cwebp-binary findes, falder koden tilbage på rå PNG-encoding — men: PNG-fallback fungerer ikke i SuperSplat. I App Store-versionen evaluér tilgængeligheden ud fra build-varianten; i developer-varianten skal cwebp være installeret via Homebrew (brew install webp).
E5 — glTF (.glb)
HVOR
Menulinjen → Export → 3D Formats → Export glTF…. Simple Mode: format-kort „glTF". Størrelse: sammenlignelig med PLY. Kompatibel med: glTF-viewere med KHR_gaussian_splatting-extension (Khronos-draft-standard).
TEKNISK
Skriver en selvstændig .glb-binærfil (ingen separat bin-fil-vedhæftning) i overensstemmelse med KHR_gaussian_splatting-extension-specifikationen. Positioner gemmes som regulære glTF-POSITION-vertex-data (float3), alle andre attributter (rotation som float4, scale som float3, opacity som float, SH-koefficienter som float3 × shCoeffCount) ligger i yderligere vertex-attributter og refereres via extensionen. Vigtigt: glTF bruger højrehåndet Y-up-koordinatsystem, COLMAP/3DGS arbejder Y-down/Z-forward. Eksportøren anvender derfor en 180-graders rotation om X-aksen — positioner skrives om med (x, -y, -z), quaternioner tilpasses til (w, x, -y, -z). Det giver en geometrisk korrekt, hændet (ikke spejlvendt) gengivelse i glTF-viewere. JSON- og binærchunks paddes til 4-byte-alignment, som GLB-standarden kræver.
E6 — Splat (.splat)
HVOR
Menulinjen → Export → 3D Formats → Export .splat…. Simple Mode: format-kort „.splat". Størrelse: præcis 32 bytes pr. gaussian. Kompatibel med: gsplat.js, webbaserede viewere (antimatter15-reference), de fleste browser-3DGS-demoer.
TEKNISK
antimatter15-.splat-formatet — 32 bytes pr. gaussian, ingen header, ingen indirektion. Layout pr. post: 3 × float32 position (verdens-koordinater), 3 × float32 scale (exp-transformeret fra log-space i den interne buffer), 4 × uint8 RGBA-farve (DC-SH-koefficient skaleret med SH_C0 = 0.282... og klampet til [0,255]), 4 × uint8 quaternion (w,x,y,z, normaliseret og kodet som 128 + 128*q i byte-området). Kun DC-SH gemmes — højere SH-bånd kasseres. Det gør formatet ekstremt kompakt, men koster de view-afhængige farveændringer, der opstår ved refleksioner eller spekulære højlys. Skriverækkefølgen er præcis cloudens index-rækkefølge (ingen rumlig sortering), web-viewere som gsplat.js rendrer ud fra det.

flowers-01.html åbnet direkte fra Finder ved dobbeltklik i standardbrowseren — det indlejrede WebGL2-program rendrer gaussian-cloud'en med det samme uden netværk eller server. De sorte markører omkring buketten er trænings-kameraerne, valgfrit indkoblelige. Mus-træk roterer, scroll zoomer.E7 — Web Viewer (.html)
HVOR
Menulinjen → Export → Media → Export Web Viewer…. Simple Mode: format-kort „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
Bundler gaussian-cloud'en sammen med en fuldstændig inline skrevet WebGL2-renderer i en enkelt .html-fil. Der er ingen CDN-afhængigheder, ingen WASM, ingen anden fil. Cloud'en kodes internt først som .splat-binær (samme 32-byte-logik som E6), derefter base64-indlejret, derefter dekodet i browseren med atob. Den indbyggede renderer laver egen WebGL2-sortering, mus-orbit-styring og CPU-sortering pr. frame; hele JS-koden (shadere, matematik, loop) kan ses i output-HTML'en. Akse-konventionen på lagring-til-renderer-grænsen er præcis den samme som i E5: position (x, -y, -z), quaternion (w, x, -y, -z). Valgfrit kan et branding-overlay indkobles (free-tier-kontakt). Da alt er inline, fungerer filen også direkte fra file://-protokollen — ingen lokal webserver nødvendig til test.

E8 — Orbit Video (.mp4/.mov)
HVOR
Menulinjen → Viewport → Record Turntable Video ELLER menulinjen → Export → Media → Export Orbit Video…. Simple Mode: format-kort „Orbit Video" med varigheds-slider 3–30 s. Størrelse: afhænger af varighed, opløsning, bitrate. Kompatibel med: alle platforme (H.264 og HEVC er Apple-standard).
TEKNISK
Rendrer gaussian-cloud'en langs en parametrisk orbit-kamerakørsel og enkoder hvert frame via AVAssetWriter til en MP4- eller MOV-fil. Orbit-konfigurationen styrer rotationshastighed (omdrejninger), afstand, elevation, FOV, varighed og ease-in/out-faktor. Pr. frame multipliceres verdens-tilpasningsmatricen (beregnet af rendereren for at dreje de interne koordinater ind i Y-up-orbit-verdenen) med kameraet, derefter anvendes den MetalSplatter-specifikke Y-spejling. Offscreen-render-target'et trækkes via IOSurface til en CVPixelBuffer for encoderen. Encoderen understøtter H.264 og HEVC, konfigurerbar bitrate og opløsning fra 480p til 8K. Før første frame venter rendereren 200 ms, så den indledende splat-sortering er afsluttet. Denne eksport er GPU-bound — ved 8K og millioner af gaussians ligger render-tiden pr. frame på flere sekunder, altså samlede render-tider på 10–30 minutter for 6 s video muligt.
E9 — SfM Transforms (transforms.json)
HVOR
Menulinjen → Export → Photogrammetry → Export SfM (transforms.json)…. Størrelse: typisk 1–10 KB (kun positioner + intrinsics, ingen billeder, ingen gaussians). Kompatibel med: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, alle moderne feed-forward 3DGS-trænere.
TEKNISK
Skriver nerfstudio-transforms.json-formatet med en liste over kamerapositioner plus delte intrinsics. Pr. kamera inverteres view-matricen (RadianceKit-internt: world-to-camera i COLMAP-konvention), derefter spejles kameralokale Y- og Z-basisvektorer for at konvertere til nerfstudio-konventionen (OpenGL-stil, kamera kigger langs -Z, +Y er op). Den endelige 4×4-matrix lander som row-major nested array af doubles i transform_matrix-feltet i hvert frame. Intrinsics gemmes på top-niveau (brændvidde x/y, hovedpunkt x/y, billedbredde/-højde, camera_model = "OPENCV", plus distortion-coefficients k1, k2, p1, p2) — bortset fra hvis eksportøren genkender flere forskellige intrinsics-sæt, så 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
Menulinjen → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Størrelse: tre binærfiler sammen typisk 4–8 MB — points3D.bin dominerer (én linje pr. 3D-punkt i sparse-cloud'en), images.bin og cameras.bin er hver markant under 100 KB. Kompatibel med: COLMAP selv, Nerfstudio, Postshot, Meshroom, alle værktøjer, der forventer et COLMAP-sparse/-katalog.
TEKNISK
Skriver standard-COLMAP-sparse/0/-layoutet med tre binære filer: cameras.bin, images.bin, points3D.bin. Format-reference er den officielle COLMAP-dokumentation. cameras.bin indeholder den deduplikerede intrinsics-liste (kameraer med identiske intrinsics + billedstørrelse samles til en enkelt post); det anvendte camera-model er OPENCV (model 4), med fx/fy/cx/cy plus de fire distortion-coefficients k1/k2/p1/p2. images.bin lister pr. billede positionen som wxyz-quaternion plus translation, efterfulgt af kamera-ID og filnavn; ingen 2D-3D-korrespondancer gemmes. points3D.bin indeholder SfM-punktskyen med position, farve (0-255 RGB) og default-værdier for reprojektion og track-length. Alt skrives i Little-Endian. Re-import i RadianceKit fungerer via File-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 |
Hurtig sammenligning
| Format | Endelse | Sandbox | Størrelse (1M 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 web-viewer |
| E7 Web Viewer | .html | ja | ~45 MB | Standalone browser-fil |
| E8 Orbit Video | .mp4/.mov | ja | variabel | Social/marketing |
| E9 SfM Transforms | .json | ja | ~5 KB | Pose-overdragelse |
| E10 COLMAP Workspace | Katalog | ja | ~4–8 MB | Pose-overdragelse binær |
Størrelses-kolonnen er grove pejlemærker for 1 mio. gaussians ved SH-grad 3. Reelle værdier varierer alt efter scenens komprimerbarhed; SH-grad 0 reducerer PLY/glTF med faktor 4.