Avainsana-arkisto: spark

360 asteen silmänkääntötemppuja Blenderillä

Johdanto

Base Camp –hankkeessa on yhtenä tavoitteena kehittää Spark Joensuu-opiskelijayrittäjyysympäristön digitaalisia palveluja. Sitä silmällä pitäen hankkeessa on kehitetty virtuaalispark Thinglink, jonka avulla kuka tahansa pääsee tutustumaan Sparkiin selaimen tai VR-lasien avulla. Thinglinkissä hyödynnettyjen 360-kuvien kuvaaminen vaatii oman tekniikkansa, ja kaikki ei aina välttämättä menekään heti kohdilleen. Kuvissa voi näkyä epätoivottuja elementtejä, kuten kuvaajia ja tavaroita. Silloin kuva on yleensä otettava uudestaan.  

Mutta mitä voidaan tehdä, kun kaikki muu on kunnossa, mutta jälkikäteen huomataan 360-kuvien horisontin olevan vinossa? Suoristamiseen on olemassa useita erilaisia maksullisia työkaluja, mutta nyt tarkastellaan horisontin suoristamisesta avoimen lähdekoodin Blender-mallinnusohjelmalla.

Jack Sparrow: No niin... tuokaa se horisontti.

Kuva: Pirates of the Caribbean – Mustan helmen kirous (2003)

Mikä siis on ongelmana? 

Kuva 1 on alkuperäinen 360-kameralla otettu kuva Spark Joensuun tilasta. Tarkastelu osoittaa, että se on varsin vänkyrän” näköinen eli kuvan horisontti ei ole vaakatasossa. Varsinkin VR-laseilla kuvan tarkastelu on varsin häiritsevää kaiken ollessa vinossa, mikä on myös havaittavissa kuvasta 2. Tilanne voi syntyä, mikäli alkuperäinen 360-kuva on otettu pitäen kameraa vinossa, tai kamerassa on oletuksena päällä jotkin kiertoasetukset aiempaa kiinnitystä varten.

360-kuva, jonka horisontti on vinossa.

Kuva 1: 360-kuva, jonka horisontti on vinossa.

Kuva 2: Vinossa oleva kuva näyttää perspektiiviotoksella tältä.

Kuva 2: Vinossa oleva kuva voi näyttää perspektiiviotoksella tältä.

Tasavälinen lieriöprojektioesitys ja 360-kuva

Ongelman ja sen ratkaisun ymmärtämiseksi on syytä avata 360-kuvien toimintaa. Yleisimmin 360-kuvien tapauksessa kuvapisteet on järjestetty tasavälisen lieriöprojektion mukaan, kuten on nähtävissä kuvassa 1.  Silloin kuvapisteet mielletään sijaitsevaksi pallopinnalla, ja kamera on ikään kuin pallon keskipisteessä. Kuvan 2 tuloksen antaa kutakuinkin kuvien 3a ja 3b havainnollistamat tilanteet, jolloin kamera osoittaa tiettyyn suuntaan pallon keskeltä 

Kuva 3a. Pallopinta.

Kuva 3a. Pallopinta.

Kuva 3b. Pallopintaan viritetty kuva.

Kuva 3b. Pallopintaan viritetty kuva.

 

 

 

 

 

 

Blenderin valmistelu 

360-kuvia kannattaa tässä tapauksessa käsitellä Blender-mallinnusohjelmassa renderöitävän ympäristön ympäristötekstuurina. Ympäristötekstuuri tarkoittaa koko virtuaalisen maailman ympäröivää kuvatietoa, tallennettuna yleensä yhteen kuvatiedostoon. Kuvatiedostossa olevat kuvapisteet on järjestelty aina jonkin projektiomallin mukaisesti. Projektimalli on blenderissä valittavissa vastaamaan joko tasavälistä lieriöprojektiota, tai peilipallomallia. 

Kuva 4. Blenderin maailma-asetukset.

Kuva 4. Blenderin maailma-asetukset.

Blenderin maailman ympäristötekstuuri asetetaan kuvan 4 osoittamalla tavalla. Avataan ensimmäiseksi Blenderin maailma-asetusvälilehti. Sen jälkeen taustan väri kohdasta “Color”  valitaan ympäristötekstuuriksi (Environment Texture). Lopuksi kohdasta “Open” klikkaamalla valitaan haluttu 360-kuva lähteeksi.  

Sen jälkeen muokkaamme taustan projektion yksityiskohtia varjostinasetusten avulla. Valitaan Blenderin johonkin näkymään tyypiksi varjostineditori (Shader Editor). Oletuksena varjostineditorin asetuksissa on tyyppinä objektikohtainen data, jolloin varjostineditorin näkymä on tyhjä. Vaihtamalla tyypiksi maailman datan (World), avautuvat tarvittavat solmut muokkausnäkymässä, kuten kuvasta 5 on havaittavissa. 

Kuva 5. Varjostineditori maailmamateriaalille. Vasemmalta oikealle lukien on näkyvissä ympäristötekstuurikuva-solmu, taustaväri-solmu(Background) sekä ulostulo-solmu (World Output).

Kuva 5. Varjostineditori maailmamateriaalille. Vasemmalta oikealle lukien on näkyvissä ympäristötekstuurikuva-solmu, taustaväri-solmu(Background) sekä ulostulo-solmu (World Output).

Korjauksen tekeminen 

Ympäristötekstuurisolmun ominaisuuksista voi säätää Texture Mapping-osiosta projektioasetuksia, jotka ovat näkyissä kuvan 5 oikean reunan paneelissa. Horisontin suorituksen tapauksessa merkityksellisiä ovat kiertokulmat (Rotation). Riippuen alkuperäisen kameran asetuksista kuvaa otettaessa, kierto on tehtävä oikean akselin ympäri. Mikäli kamera on ollut vinossa pelkästään sivulle, ylös- tai eteenpäin osoittavan akselin suhteen, kierto on varsin helppo löytää kokeilemalla ja korjata suoraan johonkin ympäristötekstuurisolmun kiertokulma-arvoihin (X,Y,Z). Todettakoon, että kiertokulmat ovat säädettävissä myös vastaavalla tavalla Blenderin kameran kiertokulma-asetuksista, mutta keskitymme nyt tässä tapauksessa tekemään kierrot pelkästään materiaalin varjostineditorissa selkeyden vuoksi. 

Mikäli kiertoakseli on jokin muu kuin X, Y tai Z-akseli, tai haluamme samalla kertaa muuttaa 360-kuvan “aloitusnäkymää”, on tehtävä muutama solmu lisää. Soveltuvat solmut saadaan lisättyä valitsemalla Add-valikosta Input ja edelleen Texture Coordinate, sekä samaisesta Add-valikosta Vector ja edelleen Vector Rotate 

Yhdistämällä tekstuurikoordinaattisolmusta Object-ulostulon vektoria kiertävän solmun Vector-syötteeseen, voimme kiertää vektoria mielivaltaisen akselin ympäri halutun kiertokulman verran. Yhdistämällä vektoria kiertävän solmun Vector-ulostulon oikeasta reunasta edelleen ympäristötekstuurin Vector-syötteeseen, kytkemme kierron vaikutuksen ympäristötekstuuriin.  

Kuten kuvasta 6 on havaittavissa, vektorin kiertosolmuja voi yhdistellä myös peräkkäin, yhdistämällä Vector Rotatesolmun ulostulon toisen Vector Rotate-solmun syötteeseen. Tällöin on pidettävä mielessä oikea kiertojärjestys, sillä kierto-operaatiot muokkaavat myös kiertoakseleiden suuntaa. Mikäli ensiksi kierretään x-akselin ympäri, ylöspäin osoittava z-akseli ei enää olekaan ylöspäin, ja suoristamisen sijaan lopputulos voi vääntää kuvaa entistä pahemmin.  

Kuvassa 6 vasemmalta oikealle lukien ensiksi korjataan “aloitusnäkymä”, jonka jälkeen vasta horisontti. Alla olevassa kuvassa ensimmäinen kierto (Vector Rotate) on 0 astetta, jolloin kuvan “aloitusnäkymä” pysyy oletuksena samaan suuntaan kuin alkuperäisessäkin. Toinen kierto puolestaan kuvaa kiertää y-akselin ympäri -26 astetta.  

Kuva 6. Maailmamateriaalin varjostineditorin tilanne, kun mukaan on lisätty uudet solmut.

Kuva 6. Maailmamateriaalin varjostineditorin tilanne, kun mukaan on lisätty uudet solmut.

Uuden kuvan renderöinti 

Kuva 7. Kameran sijainti ja kiertokulmat.

Kuva 7. Kameran sijainti ja kiertokulmat.

Korjattu kuva on renderöitävä panoraamana, eli rikkoutumattomana näkymänä koko ympäristöstä. Panoraamakuva on mahdollista muodostaa esimerkiksi tasavälinen lieriöprojektion avulla, jolloin saamme siitä yhteensopivan alkuperäisen 360-kuvatiedon kanssa. Mikäli emme lisää 3D-malleja näkymään, Blenderin kameran sijainti ei ole merkityksellinen. Sen sijaan kameran kiertokulma kannattaa olla asetettuna siten, että kamera on X- tai Y-akselin suuntainen ja kameran yläreuna osoittaa Z-akselin suuntaan. Kuvassa 7 kamera osoittaa y-akselin suuntaan ja sijaitsee koordinaateissa 0,0,0.  

Kuva 8a. Cycles-renderöijä asetettuna

Kuva 8a. Cycles-renderöijä asetettuna

Kuva 8b. Renderöintiresoluutio asetettuna oikein, mutta skaalattuna alaspäin.

Kuva 8b. Renderöintiresoluutio asetettuna oikein, mutta skaalattuna alaspäin.

Soveltuvaa Panoraamakamera-asetusta tukee ainoastaan Cycles-renderöijä. Sen voi valita ominaisuuspaneelinäkymän renderöintiasetuksista (Kuva 8a). Kohtaan Render Engine on valittava Cycles. 360-kuvien renderöinti on tehokkaallakin koneella vaativaa, joten renderöintiresoluutio on syytä laskea suhteellisen matalalle testejä varten, kuten kuvassa 8b näkyy. Ominaisuuspaneelin ulostuloasetuksista on mahdollista säätää resoluutio vastaamaan alkuperäistä kuvaa (tässä tapauksessa 6080×3040), mutta lopputulosta skaalataan alaspäin vaikkapa 13 prosenttiin alkuperäisestä. Tällöin kuvan renderöinti on nopeaa, ja saamme selville mihin suuntaan kuvan horisontti on kääntynyt ilman turhia odotteluja. Lopulliseen renderöintiin skaalaus nostetaan taas 100 prosenttiin. 

Kuvassa 10 on havainnollistettuna mistä lopullisen kuvan tallentaminen tapahtuu Blenderin renderöintinäkymästä. Valitsemalla Image -> Save Image, korjatun kuvan voi tallentaa levylle haluamaansa paikkaan. Cycles-renderöijän renderöintinäkymään tuottama kuva on vaaleampi kuin alkuperäinen, mutta kuvan tallennuksen jälkeen värit ovat kohdallaan. 

Kuva 10. Renderöidyn kuvan tallentaminen Blenderistä.

Kuva 10. Renderöidyn kuvan tallentaminen Blenderistä.

Yhteenveto

Kun kuva on tallennettu, säätöjen aikaansaama lopputulos nähtävissä kuvissa 9a ja 9b.

Kuva 9b. Aloitusnäkymää on kierretty korjatusta kuvasta 180 astetta.

Kuva 9b. Aloitusnäkymää on kierretty korjatusta kuvasta 180 astetta.

Kuva 9a. Kameran jalusta on alalaidassa ja horisontti on vaakatasossa.

Kuva 9a. Kameran jalusta on alalaidassa ja horisontti on vaakatasossa.

Horisontin korjaaminen 360-videosta toimisi periaatteessa vastaavalla tavalla, mutta jokainen videon ruutu on renderöitävä erikseen, joka vie puolestaan paljon enemmän aikaa. Eli testaamalla 360-kameran tuottamaa kuvaa ennen isompaa kohteen kuvausurakkaa voi säästää aikaa pitkässä juoksussa. Mikäli kuvien horisontti sattuu kuitenkin olemaan vinossa, niin uutta kuvaussessiota ei välttämättä tarvitse järjestää, jos koneessa on riittävästi laskentatehoa ja Blender. 

Anssi Gröhn 

Tietojenkäsittelyn lehtori 

Base Camp-hanke