Suomenlinna tulvii Blenderissä
Blogisarjasta
Tiedosta kartta – Sivari avoimen datan pyörteissä on blogisarja, josssa HRI:n siviilipalvelusmies Juho Antikainen kirjoittaa kaikesta avoimeen dataan enemmän tai vähemmän liittyvästä syksyn 2022 ja kevään 2023 aikana.
Tervetuloa avoimen datan pyörteisiin, kun tutustumme tulvasimulaatioiden tekemiseen avoimen lähdekoodin 3D-mallinnusohjelma Blenderillä. Pääasiallisena pohja-aineistona käytän Helsingin kaupungin avointa 3D-kaupunkimallia, josta ladataan sopivan kokoinen osa Helsinki 3D cityloader –työkalun avulla. Työkalu sekä käytetty aineisto löytyy HRI.fi -palvelusta. Lisäksi käytin videon viimeistelyyn avoimen lähdekoodin Openshot-videoeditointiohjelmaa. Tämä projekti on tehty yhteistyössä Helsingin 3D-tiimin kanssa.
Tavoitteena oli luoda videomuotoinen visualisaatio meriveden nousemisesta Suomenlinnan Kustaanmiekan alueella. Lopputuloksena syntyi video, joka on julkaistu HRI:n Youtube-kanavalla (video katsottavissa blogin lopusta) Lisäksi halusin opetella Blenderin käyttöä sekä videoiden editointia, joista kummastakaan minulla ei ole aikaisempaa kokemusta. Tässä blogissa näytän, miten video tehtiin ja annan vinkkejä, jos haluat itse kokeilla tulva-animaation tekemistä.
Kyseessä ei kuitenkaan ole fysiikkapohjainen vedennoususimulaatio, jonka Blenderillä myös pystyisi tekemään, vaan simulaatiossa yksinkertaisesti nostetaan vesikuutiota hitaasti mallin läpi. Eli animaatio ei ota huomioon veden mukana kulkevan irtaimiston, viemäreiden imukyvyn tai maaperän läpäisykyvyn vaikutusta.
Blogin loppuun olen kerännyt kaikki tässä tekstissä viitatut aineistot sekä muutamia ylimääräisiäkin, joiden avulla pääsee alkuun Blenderin opettelussa.
Lähtötietoni Blenderin käytöstä olivat heikot ja ensivaikutelma ohjelmasta olikin pelottava. Käyttöliittymässä oli erittäin paljon outoja painikkeita ja erilaisia työtiloja, joiden nimet eivät sanoneet yhtään mitään. Onneksi 3D-tiimin hellässä ohjauksessa ja muutamien ohjevideoiden avulla pääsin hyvin alkuun. Monesti jäin jumiin pitkäksi aikaa johonkin itsestään selvältä vaikuttavaan työvaiheeseen ja tunnin epätoivoisen googlailun jälkeen tajusin, että yksi asetus käyttöliittymän syövereissä oli väärin. Onneksi projektin edetessä aloin ymmärtämään ohjelmaa paremmin, enkä ollut täysin ulkopuolisen avun varassa.
3D-mallin tuominen Blenderiin
Projektin voi jakaa karkeasti kahteen osaan: nousevaan meriveteen ja kaupunkimallin tuomiseen Blenderiin. Kaupunkimallin tuominen Blender-ympäristöön on yksinkertainen prosessi 3D-cityloader-ohjelman avulla. Ohjelmalla pystyy lataamaan osia Helsingin 3D-mallista karttapohjaisen käyttöliittymän avulla (kuva alla). Ohjelman mukana tulee hyvät käyttöohjeet, joiden avulla sen käyttö pitäisi olla ongelmatonta. Muista valita tiedostotyypiksi .obj. Tällöin Blenderiin saadaan mukaan myös kaupunkimallin värit.
Simuloitavan alueen valintaan kannattaa myös kiinnittää huomiota. Ensinnäkin suosittelen valitsemaan rannikkoalueen, koska tällöin veden nostaminen mallin läpi näyttää luonnollisemmalta, eikä vesi vain ilmesty jostain maan syvyyksistä. Lisäksi kannattaa suosia alueita, joissa on rakennettua ympäristöä, sillä puut eivät näytä niin hyvältä kaupunkimallissa kuin rakennukset. Päätin tähän projektiin valita Suomenlinnan Kustaanmiekan alueen (kuva alla), sillä alueella olevat linnoitusmuurit tekevät rannikosta ainutlaatuisen.
Animoidun vesikuution luominen ja sen nostaminen kaupunkimallin läpi
Kun kaupunkimallin osa on onnistuneesti viety Blenderiin, on aika luoda vesikuutio, jolla malliin luodaan tulva. Lähdin liikkeelle ohjevideosta, jossa näytetään, miten luodaan vedenkaltainen materiaali ja animoidaan sen pinnalle liikkuvia aaltoja. Videossa vesishaderi tehdään tasoon, mutta tässä tilanteessa se tehdään kuutioon. Muuten veden noustessa mallin ja veden väliin jää tyhjää tilaa. Lisäksi otin inspiraatiota toisesta ohjevideosta ja päädyin alla olevan kuvan mukaiseen solmurakenteeseen. Suosittelenkin lämpimästi leikkimään eri asetuksilla ja löytämään itsellesi mieleisen ja kontekstiin sopivan veden.
Kun vesikuutio näyttää mielestäsi hyvältä, on aika nostaa sitä kaupunkimallin läpi. Tämä onnistuu helposti Blenderin keyframe-ominaisuudella. Sen käyttöön löytyy myös hyvä ohjevideo. Animaation alkupisteessä vesikuution yläosan kannattaa olla mahdollisimman lähellä mallissa olevaa merenpintaa, jolloin illuusio meren nousemisesta näyttää aidolta. Päätepisteen valinta on taas makuasia. Haluatko tehdä Kauppatorista lokkien kahluualtaan vai hukuttaa Tuomiokirkon korkeimmatkin kupolit? Mahdollisuudet ovat rajattomat!
Kun vedennostoanimaatio on valmis, suosittelen merkitsemään muistiin animaation pituuden ruutuina (engl. frame) ja vedenkorkeuden muutoksen metreinä. Näitä tietoja tarvitaan vedenkorkeuslaskurin tekemisessä myöhemmin. Esimerkissäni nostin veden tasoa 9 metrillä ja animaation pituus oli 800 ruutua. Blenderin ilmoittamat mitat vastaavat suunnilleen todellista maailmaa. Eli Blenderin mukaan veden pinnan nostaminen 9 metrillä vastaa todellisessa maailmassa 9 metrin korotusta. Tämän voin helposti tarkistaa mittaamalla Blenderin ortotilassa jonkin rakennuksen leveyden ja mittaamalla saman mitan Helsingin karttapavelussa.
Merenpintalaskurin ajastus
Itse tulva-animaatio on nyt valmis, mutta katsojia tulee kiinnostamaan, kuinka paljon vesi nousee. Tätä varten teemme seuraavaksi vedenpinnan korkeuslaskurin, joka päivittyy jatkuvasti simulaation edetessä. Käytämme laskurin tekemiseen myös Blenderiä.
Ensi alkuun laskurin tekeminen vaikuttaa vaikealta, sillä Youtubesta ei löydy siihen lainkaan ohjevideoita. Onneksi ongelmaa voidaan yksinkertaistaa. Teimme tulva-animaation siten, että vesi nousee tasaisella nopeudella koko animaation ajan. Tällöin laskurikin täytyy päivittyä tasaisesti nollapisteestä aina 9 metriin saakka. Eli laskurin voi ajatella skaalattuna ajastimena. Ajastimien tekoon Blenderillä löytyy taas runsaasti erilaisia ohjevideoita.
Käytin Blender Frenzyn ohjevideon yksinkertaista ajastinta kahden desimaalin tarkkuudella (videossa kohta 6:20 ja kuvassa alla ajastimen geometriasolmukaavio). Tämä ei ole mikään kaunis ja elegantti tapa toteuttaa ajastinta, mutta se toimii, mikä on tärkeintä. Nyt kun meillä on ajastin, niin se pitää skaalata oikein. Toisin sanoen haluamme laskurin nousevan nollasta yhdeksään tulva-animaation aikana. Tämä onnistuu Blenderin ajan venytys -ominaisuudella (engl. time streching). Sitä varten tarvitsemme kuitenkin kertoimen, jolla ajastimen animaatiota venytetään.
Blenderissä animaation kuvanopeus (engl. frame rate) on oletuksena 24 ruutua sekuntia kohden. Tällöin yhdeksän sekunnin videoon mahtuu 216 ruutua. Haluan skaalata tämän tulva-animaationi pituuteen eli 800 ruutuun. Tällöin ajastimen animaatiota täytyy skaalata kertoimella 800/216 = 3,7, jotta ajastimen animaation pituus on sama kuin videon pituus.
Loppuajatuksia
Blender ja 3D-mallinnus yleisimminkin olivat minulle ennen tätä projektia vieraita konsepteja. Projektin aikana sain pienen pintaraapaisun 3D-mallinnukseen ja videoeditoinnin suureen sekä ihmeelliseen maailmaan. En todellakaan ole enkä varmaan tule koskaan olemaankaan mikään Blender-guru, mutta oli erittäin mielenkiintoista oppia jotain täysin uutta. Toivottavasti tämä blogi kannustaa jotakuta kokeilemaan Blenderiä tai mitä tahansa muuta itselleen uutta asiaa. Maailma on täynnä uusia taitoja opeteltavaksi!
Esitys blogista
Puhuin tästä blogista myös HRI Loves Developers Tiedosta kartta -tapahtumassa:
Materiaaleja Blenderin käyttöön
Blender Quick Tip: Realtime Animated Water Shader In Blender – polygonartist
Easy Procedural Water Material – Blender 2.9 EEVEE – Toby Rawal
Tutorial: Blender Keyframes For Beginners – PIXXO 3D
Countdown Timer – Blender Geometry Nodes + VSE – Blender Frenzy