Kapitel 8 — Exportformat


Vad man ser på bilden: Storleksangivelsen under varje formatruta beräknas i realtid utifrån det aktuella antalet Gaussians och formatets overhead — inte hårdkodad. Från samma scen blir det alltså 2,2 MB PLY, 142 KB cPLY, 89 KB SOG, 216 KB SPZ, 2,1 MB glTF och 279 KB .splat; Web hamnar på 378 KB eftersom visaren ligger inbäddad i filen där. Video och Wiggle visar „0 KB", eftersom storleken först är känd efter kodningen. Den valda rutan är blåmarkerad, och knappen nedanför tar över dess namn — här „Export PLY (3DGS Standard)". Under rubriken står raden „Leveling the floor turns the view at once; the chosen orientation and format apply when saving".
En avslutad träning ger ett Gaussian-moln — en samling av allt från några hundra tusen upp till miljoner 3D-gaussfördelningar som tillsammans rekonstruerar scenen. Det här kapitlet beskriver tio sätt att skriva det här molnet till hårddisken. Sex av dem är rena 3D-dataformat (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), ett paketerar molnet tillsammans med en färdig HTML-visare (Web Viewer), ett renderar en MP4-fil från en orbit-kamerafart (Orbit Video), och två exporterar inget Gaussian-innehåll utan bara SfM-resultatet (kamerapositioner och grov punktmoln) för återanvändning i andra tränings-pipelines (transforms.json + COLMAP-Workspace).
Åtta av dessa vägar finns tillgängliga i exportsektionen som rutor — transforms.json och COLMAP-Workspace finns bara i menyn. Dessutom innehåller rutnätet en nionde ruta Wiggle, och under exportknappen står Upload to SuperSplat…, som skickar scenen direkt till SuperSplat-editorn på nätet istället för till en fil.
Vilket format som är rätt beror på ändamålet. För arkivering av fulla data utan kvalitetsförlust tar man PLY. För webbvisare på egen sida räcker oftast .splat eller den inbyggda webbvisaren. Om filen måste vara minimal lönar det sig med SPZ eller SOG. För återanvändning av SfM-resultatet i Nerfstudio, Postshot eller Brush är transforms.json och COLMAP-Workspace de rätta vägarna.
Alla exportfunktioner finns i menyn „Export" samt i Simple-läget på det sista guidesteget. De flesta format är helt sandlåde-kompatibla och fungerar i App Store-versionen. Endast SOG kräver en extern binär (cwebp), som inte nödvändigtvis finns med i App Store-bygget — se detaljer i E4.
E1 — PLY (.ply)
VAR
Menyrad → Export → 3D Formats → Export PLY… (⌘E). Simple-läge: guidesteget Export → formatkortet „PLY". Storlek: typiskt 100 % (referensvärde). Kompatibel med: SuperSplat, PolyCam, alla 3DGS-visare.
TEKNISKT
PLY är det kanoniska lagringsformatet för 3D Gaussian Splatting. RadianceKit skriver en binär little-endian-fil med den standardiserade 3DGS-egenskapslayouten: per Gaussian en position med tre komponenter, tre normaler som alltid är nollställda, tre DC-SH-koefficienter (f_dc_0..2) för basfärgen i RGB, följt av upp till 45 ytterligare SH-koefficienter (f_rest_0..44) i den transponerade channel-major-ordningen som definieras i Kerbl-2023-artikeln (först alla R-kanal-koefficienter, sedan alla G, sedan alla B), följt av logit-opacitet (råa pre-sigmoid-värden), tre log-space-skalor och en wxyz-kvaternionrotation. Den maximalt exporterade SH-graden clampas till minimum av användarens önskemål och den faktiskt inlärda graden; standard är 3 (45 rest-koefficienter). Innan skrivningen beräknas payload-storleken som en 64-bitars heltalssumma för att fånga överflöd vid extremt stora moln. Filen skrivs atomärt, vilket vid stora moln tillfälligt tar upp dubbel diskutrymme.
E2 — Compressed PLY (.ply)
VAR
Menyrad → Export → 3D Formats → Export Compressed PLY…. Simple-läge: formatkortet „Compressed PLY". Storlek: ca 10–20 % jämfört med PLY (5- till 10-faldig komprimering). Kompatibel med: SuperSplat, PlayCanvas-motorn, webbaserade visare.
TEKNISKT
PlayCanvas-varianten av PLY-formatet med chunkad kvantisering. Gaussians grupperas i chunkar om 256. Per chunk lagras min/max-gränser för position, skala och färg separat i huvudet; de enskilda Gaussianerna refererar till sina värden relativt till dessa gränser och komprimeras till 32 bitar vardera: position och skala med 11-10-11-bitars packning, rotation som en 2-10-10-10-bitars „smallest-three"-kvaternion, färg som 8-8-8-8-RGBA. Högre SH-koefficienter kvantiseras med endast 8 bitar per komponent (tre byte per koefficient och Gaussian). Formatet i sig är fortfarande ASCII-header-PLY och därmed i grunden validerbart med PLY-verktyg, men vertex-egenskaperna är deklarerade som uint-fält. SH-graden är per standard 0 (inga rest-koefficienter) för att maximera komprimeringen — högre SH-grader kan väljas explicit.
E3 — SPZ (.spz)
VAR
Menyrad → Export → 3D Formats → Export SPZ…. Simple-läge: formatkortet „SPZ". Storlek: ca 10 % jämfört med PLY (90 % mindre). Kompatibel med: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TEKNISKT
Niantics SPZ v2-format. Positioner packas som 24-bitars fixed-point (vilket ger ca 0,25 mm upplösning), skalor som 8-bitars kvantisering i log-rymden, rotationer som 8-bitars smallest-three (i v2 lagras bara xyz, w härleds i avkodaren från kvaternionnormen), opaciteter som sigmoidiserade 8-bitars värden. DC-SH lagras med en SPZ-specifik packningsformel (dc_raw * 0.15 * 255 + 0.5 * 255), högre SH-band med 5 bitar (band 1) respektive 4 bitar (band 2–3) per koefficient. Hela den packade binärblobben komprimeras därefter med standard-gzip (RFC 1952), vilket ger ett gzippat containerformat med magiska byte 1f 8b. RadianceKit anropar system-gzip för detta, eftersom Apples inbyggda zlib-API genererar en proprietär Apple-inramning, vilket inte skulle vara kompatibelt med SPZ-läsarna i Spatial Fields eller MetalSplatter. System-gzip går fortfarande att starta inom macOS-sandlådan.
E4 — SOG (.sog)
VAR
Menyrad → Export → 3D Formats → Export SOG…. Simple-läge: formatkortet „SOG". Storlek: ca 5–6 % jämfört med PLY (15- till 20-faldig komprimering — det minsta alternativet). Kompatibel med: PlayCanvas-motorn, SuperSplat-editorn.
TEKNISKT
„Spatially Ordered Gaussians" — ett PlayCanvas-format som lagrar molnet GPU-redo i flera förlustfria WebP-bilder. Först sorteras alla Gaussians rumsligt med 3D-Morton-kod (30-bitars Z-order, 10 bitar per axel), vilket ger bilderna bättre cache-lokalitet senare i rendereraren. Sedan kvantiseras positioner med symmetrisk log-transform (för bättre dynamikomfång) till 16-bitars värden och delas upp i två RGBA-bilder (means_l.webp för de nedre 8 bitarna, means_u.webp för de övre). Rotationer kodas som smallest-three med 3×8 bitar plus 2-bitars mode i en RGBA-bild (mode hamnar i alfa som 252 + largest). Skalor och DC-SH kvantiseras med varsin kodbok med 256 poster (percentilbaserat fördelad över alla värden), indexen hamnar i scales.webp och sh0.webp. De fem bilderna plus en meta.json med kodböcker och gränser packas i en ZIP-fil (egen kodare, eftersom sandlådan blockerar system-zip) och sparas med filändelsen .sog.
Obs, sandlåda: SOG är det enda formatalternativ som kräver en extern binär. WebP-kodningssteget anropar cwebp från /usr/local/bin/cwebp eller /opt/homebrew/bin/cwebp. Om ingen cwebp-binär hittas, faller koden tillbaka till rå PNG-kodning — men: PNG-fallback fungerar inte i SuperSplat. I App Store-versionen utvärderas tillgängligheten utifrån byggvarianten; i utvecklarversionen måste cwebp installeras via Homebrew (brew install webp).
E5 — glTF (.glb)
VAR
Menyrad → Export → 3D Formats → Export glTF…. Simple-läge: formatkortet „glTF". Storlek: jämförbar med PLY. Kompatibel med: glTF-visare med KHR_gaussian_splatting-tillägget (Khronos-utkaststandard).
TEKNISKT
Skriver en självbärande .glb-binärfil (ingen separat bin-filbilaga) enligt KHR_gaussian_splatting-tilläggsspecifikationen. Positioner lagras som vanliga glTF-POSITION-vertex-data (float3), alla andra attribut (rotation som float4, skala som float3, opacitet som float, SH-koefficienter som float3 × shCoeffCount) ligger i ytterligare vertex-attribut och refereras via tillägget. Viktigt: glTF använder ett högerhänt Y-upp-koordinatsystem, COLMAP/3DGS arbetar med Y-ner/Z-framåt. Exportören tillämpar därför en 180-graders rotation runt X-axeln — positioner skrivs om med (x, -y, -z), kvaternioner anpassas till (w, x, -y, -z). Detta ger en geometriskt korrekt, händig (icke-spegelvänd) representation i glTF-visare. JSON- och binärchunkar paddas till 4-byte-alignment, enligt vad GLB-standarden kräver.
E6 — Splat (.splat)
VAR
Menyrad → Export → 3D Formats → Export .splat…. Simple-läge: formatkortet „.splat". Storlek: exakt 32 byte per Gaussian. Kompatibel med: gsplat.js, webbaserade visare (antimatter15-referens), de flesta webbläsarbaserade 3DGS-demos.
TEKNISKT
Antimatter15-.splat-formatet — 32 byte per Gaussian, ingen header, ingen indirektion. Layout per post: 3 × float32 position (världskoordinater), 3 × float32 skala (exp-transformerad från log-rymden i den interna bufferten), 4 × uint8 RGBA-färg (DC-SH-koefficienten skalad med SH_C0 = 0.282... och clampad till [0,255]), 4 × uint8 kvaternion (w,x,y,z, normaliserad och kodad till bytintervallet som 128 + 128*q). Bara DC-SH lagras — högre SH-band kastas bort. Det gör formatet extremt kompakt, men kostar de vinkelberoende färgändringar som uppstår vid reflektioner eller specular highlights. Skrivordningen följer exakt indexordningen i molnet (ingen rumslig sortering), webbvisare som gsplat.js renderar utifrån det.

flowers-01.html öppnad direkt från Finder med dubbelklick i standardwebbläsaren — det inbäddade WebGL2-programmet renderar Gaussian-molnet omedelbart, utan nätverk eller server. De svarta markörerna runt buketten är träningskamerorna, som kan visas valfritt. Musdrag roterar, scroll zoomar.E7 — Web Viewer (.html)
VAR
Menyrad → Export → Media → Export Web Viewer…. Simple-läge: formatkortet „Web Viewer". Storlek: splat-data base64-kodade (≈ 4/3 overhead) + ca 5 KB HTML/JS-skal. Kompatibel med: alla moderna webbläsare med WebGL2 (alla stationära, iOS 15+, Android 5+).
TEKNISKT
Paketerar Gaussian-molnet tillsammans med en helt inline skriven WebGL2-renderare i en enda .html-fil. Det finns inga CDN-beroenden, inget WASM, ingen andra fil. Molnet kodas internt först som en .splat-binärfil (samma 32-byte-logik som E6), sedan base64-inbäddad, sedan avkodad i webbläsaren med atob. Den inbyggda rendereraren gör egen WebGL2-sortering, musorbitkontroll och CPU-sortering per bildruta; hela JS-koden (shaders, matematik, loop) syns i utgivna HTML:en. Axelkonventionen vid gränsen mellan lagring och renderare är exakt densamma som i E5: position (x, -y, -z), kvaternion (w, x, -y, -z). Valfritt kan ett brandingöverlägg visas (free-tier-brytare). Eftersom allt är inline fungerar filen även direkt från file://-protokollet — ingen lokal webbserver behövs för att testa.

E8 — Orbit Video (.mp4/.mov)
VAR
Menyrad → Viewport → Record Turntable Video ELLER Menyrad → Export → Media → Export Orbit Video…. Simple-läge: formatkortet „Orbit Video" med varaktighetsreglaget 3–30 s. Storlek: beroende av varaktighet, upplösning, bithastighet. Kompatibel med: alla plattformar (H.264 och HEVC är Apple-standard).
TEKNISKT
Renderar Gaussian-molnet längs en parametrisk orbit-kamerafart och kodar varje bildruta via AVAssetWriter till en MP4- eller MOV-fil. Orbit-konfigurationen styr rotationshastighet (varv), avstånd, elevation, FOV, varaktighet och ease-in/out-faktor. Orbit-video-exporten går genom RadianceKits EGET renderingssteg med full SH-utvärdering — pixel-identiskt med in-app-viewporten (WYSIWYG). Per bildruta multipliceras världsanpassningsmatrisen (beräknad av rendereraren för att rotera de interna koordinaterna till den Y-uppåt-orienterade orbit-världen) med kameran, och därefter tillämpas en kamerakonverteringsspegling (orbit-Y-upp → COLMAP-Y-ner). Offscreen-rendermålet dras via IOSurface till en CVPixelBuffer för kodaren. Kodaren stödjer H.264 och HEVC, konfigurerbar bithastighet och upplösning från 480p till 8K. Innan den första bildrutan väntar rendereraren 200 ms så att den initiala splatt-sorteringen hinner avslutas. Den här exporten är GPU-bunden — vid 8K och miljontals Gaussians ligger rendertiden per bildruta på flera sekunder, alltså är totala rendertider på 10–30 minuter för 6 s video möjliga.
E9 — SfM Transforms (transforms.json)
VAR
Menyrad → Export → Photogrammetry → Export SfM (transforms.json)…. Storlek: typiskt 1–10 KB (bara poser + intrinsics, inga bilder, inga Gaussians). Kompatibel med: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, alla moderna feed-forward-3DGS-tränare.
TEKNISKT
Skriver nerfstudio-transforms.json-formatet med en lista över kamerapositioner plus delade intrinsics. Per kamera inverteras vy-matrisen (RadianceKit-internt: world-to-camera i COLMAP-konvention), varefter de kameralokala Y- och Z-basvektorerna speglas för att konvertera till nerfstudio-konventionen (OpenGL-stil, kameran tittar längs -Z, +Y är upp). Den slutgiltiga 4×4-matrisen hamnar som en row-major nästlad array av doubles i transform_matrix-fältet för varje bildruta. Intrinsics lagras på toppnivå (brännvidd x/y, huvudpunkt x/y, bildbredd/-höjd, camera_model = "OPENCV", plus distortion-koefficienterna k1, k2, p1, p2) — utom när exportören upptäcker flera olika intrinsics-set, då skrivs de per bildruta. Bildsökvägar skrivs som images/<filename> relativt JSON-filen; användaren måste skapa en syskonmapp images/ med träningsfotona.
E10 — COLMAP Workspace (sparse/0/)
VAR
Menyrad → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Storlek: tre binärfiler tillsammans typiskt 4–8 MB — points3D.bin dominerar (en rad per 3D-punkt i det glesa molnet), images.bin och cameras.bin ligger var för sig långt under 100 KB. Kompatibel med: COLMAP självt, Nerfstudio, Postshot, Meshroom, alla verktyg som förväntar sig en COLMAP-sparse/-katalog.
TEKNISKT
Skriver standard-COLMAP-sparse/0/-layouten med tre binärfiler: cameras.bin, images.bin, points3D.bin. Formatreferens är den officiella COLMAP-dokumentationen. cameras.bin innehåller den deduplicerade intrinsics-listan (kameror med identiska intrinsics + bildstorlek slås samman till en enda post); den använda kameramodellen är OPENCV (modell 4), med fx/fy/cx/cy plus de fyra distortion-koefficienterna k1/k2/p1/p2. images.bin listar per bild posen som en wxyz-kvaternion plus translation, följt av kamera-ID och filnamn; inga 2D-3D-korrespondenser lagras. points3D.bin innehåller SfM-punktmolnet med position, färg (0–255 RGB) och standardvärden för reprojektion och spårlängd. Allt skrivs i little-endian. Återimport i RadianceKit fungerar via filmenyn → „Import COLMAP/Metashape Workspace…" (se Q3 i SfM-backend-kapitlet).
Vilket format när?
| Mål | Format |
|---|---|
| Webbvisare på egen sida | E7 Web Viewer (.html) |
Webbvisare med gsplat.js | E6 Splat (.splat) |
| Pipeline-återanvändning i Postshot / Nerfstudio | E9 transforms.json + E10 COLMAP Workspace |
| SuperSplat-redigering | E1 PLY eller E2 Compressed PLY |
| Niantic Scaniverse / Spatial Fields | E3 SPZ |
| Maximal komprimering | E4 SOG (cwebp krävs) |
| Marknadsförings-/socialt videoklipp | E8 Orbit Video |
| Fortsätt redigera scenen på nätet | Knappen „Upload to SuperSplat…" under formatrutnätet |
Snabbjämförelse
| Format | Filändelse | Sandbox | Storlek (1M Gauss) | Bäst för |
|---|---|---|---|---|
| E1 PLY | .ply | ja | ~250 MB | Arkiv, högsta kompatibilitet |
| E2 Compressed PLY | .ply | ja | ~40 MB | Webb + SuperSplat |
| E3 SPZ | .spz | ja (gzip-spawn) | ~40 MB | Niantic + mobil |
| E4 SOG | .sog | villkorat (cwebp) | ~20 MB | Maximal komprimering |
| E5 glTF | .glb | ja | ~250 MB | Khronos-pipeline |
| E6 Splat | .splat | ja | ~32 MB | gsplat.js webbvisare |
| E7 Web Viewer | .html | ja | ~45 MB | Fristående webbläsarfil |
| E8 Orbit Video | .mp4/.mov | ja | variabel | Sociala medier/marknadsföring |
| E9 SfM Transforms | .json | ja | ~5 KB | Posöverföring |
| E10 COLMAP Workspace | Katalog | ja | ~4–8 MB | Posöverföring binärt |
Kolumnen för storlek är ungefärliga riktvärden för 1 miljon Gaussians med SH-grad 3. Verkliga värden varierar beroende på hur komprimerbar scenen är; SH-grad 0 minskar PLY/glTF med en faktor 4.