Luku 8 — Vientimuodot


Mitä kuvassa näkyy: Jokaisen muotolaatan alla oleva kokotieto lasketaan reaaliaikaisesti nykyisestä Gaussien-määrästä ja muotokohtaisesta yleiskustannuksesta — ei kovakoodattuna. Samasta kohtauksesta syntyy näin 2,2 Mt PLY, 142 kt cPLY, 89 kt SOG, 216 kt SPZ, 2,1 Mt glTF ja 279 kt .splat; Web on 378 kt suurempi, koska siinä katseluohjelma on mukana samassa tiedostossa. Video ja Wiggle näyttävät „Zero KB", koska koko selviää vasta koodauksen jälkeen. Valittu laatta on sinireunainen, ja sen alla oleva painike ottaa sen nimen — tässä „Export PLY (3DGS Standard)". Otsikon alla lukee rivi „Leveling the floor turns the view at once; the chosen orientation and format apply when saving".
Valmis harjoitus tuottaa Gaussi-pilven — kokoelman muutamasta sadastatuhannesta miljooniin 3D-Gaussi-jakaumiin, jotka yhdessä rakentavat kohtauksen uudelleen. Tässä luvussa kuvataan kymmenen tapaa kirjoittaa tämä pilvi levylle. Kuusi niistä on puhtaita 3D-datamuotoja (PLY, Compressed PLY, SPZ, SOG, glTF, .splat), yksi niputtaa pilven yhteen valmiin HTML-katseluohjelman kanssa (Web Viewer), yksi renderöi MP4-tiedoston kiertävästä kamera-ajosta (Orbit Video), ja kaksi ei vie lainkaan Gaussi-sisältöä vaan ainoastaan SfM-tuloksen (kamera-asennot ja karkean pistepilven) uudelleenkäyttöä varten muissa harjoituspipelineissä (transforms.json + COLMAP-työtila).
Kahdeksan näistä tavoista on saatavilla Vienti-osiossa laattana — transforms.json ja COLMAP-työtila löytyvät vain valikosta. Lisäksi ruudukossa on yhdeksäs laatta Wiggle, ja Vienti-painikkeen alla lukee Upload to SuperSplat…, joka lähettää kohtauksen tiedoston sijaan suoraan SuperSplat-editoriin verkossa.
Mikä muoto on oikea milloinkin, riippuu tavoitteesta. Täydellisen datan arkistoimiseen ilman laatuhäviötä kannattaa käyttää PLY:tä. Verkon katseluohjelmiin omalla sivustolla riittää useimmiten .splat tai sisäänrakennettu Web Viewer. Jos tiedoston täytyy olla mahdollisimman pieni, kannattaa harkita SPZ:aa tai SOG:ia. SfM-tuloksen uudelleenkäyttöön Nerfstudiossa, Postshotissa tai Brushissa oikeat tavat ovat transforms.json ja COLMAP-työtila.
Kaikki vientitoiminnot löytyvät „Export"-valikosta sekä yksinkertaisessa tilassa ohjatun toiminnon viimeisestä vaiheesta. Useimmat muodot ovat täysin hiekkalaatikkoyhteensopivia ja toimivat App Store -versiossa. Vain SOG vaatii ulkoisen binäärin (cwebp), jota ei välttämättä ole App Store -käännöksessä — katso tarkemmin E4.
E1 — PLY (.ply)
MISSÄ
Valikkorivi → Export → 3D Formats → Export PLY… (⌘E). Yksinkertainen tila: ohjatun toiminnon Vienti-vaihe → muotokortti „PLY". Koko: tyypillisesti 100 % (vertailuarvo). Yhteensopiva: SuperSplat, PolyCam, kaikki 3DGS-katseluohjelmat.
TEKNINEN
PLY on kanoninen tallennusmuoto 3D Gaussian Splattingille. RadianceKit kirjoittaa binäärisen little-endian-tiedoston standardoidulla 3DGS-ominaisuusasettelulla: jokaista Gaussia kohti kolmikomponenttinen sijainti, kolme aina nollaksi asetettua normaalia, kolme DC-SH-kerrointa (f_dc_0..2) perus-RGB-väriä varten, sen jälkeen enintään 45 lisä-SH-kerrointa (f_rest_0..44) Kerbl-2023-artikkelin määrittelemässä transponoidussa kanavakohtaisessa järjestyksessä (ensin kaikki R-kanavan kertoimet, sitten kaikki G, sitten kaikki B), sen jälkeen logit-läpinäkymättömyys (raa'at pre-sigmoid-arvot), kolme log-avaruuden skaalaa ja wxyz-kvaternionirotaatio. Vietävä maksimi SH-aste rajataan käyttäjän toiveen ja todella opitun asteen minimiin; oletusarvo on 3 (45 jäännöskerrointa). Ennen kirjoitusta hyötykuorman koko lasketaan 64-bittisenä kokonaislukuna, jotta ylivuoto erittäin suurilla pilvillä havaitaan. Tiedosto kirjoitetaan atomisesti, mikä varaa suurilla pilvillä hetkellisesti kaksinkertaisen levytilan.
E2 — Compressed PLY (.ply)
MISSÄ
Valikkorivi → Export → 3D Formats → Export Compressed PLY…. Yksinkertainen tila: muotokortti „Compressed PLY". Koko: n. 10–20 % PLY:hen verrattuna (5–10-kertainen pakkaus). Yhteensopiva: SuperSplat, PlayCanvas-moottori, selainpohjaiset katseluohjelmat.
TEKNINEN
PlayCanvasin versio PLY-muodosta lohkotetulla kvantisoinnilla. Gaussit ryhmitellään 256:n lohkoihin. Jokaiselle lohkolle tallennetaan min/max-rajat sijainnille, skaalalle ja värille erikseen otsikkoon; yksittäiset Gaussit viittaavat arvoihinsa suhteessa näihin rajoihin ja pakataan kukin 32 bittiin: sijainti ja skaala 11-10-11-bittisellä pakkauksella, rotaatio 2-10-10-10-bittisenä „Smallest-Three"-kvaternionina, väri 8-8-8-8-RGBA:na. Korkeammat SH-kertoimet kvantisoidaan vain 8 bitillä komponenttia kohti (kolme tavua per kerroin ja Gaussi). Muoto itsessään on edelleen ASCII-otsikollinen PLY ja siten periaatteessa validoitavissa PLY-työkaluilla, mutta vertex-ominaisuudet on määritelty uint-kentiksi. SH-aste on oletuksena 0 (ei jäännöskertoimia) pakkauksen maksimoimiseksi — korkeampia SH-asteita voi valita erikseen.
E3 — SPZ (.spz)
MISSÄ
Valikkorivi → Export → 3D Formats → Export SPZ…. Yksinkertainen tila: muotokortti „SPZ". Koko: n. 10 % PLY:hen verrattuna (90 % pienempi). Yhteensopiva: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.
TEKNINEN
Niantic SPZ v2 -muoto. Sijainnit pakataan 24-bittisenä kiinteänä pilkkulukuna (tämä antaa n. 0,25 mm tarkkuuden), skaalat 8-bittisenä kvantisointina log-avaruudessa, rotaatiot 8-bittisenä smallest-three-esityksenä (v2:ssa tallennetaan vain xyz, w johdetaan dekoodauksessa kvaternionin normista), läpinäkyvyys sigmoidoituina 8-bittisinä arvoina. DC-SH tallennetaan SPZ-kohtaisella pakkauskaavalla (dc_raw * 0.15 * 255 + 0.5 * 255), korkeammat SH-kaistat 5 bitillä (kaista 1) tai 4 bitillä (kaistat 2–3) per kerroin. Koko pakattu binääridata pakataan sen jälkeen tavallisella gzipillä (RFC 1952), mikä tuottaa gzip-säiliömuodon, jonka maagiset tavut ovat 1f 8b. RadianceKit kutsuu tähän järjestelmän gzip-ohjelmaa, koska Applen sisäänrakennettu zlib-rajapinta tuottaa Applen omaan kehyksistykseen sidotun tuloksen, joka ei olisi yhteensopiva Spatial Fieldsin tai MetalSplatterin SPZ-lukijoiden kanssa. Järjestelmän gzip on käynnistettävissä myös macOS-hiekkalaatikon sisältä.
E4 — SOG (.sog)
MISSÄ
Valikkorivi → Export → 3D Formats → Export SOG…. Yksinkertainen tila: muotokortti „SOG". Koko: n. 5–6 % PLY:hen verrattuna (15–20-kertainen pakkaus — pienin vaihtoehto). Yhteensopiva: PlayCanvas-moottori, SuperSplat-editori.
TEKNINEN
„Spatially Ordered Gaussians" — PlayCanvas-muoto, joka tallentaa pilven GPU-valmiina useaan häviöttömään WebP-kuvaan. Ensin kaikki Gaussit järjestetään avaruudellisesti 3D-Morton-koodilla (30-bittinen Z-järjestys, 10 bittiä per akseli), mikä antaa kuville myöhemmän välimuistilokaalisuuden renderöijässä. Sitten sijainnit kvantisoidaan 16-bittisiksi arvoiksi symmetrisellä log-muunnoksella (paremman dynamiikka-alueen saavuttamiseksi) ja jaetaan kahteen RGBA-kuvaan (means_l.webp alemmille 8 bitille, means_u.webp ylemmille). Rotaatiot koodataan smallest-three-tekniikalla 3×8 bitillä plus 2-bittisellä tilalla yhteen RGBA-kuvaan (tila päätyy alfaan muodossa 252 + largest). Skaalat ja DC-SH kvantisoidaan kumpikin 256-alkioisella koodikirjalla (jakautuma perustuu prosenttipisteisiin kaikkien arvojen yli), indeksit päätyvät scales.webp - ja sh0.webp-tiedostoihin. Viisi kuvaa sekä meta.json, joka sisältää koodikirjat ja rajat, pakataan ZIP-tiedostoon (oma enkooderi, koska hiekkalaatikko estää järjestelmän zip-komennon) ja tallennetaan päätteellä .sog.
Huomio hiekkalaatikko: SOG on ainoa muotovaihtoehto, joka vaatii ulkoisen binäärin. WebP-enkoodausvaihe kutsuu cwebp-ohjelmaa polusta /usr/local/bin/cwebp tai /opt/homebrew/bin/cwebp. Jos cwebp-binääriä ei löydy, koodi palaa raakaan PNG-koodaukseen — mutta: PNG-varajärjestelmä ei toimi SuperSplatissa. App Store -versiossa saatavuus arvioidaan käännösvariantin perusteella; kehittäjäversiossa cwebp täytyy asentaa Homebrewilla (brew install webp).
E5 — glTF (.glb)
MISSÄ
Valikkorivi → Export → 3D Formats → Export glTF…. Yksinkertainen tila: muotokortti „glTF". Koko: verrattavissa PLY:hen. Yhteensopiva: glTF-katseluohjelmat, joissa on KHR_gaussian_splatting-laajennus (Khronos-luonnosstandardi).
TEKNINEN
Kirjoittaa itsenäisen .glb-binääritiedoston (ei erillistä bin-tiedostoliitettä) KHR_gaussian_splatting -laajennusmäärittelyn mukaisesti. Sijainnit tallennetaan tavallisena glTF-POSITION-vertex-datana (float3), kaikki muut attribuutit (rotaatio float4:nä, skaala float3:na, läpinäkyvyys float:na, SH-kertoimet float3 × shCoeffCount) sijaitsevat lisävertex-attribuuteissa ja niihin viitataan laajennuksen kautta. Tärkeää: glTF käyttää oikeakätistä Y-ylös-koordinaatistoa, kun taas COLMAP/3DGS toimii Y-alas/Z-eteen-järjestelmässä. Viejä tekee siksi 180 asteen kierron X-akselin ympäri — sijainnit kirjoitetaan uudelleen muodossa (x, -y, -z), kvaternionit sovitetaan muotoon (w, x, -y, -z). Tämä tuottaa geometrisesti oikean, käännösvirheettömän (ei peilikuvan) esityksen glTF-katseluohjelmissa. JSON- ja binaariosat täytetään 4-tavun kohdistukseen, kuten GLB-standardi vaatii.
E6 — Splat (.splat)
MISSÄ
Valikkorivi → Export → 3D Formats → Export .splat…. Yksinkertainen tila: muotokortti „.splat". Koko: tasan 32 tavua per Gaussi. Yhteensopiva: gsplat.js, selainpohjaiset katseluohjelmat (antimatter15-referenssi), useimmat selainpohjaiset 3DGS-demot.
TEKNINEN
antimatter15:n .splat-muoto — 32 tavua per Gaussi, ei otsikkoa, ei epäsuoraa viittausta. Asettelu per merkintä: 3 × float32 sijainti (maailmankoordinaatit), 3 × float32 skaala (exp-muunnettu sisäisen puskurin log-avaruudesta), 4 × uint8 RGBA-väri (DC-SH-kerroin skaalattu kertoimella SH_C0 = 0.282... ja rajattu välille [0,255]), 4 × uint8 kvaternioni (w,x,y,z, normalisoitu ja koodattu tavualueelle muodossa 128 + 128*q). Vain DC-SH tallennetaan — korkeammat SH-kaistat hylätään. Tämä tekee muodosta erittäin kompaktin, mutta menettää katsontakulmasta riippuvat värimuutokset, joita esiintyy heijastuksissa tai kirkkaissa spekulaari-heijastuksissa. Kirjoitusjärjestys on tarkalleen pilven indeksijärjestys (ei avaruudellista lajittelua), verkkokatseluohjelmat kuten gsplat.js renderöivät tämän pohjalta.

flowers-01.html avattu suoraan Finderista kaksoisnapsauttamalla oletusselaimessa — sisäänrakennettu WebGL2-ohjelma renderöi Gaussi-pilven heti, ilman verkkoa tai palvelinta. Mustat merkit kukkakimpun ympärillä ovat harjoituskamerat, jotka voidaan valinnaisesti näyttää. Hiiren vetäminen kiertää, vieritys zoomaa.E7 — Web Viewer (.html)
MISSÄ
Valikkorivi → Export → Media → Export Web Viewer…. Yksinkertainen tila: muotokortti „Web Viewer". Koko: splat-data base64-koodattuna (≈ 4/3 lisäkuorma) + n. 5 kt HTML/JS-runko. Yhteensopiva: jokainen moderni selain, jossa on WebGL2 (kaikki työpöytäympäristöt, iOS 15+, Android 5+).
TEKNINEN
Niputtaa Gaussi-pilven yhteen täysin riviin kirjoitetun WebGL2-renderöijän kanssa yhdeksi .html-tiedostoksi. Tiedostolla ei ole CDN-riippuvuuksia, ei WASM:ia, ei toista tiedostoa. Pilvi koodataan sisäisesti ensin .splat-binäärinä (sama 32-tavun logiikka kuin E6:ssa), sitten upotetaan base64-muodossa, sitten dekoodataan selaimessa atob:lla. Sisäänrakennettu renderöijä tekee oman WebGL2-lajittelun, hiiriohjatun kiertosäätimen ja CPU-lajittelun kutakin ruutua kohti; koko JS-koodi (varjostimet, matematiikka, silmukka) on nähtävissä tulosteen HTML:ssä. Akseliperustan käytäntö muistista renderöijän rajapinnassa on täsmälleen sama kuin E5:ssä: sijainti (x, -y, -z), kvaternioni (w, x, -y, -z). Valinnaisesti voidaan näyttää brändäys-peittokuva (ilmaisen tason kytkin). Koska kaikki on rivikohtaista, tiedosto toimii myös suoraan file://-protokollalla — testaamiseen ei tarvita paikallista verkkopalvelinta.

E8 — Orbit Video (.mp4/.mov)
MISSÄ
Valikkorivi → Viewport → Record Turntable Video TAI Valikkorivi → Export → Media → Export Orbit Video…. Yksinkertainen tila: muotokortti „Orbit Video" ja kestoliukusäädin 3–30 s. Koko: riippuu kestosta, tarkkuudesta ja bittinopeudesta. Yhteensopiva: kaikki alustat (H.264 ja HEVC ovat Apple-standardi).
TEKNINEN
Renderöi Gaussi-pilven parametrisen kiertokamera-ajon mukaisesti ja koodaa jokaisen kuvaruudun AVAssetWriterin kautta MP4- tai MOV-tiedostoksi. Kiertoasetukset ohjaavat kierrosnopeutta (kierrosten määrä), etäisyyttä, korkeuskulmaa, kuvakulmaa, kestoa ja pehmennyskerrointa. Orbit Video -vienti käyttää RadianceKitin OMAA renderöintivaihetta täydellä SH-arvioinnilla — pikselintarkasti sovelluksen sisäisen viewportin kanssa (WYSIWYG). Jokaista kuvaruutua kohti maailman sovitusmatriisi (renderöijän laskema, jotta sisäiset koordinaatit saadaan kierrettyä Y-ylös-kiertomaailmaan) kerrotaan kameran kanssa, minkä jälkeen sovelletaan kameran muunnospeilausta (kierto-Y-ylös → COLMAP-Y-alas). Offscreen-renderöintikohde vedetään IOSurfacen kautta CVPixelBufferiksi enkooderille. Enkooderi tukee H.264:ää ja HEVC:tä, säädettävää bittinopeutta ja tarkkuutta 480p:stä 8K:hon. Ennen ensimmäistä kuvaruutua renderöijä odottaa 200 ms, jotta alustava splat-lajittelu on valmis. Tämä vienti on GPU-sidonnainen — 8K:lla ja miljoonilla Gausseilla renderöintiaika kuvaruutua kohti on useita sekunteja, eli kokonaisrenderöintiajat 10–30 minuuttia 6 s videolle ovat mahdollisia.
E9 — SfM Transforms (transforms.json)
MISSÄ
Valikkorivi → Export → Photogrammetry → Export SfM (transforms.json)…. Koko: tyypillisesti 1–10 kt (vain asennot + sisäiset parametrit, ei kuvia, ei Gausseja). Yhteensopiva: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, kaikki modernit feed-forward 3DGS-koulutustyökalut.
TEKNINEN
Kirjoittaa nerfstudion transforms.json-muodon listalla kamera-asentoja ja jaettuja sisäisiä parametreja (intrinsics). Jokaista kameraa kohti näkymämatriisi (RadianceKit-sisäisesti: world-to-camera COLMAP-käytännössä) käännetään, minkä jälkeen kameran paikalliset Y- ja Z-kantavektorit peilataan, jotta saadaan nerfstudio-käytäntö (OpenGL-tyylinen, kamera katsoo -Z-akselin suuntaan, +Y on ylöspäin). Lopullinen 4×4-matriisi päätyy riveittäin sisäkkäisenä double-taulukkona jokaisen kuvaruudun transform_matrix-kenttään. Sisäiset parametrit tallennetaan ylätasolle (polttoväli x/y, pääpiste x/y, kuvan leveys/korkeus, camera_model = "OPENCV", sekä vääristymäkertoimet k1, k2, p1, p2) — paitsi jos viejä havaitsee useita erilaisia sisäisten parametrien joukkoja, jolloin ne kirjoitetaan kuvaruutukohtaisesti. Kuvapolut kirjoitetaan muodossa images/<tiedostonimi> suhteessa JSON-tiedostoon; käyttäjän täytyy luoda rinnakkainen images/-kansio harjoituskuvineen.
E10 — COLMAP-työtila (sparse/0/)
MISSÄ
Valikkorivi → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. Koko: kolme binääritiedostoa yhteensä tyypillisesti 4–8 Mt — points3D.bin hallitsee (yksi rivi per harvan pilven 3D-piste), images.bin ja cameras.bin ovat kumpikin selvästi alle 100 kt. Yhteensopiva: COLMAP itse, Nerfstudio, Postshot, Meshroom, kaikki työkalut, jotka odottavat COLMAP-sparse/-hakemistoa.
TEKNINEN
Kirjoittaa vakiomuotoisen COLMAP-sparse/0/-asettelun kolmella binääritiedostolla: cameras.bin, images.bin, points3D.bin. Muotoreferenssinä on virallinen COLMAP-dokumentaatio. cameras.bin sisältää deduplikoidun sisäisten parametrien listan (kamerat, joilla on identtiset sisäiset parametrit + kuvakoko, yhdistetään yhdeksi merkinnäksi); käytetty kameramalli on OPENCV (malli 4), fx/fy/cx/cy sekä neljä vääristymäkerrointa k1/k2/p1/p2. images.bin listaa jokaista kuvaa kohti asennon wxyz-kvaternionina plus translaationa, sen jälkeen kamera-ID:n ja tiedostonimen; 2D-3D-vastaavuuksia ei tallenneta. points3D.bin sisältää SfM-pistepilven sijainnilla, värillä (0-255 RGB) ja oletusarvoilla uudelleenprojektiolle ja seurantapituudelle. Kaikki kirjoitetaan little-endian-muodossa. Uudelleentuonti RadianceKitiin onnistuu Tiedosto-valikon kautta → „Import COLMAP/Metashape Workspace…" (katso Q3 SfM-taustajärjestelmä-luvussa).
Mikä formaatti milloinkin?
| Käyttötarkoitus | Formaatti |
|---|---|
| Web-katselin omalla sivulla | E7 Web Viewer (.html) |
Web-katselin 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-/some-video | E8 Orbit Video |
| Näkymän jatkomuokkaus verkossa | Painike „Upload to SuperSplat…" formaattiruudukon alla |
Pikavertailu
| Formaatti | Tiedostopääte | Hiekkalaatikko | Koko (1M Gauss) | Parhaat käyttökohteet |
|---|---|---|---|---|
| E1 PLY | .ply | kyllä | ~250 MB | Arkistointi, korkein yhteensopivuus |
| E2 Compressed PLY | .ply | kyllä | ~40 MB | Web + SuperSplat |
| E3 SPZ | .spz | kyllä (gzip-käynnistys) | ~40 MB | Niantic + mobiili |
| E4 SOG | .sog | ehdollisesti (cwebp) | ~20 MB | Maksimaalinen pakkaus |
| E5 glTF | .glb | kyllä | ~250 MB | Khronos-putki |
| E6 Splat | .splat | kyllä | ~32 MB | gsplat.js-selainkatselin |
| E7 Web Viewer | .html | kyllä | ~45 MB | Itsenäinen selaintiedosto |
| E8 Kiertorata- video | .mp4/.mov | kyllä | vaihtelee | Some/markkinointi |
| E9 SfM Transforms | .json | kyllä | ~5 KB | Poosien siirto |
| E10 COLMAP-työtila | Hakemisto | kyllä | ~4–8 MB | Poosien siirto binäärimuodossa |
Kokosarake sisältää suuntaa-antavia arvoja 1 miljoonalle Gaussianille SH-asteella 3. Todelliset arvot vaihtelevat sen mukaan, kuinka hyvin näkymä pakkautuu; SH-aste 0 pienentää PLY/glTF-kokoa nelinkertaisesti.