Kapitel 8 — Eksportformater


Vad bilden visar (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 — inte hårdkodet. Ud av 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, därför næsten PLY-ækvivalent), 96 KB .splat (komprimeret 24-byte-pr.-gaussian-format). Orbit Video visar „~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 av 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-Hittar-action.
En afsluttet träning leverer en gaussian-cloud — en samling på några hundredtusinde til millioner av 3D-gauss-fordelinger, der tilsammen rekonstruerer scenen. RadianceKit kender ti måder at skrive denna sky til disk på. Seks av 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 av en orbit-kamerakørsel (Orbit Video), og to eksporterer ingen gaussian-indhold, men kun SfM-resultatet (kamerapositioner og grov punktmoln) til genbrug i andre trænings-pipelines (transforms.json + COLMAP-workspace).
Hvilket format der är det rette hvornår, afhænger av målet. Til arkivering av de fulde data uden kvalitetstab tager man PLY. Til web-viewer på egen side rækker som regel .splat eller den indbyggede web-viewer. Om filen ska være minimal, betaler SPZ eller SOG sig. Til genbrug av 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 sista wizard-trin. De fleste formater er fuldt sandbox-konforme og virker i App Store-versionen. Kun SOG kræver en ekstern binary (cwebp), som inte nødvendigvis er til stede i App Store-buildet — detaljer se E4.
E1 — PLY (.ply)
VAR
Menulinjen → Export → 3D Formats → Export PLY… (⌘E). Simple Mode: wizard-trin Export → format-kort „PLY". Størrelse: typiskt 100 % (referenceværdi). Kompatibel med: SuperSplat, PolyCam, alle 3DGS-viewere.
TEKNISKT
PLY är 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, därefter 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 av logit-opacitet (rå pre-sigmoid-värden), tre log-space-skaler og en wxyz-quaternion-rotation. Den maksimalt eksporterede SH-grad klampes til minimum av 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 vid ekstremt store skyer. Filen skrives atomisk, vilket vid store skyer kortvarigt optager dobbelt diskplads.
E2 — Compressed PLY (.ply)
VAR
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.
TEKNISKT
PlayCanvas-varianten av 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ärden relativt til dessa 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 därför 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)
VAR
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.
TEKNISKT
Niantics SPZ-v2-format. Positioner pakkes som 24-bit-fixed-point (det giver ca. 0,25 mm upplösning), skaler som 8-bit-kvantisering i log-rum, rotationer som 8-bit-smallest-three (i v2 gemmes kun xyz, w afledes i decoderen av quaternion-normen), opaciteter som sigmoideret 8-bit-värden. 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 därefter med standard-gzip (RFC 1952), vilket 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 inte ville være kompatibel med SPZ-readerne i Spatial Fields eller MetalSplatter. System-gzip kan stadig spawnes inden for macOS-sandboxen.
E4 — SOG (.sog)
VAR
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.
TEKNISKT
„Spatially Ordered Gaussians" — et PlayCanvas-format, der gemmer skyen GPU-ready i flere lossless-WebP-bilder. Først sorteres alle gaussians rumligt via 3D-Morton-code (30-bit Z-order, 10 bit pr. akse), vilket giver bilderna senere cache-lokalitet i rendereren. Så kvantiseres positioner med symmetrisk log-transformation (for bedre dynamikomfang) til 16-bit-värden og splittes i to RGBA-bilder (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-bild (mode lander i alpha som 252 + largest). Skaler og DC-SH kvantiseres hver med en 256-indgangs-codebook (percentil-baserat fordelt over alle värden), indekserne lander i scales.webp og sh0.webp. De fem bilder 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 är 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. Om ingen cwebp-binary finns, falder koden tilbage på rå PNG-encoding — men: PNG-fallback fungerer inte i SuperSplat. I App Store-versionen evaluér tilgængeligheden ud fra build-varianten; i developer-varianten ska cwebp være installeret via Homebrew (brew install webp).
E5 — glTF (.glb)
VAR
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).
TEKNISKT
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 därför 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 (inte spejlvendt) gengivelse i glTF-viewere. JSON- og binærchunks paddes til 4-byte-alignment, som GLB-standarden kræver.
E6 — Splat (.splat)
VAR
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.
TEKNISKT
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 vid 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 Hittar vid 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-kamerorna, valgfrit indkoblelige. Mus-træk roterer, scroll zoomer.E7 — Web Viewer (.html)
VAR
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+).
TEKNISKT
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), därefter base64-indlejret, därefter 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 också direkte fra file://-protokollen — ingen lokal webserver nødvendig til test.

E8 — Orbit Video (.mp4/.mov)
VAR
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 av varighed, upplösning, bitrate. Kompatibel med: alle platforme (H.264 og HEVC er Apple-standard).
TEKNISKT
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 av rendereren for at dreje de interne koordinater ind i Y-up-orbit-verdenen) med kameraet, därefter 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 upplö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 — vid 8K og millioner av 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)
VAR
Menulinjen → Export → Photogrammetry → Export SfM (transforms.json)…. Størrelse: typiskt 1–10 KB (kun positioner + intrinsics, ingen bilder, ingen gaussians). Kompatibel med: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, alle moderne feed-forward 3DGS-trænere.
TEKNISKT
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), därefter 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 av 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 om eksportøren genkender flere olika intrinsics-sæt, så skrives de pr. frame. Billedstier skrives som images/<filename> relativt til JSON-filen; brugeren ska oprette en sibling-images/-mappe med træningsfotoene.
E10 — COLMAP Workspace (sparse/0/)
VAR
Menulinjen → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Størrelse: tre binærfiler sammen typiskt 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.
TEKNISKT
Skriver standard-COLMAP-sparse/0/-layoutet med tre binære filer: cameras.bin, images.bin, points3D.bin. Format-reference är den officielle COLMAP-dokumentation. cameras.bin innehåller 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. bild positionen som wxyz-quaternion plus translation, efterfulgt av kamera-ID og filnavn; ingen 2D-3D-korrespondancer gemmes. points3D.bin innehåller SfM-punktskyen med position, farve (0-255 RGB) og default-värden 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 vid SH-grad 3. Reelle värden varierer alt efter scenens komprimerbarhed; SH-grad 0 reducerer PLY/glTF med faktor 4.