Luku 8 — Vientimuodot


Mitä kuvassa näkyy (2 991 gaussia, SH-aste 3, synteettinen Blender-kimppu IP-puhtaana testijoukkona): Kokotiedot jokaisen muotokortin alla lasketaan livenä nykyisestä gaussien määrästä ja muoto-overheadista — ei kovakoodattua. 2 991 gaussista (SH-aste 3) syntyy näin 742 KB PLY, 74 KB SPZ (kerroin ~10× pienempi kvantisoinnin ansiosta), 708 KB glTF (mukana KHR_gaussian_splatting-laajennus, siten lähes PLY-vastaava), 96 KB .splat (pakattu 24-tavua-per-gaussi-muoto). Orbit Video näyttää „~Zero KB", koska koko tunnetaan vasta MP4-koodauksen jälkeen. Web Viewer (133 KB) niputtaa itsenäisen HTML-tiedoston upotetun WebGL-katsojan ja pakattujen splat-tietojen kanssa — suurempi kuin pelkkä .splat katsojan overheadin vuoksi. Vientihistoria oikealla listaa jo suoritetun PLY-viennin („training_20260527T211321Z.ply, 743 KB, 23:13") muotokyltillä ja näytä Finderissä -toiminnolla.
Päättynyt koulutus tuottaa gaussipilven — kokoelman muutamasta sadasta tuhannesta miljoonaan 3D-gaussijakaumasta, jotka yhdessä rekonstruoivat näkymän. RadianceKit tuntee kymmenen tapaa kirjoittaa tämä pilvi kovalevylle. Kuusi niistä on puhtaita 3D-tietomuotoja (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), yksi niputtaa pilven yhdessä valmiin HTML-katsojan kanssa (Web Viewer), yksi renderöi MP4-tiedoston orbit-kamera-ajosta (Orbit Video), ja kaksi vie SfM-tuloksen (kameran sijainnit ja karkea pistepilvi) eikä gaussisisältöä uudelleenkäyttöön muissa koulutusputkissa (transforms.json + COLMAP-Workspace).
Mikä muoto on milloin oikea, riippuu tavoitteesta. Täyden tietojen arkistointiin ilman laadunmenetystä otetaan PLY. Verkkokatsojiin omalla sivustolla riittää useimmiten .splat tai sisäänrakennettu Web-katsoja. Jos tiedoston on oltava mahdollisimman pieni, kannattaa SPZ tai SOG. SfM-tuloksen uudelleenkäyttöön Nerfstudiossa, Postshotissa tai Brushissa transforms.json ja COLMAP-Workspace ovat oikeat tavat.
Kaikki vientitoiminnot ovat „Export"-valikossa sekä aloittelijatilan viimeisellä ohjatun toiminnon vaiheella. Useimmat muodot ovat täysin sandbox-yhteensopivia ja toimivat App Store -versiossa. Vain SOG vaatii ulkoisen binäärin (cwebp), joka ei välttämättä ole saatavilla App Store -versiossa — yksityiskohdat katso E4.
E1 — PLY (.ply)
MISSÄ
Valikkorivi → Export → 3D Formats → Export PLY… (⌘E). Aloittelijatila: Ohjatun toiminnon vaihe Vienti → Muotokortti „PLY". Koko: tyypillisesti 100 % (vertailuarvo). Yhteensopiva: SuperSplat, PolyCam, kaikki 3DGS-katsojat.
TEKNINEN
PLY on kanoninen tallennusmuoto 3D Gaussian Splattingille. RadianceKit kirjoittaa binäärisen little-endian-tiedoston standardoidulla 3DGS-property-asettelulla: per gaussi kolmikomponenttinen sijainti, kolme aina nollaksi asetettua normaalia, kolme DC-SH-kerrointa (f_dc_0..2) RGB-perusvärille, sen jälkeen enintään 45 muuta SH-kerrointa (f_rest_0..44) Kerbl-2023-paperin määrittelemässä transponoidussa kanavajärjestyksessä (ensin kaikki R-kanavan kertoimet, sitten kaikki G, sitten kaikki B), seuraavaksi logit-läpinäkymättömyys (raa'at pre-sigmoid-arvot), kolme log-asteikon skaalaa ja wxyz-quaternion-rotaatio. Maksimi vietävä SH-aste rajoitetaan käyttäjän toiveen ja todellisesti opitun asteen minimiin; oletus on 3 (45 rest-kerrointa). Ennen kirjoittamista hyötykuorman koko lasketaan 64-bittisinä kokonaislukuina ylivuotojen nappaamiseksi erittäin suurilla pilvillä. Tiedosto kirjoitetaan atomisesti, mikä varaa suurilla pilvillä lyhyesti kaksinkertaisen levytilan.
E2 — Compressed PLY (.ply)
MISSÄ
Valikkorivi → Export → 3D Formats → Export Compressed PLY…. Aloittelijatila: Muotokortti „Compressed PLY". Koko: noin 10–20 % PLY:hen nähden (5- 10-kertainen pakkaus). Yhteensopiva: SuperSplat, PlayCanvas-Engine, verkkopohjaiset katsojat.
TEKNINEN
PlayCanvas-variantti PLY-muodosta chunked-kvantisoinnilla. Gaussit ryhmitellään 256:n chunkkeihin. Per chunk min/max-rajat sijainnille, skaalalle ja värille tallennetaan erikseen otsikkoon; yksittäiset gaussit viittaavat arvoihinsa suhteessa näihin rajoihin ja pakataan kukin 32 bittiin: sijainti ja skaala 11-10-11-bit-pakkauksella, rotaatio 2-10-10-10-bit „Smallest-Three"-kvaternionina, väri 8-8-8-8-RGBA:na. Korkeammat SH-kertoimet kvantisoidaan vain 8 bittiä per komponentti (shCoeffCount * 3 uchar per gaussi). Muoto itse on edelleen ASCII-otsikko-PLY ja siten periaatteessa validoitavissa PLY-työkaluilla, mutta vertex-propertyt on määritelty uint-kentiksi. SH-aste on oletuksena 0 (ei rest-kertoimia) pakkauksen maksimoimiseksi — korkeampia SH-asteita voi valita eksplisiittisesti.
E3 — SPZ (.spz)
MISSÄ
Valikkorivi → Export → 3D Formats → Export SPZ…. Aloittelijatila: Muotokortti „SPZ". Koko: noin 10 % PLY:hen nähden (90 % pienempi). Yhteensopiva: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TEKNINEN
Nianticin SPZ-v2-muoto. Sijainnit pakataan 24-bit-fixed-point-arvoina (tämä antaa noin 0,25 mm resoluution), skaalat 8-bit-kvantisointina log-tilassa, rotaatiot 8-bit-Smallest-Three:na (v2:ssa vain xyz tallennetaan, w johdetaan dekooderissa kvaternionin normista), läpinäkymättömyydet sigmoidoituina 8-bit-arvoina. DC-SH tallennetaan SPZ-spesifisellä pakkauskaavalla (dc_raw * 0.15 * 255 + 0.5 * 255), korkeammat SH-vyöhykkeet 5 bitillä (vyöhyke 1) tai 4 bitillä (vyöhyke 2-3) per kerroin. Koko pakattu binääriblobi pakataan sen jälkeen standardilla gzip:llä (RFC 1952), mikä antaa gzipped-säilömuodon, jonka maagiset tavut ovat 1f 8b. RadianceKit kutsuu tätä varten järjestelmän gzip:iä, koska Applen sisäänrakennettu zlib-API tuottaa Applen omaa kehystystä, joka ei olisi yhteensopiva Spatial Fieldsin tai MetalSplatterin SPZ-lukijoiden kanssa. Järjestelmän gzip jää käynnistettäväksi myös macOS-sandboxin sisällä.
E4 — SOG (.sog)
MISSÄ
Valikkorivi → Export → 3D Formats → Export SOG…. Aloittelijatila: Muotokortti „SOG". Koko: noin 5–6 % PLY:hen nähden (15- 20-kertainen pakkaus — pienin vaihtoehto). Yhteensopiva: PlayCanvas-Engine, SuperSplat-editori.
TEKNINEN
„Spatially Ordered Gaussians" — PlayCanvas-muoto, joka tallentaa pilven GPU-valmiina useissa häviöttömissä WebP-kuvissa. Ensin kaikki gaussit lajitellaan spatiaalisesti 3D-Morton-koodilla (30-bit Z-order, 10 bittiä per akseli), mikä tuo kuville myöhempää cache-paikallisuutta renderöijässä. Sitten sijainnit kvantisoidaan symmetrisellä log-muunnoksella (paremman dynaamisen alueen vuoksi) 16-bittisiksi arvoiksi ja jaetaan kahteen RGBA-kuvaan (means_l.webp alemmille 8 bitille, means_u.webp ylemmille). Rotaatiot koodataan Smallest-Three:na 3×8-bittisinä plus 2-bit-tilana yhdessä RGBA-kuvassa (tila menee alfaan muodossa 252 + largest). Skaalat ja DC-SH kvantisoidaan kukin 256-merkkijonoisella koodikirjalla (prosenttiperusteinen kaikkien arvojen yli), indeksit menevät scales.webp:hen ja sh0.webp:hen. Viisi kuvaa plus meta.json, jossa koodikirjat ja rajat, paketoidaan ZIP-tiedostoon (oma kooderi, koska sandbox estää järjestelmän zip:in) ja tallennetaan päätteellä .sog.
Huomio sandbox: SOG on ainoa muotovaihtoehto, joka vaatii ulkoisen binäärin. WebP-kooderivaihe kutsuu cwebp:tä osoitteesta /usr/local/bin/cwebp tai /opt/homebrew/bin/cwebp. Jos cwebp-binääriä ei löydy, koodi siirtyy raakaan PNG-koodaukseen — mutta: PNG-fallback ei toimi SuperSplatissa. App Store -versiossa arvioi saatavuus build-variantin perusteella; developer-versiossa cwebp tulee asentaa Homebrew'n kautta (brew install webp).
E5 — glTF (.glb)
MISSÄ
Valikkorivi → Export → 3D Formats → Export glTF…. Aloittelijatila: Muotokortti „glTF". Koko: verrattavissa PLY:hen. Yhteensopiva: glTF-katsojat, joilla KHR_gaussian_splatting-laajennus (Khronos-Draft-standardi).
TEKNINEN
Kirjoittaa itsensäsisältävän .glb-binääritiedoston (ei erillistä bin-tiedostoliitettä) KHR_gaussian_splatting-laajennusspesifikaation mukaisesti. Sijainnit tallennetaan tavallisina glTF-POSITION-vertex-tietoina (float3), kaikki muut attribuutit (rotaatio float4:nä, skaala float3:na, läpinäkymättömyys floatina, SH-kertoimet float3 × shCoeffCount:nä) ovat lisävertex- attribuuteissa ja viitataan laajennuksen kautta. Tärkeää: glTF käyttää oikeakätistä Y-up-koordinaatistoa, COLMAP/3DGS toimii Y-down/Z-forward. Vientijä soveltaa siksi 180 asteen kiertoa X-akselin ympäri — sijainnit kirjoitetaan uudelleen muotoon (x, -y, -z), kvaterniot sovitetaan muotoon (w, x, -y, -z). Tämä antaa geometrisesti oikean, kätisen (ei peilatun) esityksen glTF-katsojissa. JSON- ja binääripätkät pehmustetaan 4-tavun kohdistukseen GLB-standardin vaatimusten mukaisesti.
E6 — Splat (.splat)
MISSÄ
Valikkorivi → Export → 3D Formats → Export .splat…. Aloittelijatila: Muotokortti „.splat". Koko: tarkalleen 32 tavua per gaussi. Yhteensopiva: gsplat.js, verkkopohjaiset katsojat (antimatter15-viite), useimmat selain-3DGS-demot.
TEKNINEN
Antimatter15-.splat-muoto — 32 tavua per gaussi, ei otsikkoa, ei epäsuoraa viittausta. Asettelu per merkintä: 3 × float32 sijainti (maailmankoordinaatit), 3 × float32 skaala (exp-muunnettuna sisäisen puskurin log-tilasta), 4 × uint8 RGBA-väri (DC-SH-kerroin skaalattu SH_C0 = 0.282...:lla ja rajattu [0,255]:een), 4 × uint8 kvaternio (w,x,y,z, normalisoitu ja koodattu muotoon 128 + 128*q tavu-alueeseen). Vain DC-SH tallennetaan — korkeammat SH-vyöhykkeet hylätään. Tämä tekee muodosta erittäin kompaktin, mutta maksaa näkymäriippuvaiset värimuutokset, jotka esiintyvät heijastuksissa tai spekuloissa korostuksissa. Kirjoitusjärjestys on tarkalleen pilven indeksijärjestys (ei spatiaalista lajittelua), verkkokatsojat kuten gsplat.js renderöivät sen pohjalta.

flowers-01.html avattu suoraan Finderistä kaksoisklikkauksella oletusselaimessa — upotettu WebGL2-ohjelma renderoi gaussipilven heti, ilman verkkoa tai palvelinta. Mustat merkit kimpun ympärillä ovat koulutuskamerat, valinnaisesti näytettävissä. Hiiren veto kiertää, vieritys zoomaa.E7 — Web Viewer (.html)
MISSÄ
Valikkorivi → Export → Media → Export Web Viewer…. Aloittelijatila: Muotokortti „Web Viewer". Koko: Splat-tiedot base64-koodattuina (≈ 4/3 overhead) + noin 5 KB HTML/JS-kuori. Yhteensopiva: mikä tahansa moderni selain WebGL2:lla (kaikki työpöydät, iOS 15+, Android 5+).
TEKNINEN
Niputtaa gaussipilven yhdessä täysin inline kirjoitetun WebGL2-renderöijän kanssa yhteen .html-tiedostoon. Ei ole CDN-riippuvuuksia, ei WASM:ää, ei toista tiedostoa. Pilvi koodataan ensin sisäisesti .splat-binääriksi (sama 32-tavu-logiikka kuin E6), sitten base64-upotettuna, sitten dekoodattuna selaimessa atob:lla. Sisäänrakennettu renderöijä tekee oman WebGL2-lajittelun, hiiri-orbit-ohjauksen ja CPU-lajittelun per ruutu; koko JS-koodi (shader, matematiikka, silmukka) on nähtävissä output-HTML:ssä. Akselikonventio tallennus-renderöijä-rajalla on tarkalleen sama kuin E5:ssä: sijainti (x, -y, -z), kvaternio (w, x, -y, -z). Valinnaisesti voi näyttää brändäysoverlayn (Free-Tier-kytkin). Koska kaikki on inline, tiedosto toimii myös suoraan file://-protokollasta — ei paikallista web-palvelinta tarvita testaamiseen.

E8 — Orbit Video (.mp4/.mov)
MISSÄ
Valikkorivi → Viewport → Record Turntable Video TAI Valikkorivi → Export → Media → Export Orbit Video…. Aloittelijatila: Muotokortti „Orbit Video" kestoliukukytkimellä 3–30 s. Koko: riippuu kestosta, resoluutiosta, bitratesta. Yhteensopiva: kaikki alustat (H.264 ja HEVC ovat Apple-standardia).
TEKNINEN
Renderöi gaussipilven parametrista orbit-kameraajoa pitkin ja koodaa jokaisen ruudun AVAssetWriterin kautta MP4- tai MOV-tiedostoksi. Orbit-kokoonpano ohjaa pyörintätaajuutta (kierrokset), etäisyyttä, elevaatiota, FOV:ia, kestoa ja ease-in/out-kerrointa. Per ruutu maailman sovitusmatriisi (renderöijän laskema, jotta sisäiset koordinaatit kiertyvät Y-up-orbit-maailmaan) kerrotaan kameralla, jonka jälkeen sovelletaan MetalSplatter-spesifistä Y-peilausta. Offscreen-renderöintikohde vedetään IOSurfacen kautta CVPixelBufferiksi kooderille. Kooderi tukee H.264:ää ja HEVC:tä, säädettävää bitratea ja resoluutiota 480p:stä 8K:hon. Ennen ensimmäistä ruutua renderöijä odottaa 200 ms, jotta alkuperäinen splat-lajittelu on valmis. Tämä vienti on GPU-sidonnainen — 8K:lla ja miljoonilla gausseilla renderöintiaika per ruutu on useita sekunteja, eli kokonaisrenderöintiajat 10–30 minuuttia 6 s:n videolle ovat mahdollisia.
E9 — SfM Transforms (transforms.json)
MISSÄ
Valikkorivi → Export → Photogrammetry → Export SfM (transforms.json)…. Koko: tyypillisesti 1–10 KB (vain sijainnit + intrinsics, ei kuvia, ei gausseja). Yhteensopiva: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, kaikki modernit feed-forward 3DGS-kouluttajat.
TEKNINEN
Kirjoittaa nerfstudio-transforms.json-muodon kameran sijaintien listalla plus jaetuilla intrinsicsillä. Per kamera view-matriisi (RadianceKitin sisäinen: World-to-Camera COLMAP-konventiossa) käännetään, sen jälkeen kameran paikalliset Y- ja Z-perusvektorit peilataan, jotta päästään nerfstudio-konventioon (OpenGL-tyyli, kamera katsoo -Z:n suuntaan, +Y on ylöspäin). Lopullinen 4×4-matriisi päätyy row-major sisäkkäisenä doubles-taulukkona transform_matrix-kenttään jokaiseen frameen. Intrinsics tallennetaan top-tasolla (polttoväli x/y, päätelma x/y, kuvan leveys/korkeus, camera_model = "OPENCV", plus distortion-kertoimet k1, k2, p1, p2) — paitsi jos vientijä tunnistaa useita erilaisia intrinsics-sarjoja, jolloin ne kirjoitetaan per frame. Kuvapolut kirjoitetaan muodossa images/<filename> suhteessa JSON-tiedostoon; käyttäjän on luotava sisaruskansio images/ koulutusvalokuvilla.
E10 — COLMAP Workspace (sparse/0/)
MISSÄ
Valikkorivi → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Koko: kolme binääritiedostoa yhdessä tyypillisesti 4–8 MB — points3D.bin hallitsee (yksi rivi per sparse-pilven 3D-piste), images.bin ja cameras.bin ovat kumpikin selvästi alle 100 KB. Yhteensopiva: COLMAP itse, Nerfstudio, Postshot, Meshroom, kaikki työkalut, jotka odottavat COLMAP-sparse/-hakemistoa.
TEKNINEN
Kirjoittaa standardin COLMAP-sparse/0/-asettelun kolmella binääritiedostolla: cameras.bin, images.bin, points3D.bin. Muoto-viite on virallinen COLMAP-dokumentaatio. cameras.bin sisältää deduplikoidun intrinsics-listan (kamerat, joilla identtiset intrinsics + kuvakoko, yhdistetään yhteen merkintään); käytetty kameramalli on OPENCV (malli 4), fx/fy/cx/cy:llä plus neljällä distortion-kertoimella k1/k2/p1/p2. images.bin listaa per kuva sijainnin wxyz-kvaterniona plus translaation, seurattuna kamera-ID:llä ja tiedostonimellä; ei 2D-3D-vastaavuuksia tallenneta. points3D.bin sisältää SfM-pistepilven, jossa sijainti, väri (0-255 RGB) ja oletusarvot reprojisoinnille ja jäljen pituudelle. Kaikki kirjoitetaan little-endianina. Uudelleentuonti RadianceKitiin toimii File-valikon kautta → „Import COLMAP/Metashape Workspace…" (katso Q3 SfM-taustaohjelmaluvussa).
Mikä muoto milloin?
| Tavoite | Muoto |
|---|---|
| Verkkokatsoja omalla sivulla | E7 Web Viewer (.html) |
Verkkokatsoja gsplat.js:llä | E6 Splat (.splat) |
| Putken uudelleenkäyttö Postshotissa / Nerfstudiossa | E9 transforms.json + E10 COLMAP Workspace |
| SuperSplat-muokkaus | E1 PLY tai E2 Compressed PLY |
| Niantic Scaniverse / Spatial Fields | E3 SPZ |
| Maksimaalinen pakkaus | E4 SOG (cwebp vaaditaan) |
| Markkinointi-/sosiaalinen video | E8 Orbit Video |
Nopea vertailu
| Muoto | Pääte | Sandbox | Koko (1M gaussia) | Paras käyttö |
|---|---|---|---|---|
| E1 PLY | .ply | kyllä | ~250 MB | Arkisto, korkein yhteensopivuus |
| E2 Compressed PLY | .ply | kyllä | ~40 MB | Verkko + SuperSplat |
| E3 SPZ | .spz | kyllä (gzip-spawn) | ~40 MB | Niantic + mobiili |
| E4 SOG | .sog | ehdollinen (cwebp) | ~20 MB | Maksimaalinen pakkaus |
| E5 glTF | .glb | kyllä | ~250 MB | Khronos-putki |
| E6 Splat | .splat | kyllä | ~32 MB | gsplat.js verkkokatsoja |
| E7 Web Viewer | .html | kyllä | ~45 MB | Itsenäinen selaintiedosto |
| E8 Orbit Video | .mp4/.mov | kyllä | vaihtelee | Sosiaalinen/markkinointi |
| E9 SfM Transforms | .json | kyllä | ~5 KB | Sijaintien siirto |
| E10 COLMAP Workspace | hakemisto | kyllä | ~4–8 MB | Sijaintien siirto binäärinä |
Koko-sarake on karkea ohjearvo 1 milj. gaussille SH-asteella 3. Todelliset arvot vaihtelevat näkymän pakattavuuden mukaan; SH-aste 0 pienentää PLY/glTF kertoimella 4.