Tehtävä

3D-Mallinnuskurssin harjoitustyön tehtävänä oli valita itselle tarpeeksi haastava aihe, josta tehdä 3D näkymä. Tarkoituksena oli myös käyttää tavallisten 3d-mallinnusteknologioiden ohella haastavempia ja monimutkaisempia tekniikoita ja renderöidä lopputulos. Valitsin aiheekseni mallintaa rantasaunan/mökin rantamaisemalla.

Toteutus

Aloitus ja pohja

Aloitin etsimällä netistä mallia mökille, jonka voisin mallintaa. Löysin sopivan hirsimökkimallin Karvian Hirsirakentajien sivuilta. Heillä oli myös pohjapiirros, mitä voisi käyttää mallina. Otin pohjapiirroksen talteen ja aloin mallintamaan perustusta talolle. Mallinsin pohjapiirroksen millimetrin tarkkuudella. Rajoitin mallinnukseni rakennuksen julkisivuun, jättämällä interioorin mallintamatta.

Pohjan mallinnus Pohjapiirros Mökin malli

Seinät

Hirsimökin seinät mallinsin Arrayksi asetetuista hirsistä, jotka mallinsin sylinteristä (ks galleria). Hirret pyöristin käyttämällä Bevel- sekä Subdivision surface-modifierejä. Mean Crease-toiminto varmisti, että hirsien päädyt pysyivät tasaisina.

Hirren mallinnusta Hirren mallinnusta 2 Hirsistä array Seinät paikallaan Mean Crease Modifierien kopiointi

Ovi ja ikkunat

Ovelle ja ikkunoille tein aukot kuutioilla joille asetin Boolean-modifierin. Boolean leikkaa aukon toiseen objektiin käyttäen itsensä geometriaa leikkurina. Valitsin käyttää Booleania, sillä ovea ja aukkoa voi siirtää helposti vielä jälkikäteen.

Kun monistin ikkunoita, tein vielä muutoksia ikkunoiden kopioinnin jälkeen objekteihin. Tämän jälkeen jouduin muuttamaan vielä alkuperäistä objektia. Löysin onneksi Link object data-toiminnon, jolla yhteen objektiin tehty muutos siirtyy samalla kaikkiin linkattuihin objekteihin.

Ikkunalaudoitus ikkunan objektien ryhmittely Oviaukko Objektien linkitys Linkitetty objekti muuttuu samalla Linkitetyt ikkunat

Toteutin oven suurimmaksi osaksi Box-Modeling periaatteella yhdestä kappaleesta. Käytin Mirror-modifieriä oven geometrian peilaamiseen toisellekin puolelle. Eristin myöhemmin ovesta kappaleita omiksi objekteikseen, kun tekstuurit eivät renderöityneet oikein Cyclesillä, ja yritin korjata ongelmaa.

Box-Modeling ovi Lukon mallintamista Oviraudat tasoista Solidifyllä

Materiaalit

Loin tutoriaalien avulla ja itse kokeilemalla erilaisia kuvioita ja materiaaleja. Loin testausta varten projektiin oman scenen, johon asetin testattavat materiaalit eri kappaleisiin. Materiaalit olivat aluksi vaikeita ymmärtää ja luoda, mutta rutiinilla alkoi hahmottaa että mitä tiettyjä yhdistelemällä saisi tietynlaisen kuvion aikaiseksi. Tykkäsin kokeilla luoda satunnaisia ja luonnollisia kuvioita, erityisesti puuta muistuttavia materiaaleja. Kuvissa osa luomistani materiaaleista.

Studio materiaalien luontia varten Lisää materiaaleja Vielä lisää materiaaleja. Hehkuva materiaali syntyi vahingossa väärää arvoa muuttamalla Materiaalit mökkiin Perustuksen materiaali

Terassi

Terassiin halusin tehdä aidon näköiset laudat, joten etsin mitat, ja mallin erään rautakaupan sivuilta. Mallinsin laudat tarkasti mittojen mukaan, pyöristin aavistuksen Bevel-modifierillä ja asetin terassin pohjaksi limittäin Arrayta käyttäen. Leikkasin lautojen ylimenevän osuuden kappaleella, johon laitoin Boolean-modifierin.

Kattopylväät Laudan mallintaminen Laudat limittäin arrayllä Lautojen leikkaaminen booleanilla Laudat leikattuina

Aidat ja Geometry Nodes

Halusin tehdä aidat käyttäen uutta Geometry Nodes-toimintoa blenderissä. Geometry Nodes on node-pohjainen työkalu, jolla voi tehdä noodipohjaista geometriamanipulointia monella eri tavoin. Sillä voi tehdä esimerkiksi dynaamisia aitoja, partikkelisysteemin tapaisia distribuutioita eri pinnoille, ja olemassa olevaan geometriaan muutoksia erilaisien noodien avulla. Halusin tehdä terassiaidan, johon tulee kaide ja sivulaudat, joka skaalautuu automaattisesti ja jota voi dynaamisesti siirrellä. Tavallisella arraylla ei tällaista voi tehdä yksinään.

Geometry Nodes osoittautuikin aidan tapauksessa haastavammaksi tehtäväksi kuin ajattelin. Aidat sain hyvin jaoteltua Curvelle eli käyrälle, mutta aidan laudat olivat haastavia, ja ominaisuuden uutuuden takia dokumentaatiota eikä tutoriaaleja ollut paljoa saatavilla. Sain kuitenkin yritysten ja kokeilujen kautta suoran kopioitua ja muutettua kaiteeksi sekä sivulaudoiksi.

Aita Geometry Nodella Geometry Nodet Aita sivulautoineen Aita asetettuna terassille

Geometry Node selitetty auki

Geometry node-editorissa lähtönoodi ottaa nykyisen objektin, johon Geometry Node on liitetty modifierinä, geometrian jota voidaan manipuloida esim. erilaisilla modifiereillä, muutoksilla verteksien sijainteihin, materiaaleja muuttamalla.

Kuvan ja aitaesimerkin avulla selitän noodit:

Aidan Geometry Nodet
  1. Input Node: Lähdeobjektin geometria. Nykyisessä kohteessa kyseessä Curve.
  2. Curven jakaminen uudelleen pisteisiin tietyn välimatkan välein
  3. Jaetaan pisteisiin haluttu objekti. Tässä tapauksessa aidan poikkipuut
  4. Valittu objekti ja sen asettelu curvelle
  5. Liikutetaan curvea haluttuun kohtaan
  6. Tehdään käyrästä paksu, tehdään siitä muoto (mesh) ja asetetaan materiaali
  7. Sivulaudan tekeminen: Sijoitetaan alkuperäisen curven instanssi toiseen paikkaan, annetaan sille profiili, laajennetaan (extrude)
  8. Yhdistetään verteksit ja asetetaan materiaali
  9. Kopioidaan sivulauta ja asetetaan kopio toiseen paikkaan
  10. Lopuksi yhdistetään kaikki geometria yhdeksi objektiksi ja lähetetään geometria ohjelmalle

Katto, savupiippu, savu

Kattoa mallintaessa nostin seinien korkeutta metrillä ja leikkasin Boolean-modifierillä seinät katon muottiin. Tein katon kehykset laudoista ja asetin katon päälle mustia levyjä bitumikattohuovaksi. Kattoa varten oli aluksi vaikea asetella lautoja toisensa jälkeen samaan kulmaan ja tasoon, joten löysin keinon lautojen ja muidenkin kattokappaleiden helpommalle asettelulle: Oman koordinaatiston luominen. Tämän avulla sain kaikki kattokappaleet helposti aseteltua.

Tein savupiipun peltihormina ja lisäsin savun käyttämällä blenderin Quick Effects -> Quick Smoke toimintoa, minkä lisäsin palloon, jonka piilotin savupiippuun. Asetin savupiipun hormin seinämiin ja hattuun Liquid Colliderin (Physics-välilehti), jonka avulla sain savun törmäämään piipun geometriaan. Vielä pisteeksi i:n päälle lisäsin tuuliobjektin työntämään savua piipusta ulos. Savun generointi tapahtui “beikkaamalla” (bake) savuefekti tietyille keyframeille. Asetin savun alkamaan kehyksestä -100, jotta savu olisi jo ilmassa ensimmäisen kehyksen kohdalla, josta renderöinti alkaisi.

Katto ja piippu paikoillaan Savun luominen Tuuli työntämään savua ulos

Ympäristö

Loin ympäristölle ruudukon, jonka muotoilin poikkileikkausmaiseksi. Tein ympäristölle kolme erilaista tekstuuria: multa, sora ja hiekka. Osoittautui aluksi vaikeaksi keksiä miten saada kaikkia materiaaleja maalattua samaan maastoon. Löysin netistä tutoriaalivideon, jonka mukaan tekstuureja voi maalata objektiin käyttäen apuna itseluotuja maskitekstuureja, joilla maalataan materiaali maastoon. Objekti UV-unwräpätään ja mustalle testuurille maalataan valkoista kohtiin, joista haluaa toisen tekstuurin näkyvän läpi. Materiaalit yhdistetään materiaali-node-editorissa Mix shader-noodin avulla ja maskitekstuuri kiinnitettään Mix Shader-noodin Fac-arvoon.

Lisäsin maastoon partikkelisysteemin käyttäen hiuspartikkelia, jonka muotoilin ja värjäsin ruohon näköiseksi. Verteksiryhmän (Vertex Group) ja Weight Paint-työkalun avulla värjäsin kohdat, missä halusin ruohoa olevan. Saman toistin ruohon pituudelle.

Kivet generoin maisemaan käyttämällä tuttua Geometry nodes-työkalua. Tein työkalun, jolla generoin yksinkertaisista objekteista kuten kuutioista yksityiskohtaisia ja rosoisia kivimalleja. Työkalussa on muutama parametri, joita voi muuttaa ja hienosäätää siten lopputulosta.

Materiaalit yhdistetään ja maskitekstuuri yhdistetään solmun Fac-arvoon Maskiin maalaaminen Ruohon asettelu käyttäen Weight Mappia Terrainin sculptaus Kivien luonti Geometry Nodeilla Kiven lopputulos materiaaleineen

Puut

Puut generoin käyttämällä Blenderin omaa lisäosaa Sapling Tree Gen. Lisäosalla pystyy luomaan erilaisia puupresettejä säätämällä monia puiden ominaisuuksia esim oksien tiheyttä, korkeutta ja haaroitusta. Työkalusta löytyy lukuisien asetusten lisäksi valmiita presettejä. Käytin valmista presettiä sekä omaa luomaa koivujen generointiin. Generoimisen jälkeen muutin puut Meshiksi ja loin niille materiaalin yritten jäljitellä oikeaa koivun ulkonäköä.

Lehdet koivuun sain luomalla koivuun Particle Systeemin. Tein verteksijoukon koivun oksille, mihin jaoin partikkelit. Partikkelia varten löysin koivun oksan kuvan netistä, jonka asetin partikkeleiden muodoksi. Lopuksi säädin partikkeleiden määrityksiä esim. satunnaisuutta koon ja rotaation suhteen.

Sapling Tree Gen Addon Puiden generointi ja kustomointi Versio 1 Versio 2 Kuvan hyödyntäminen partikkelina Lehdet puussa

Vesi

Veden tein aluksi laittamalla tason rantaan, ja teksturoin sen karheaksi ja heijastamaan paljon valoa. Koska alussa suunnittelin vielä maisemaa, jossa olisi ns kuutiomainen poikkileikkaus, eli näyttäisi siltä että mökki olisi kuutiomaisella maapläntillä, niin vesi näytti siinä huonolta, koska se oli vain leijuva taso maan päällä. Tein uuden veden käyttäen lasista kuutiota, jonka pinnan tasoa vain aaltomaisesti animoin. Lasiblokissa oli se hyvä puoli, että se alkuperäisessä suunnitelmassani näytti todella paljon paremmalta kuin pelkkä taso, ja oli sopivasti läpinäkyvä. Päädyin loppurenderissä käyttämään tätä lasista blokkia, vaikka se ei päässyt oikeuksiinsa loppurenderissä.

Lisäsin veden materiaaliin ja displacement:iin animaation saadakseni veden liikkumista muistuttavan efektin.

Vesiblokki lasimateriaalista Hiotumpi heijastus

Renderöinti ja kompositointi

Objektien viimein paikalla ollessa sain luvan renderöidä. Objektit piti jakaa eri ViewLayereihin, jotta staattisia liikkumattomia asioita ei tarvitsisi renderöidä kahta kertaa. Läpinäkyvyys täytyi renderöintiasetuksista laittaa päälle, jotta ympäristön taustakuva ei tulisi renderiin mukaan. ViewLayeristä pystyi sitten laittamaan päälle niitä Collectioneja eli kokoelmia mitä halusi kyseiseen ViewLayeriin mukaan. ViewLayeristä voi laittaa myös päälle pelkästään muiden objektien jättämän läpinäkyvän leikkauksen ja/tai niiden vaikutuksen ympäristöön, kuten varjostus tai valo, ilman että kyseinen objektikokoelma on Layerissä mukana.

Kokonaisajaksi renderöinnissä meni useampi tunti, sillä blender välillä kaatui kesken renderöinnin, ja eräässä tapauksessa renderöinti piti aloittaa alusta.

Renderöinnin jälkeen kompositointityökalulla renderöidyt eri ViewLayereiden kuvat voitiin yhdistää. Tärkeää yhdistelyssä oli kuvien oikea järjestys, jotta kaikki layerit näkyivät lopputuloksessa. Osa layereistä oli staattisia kuvia ja osa kuvakokoelmia, jotka voitiin sitten jälkirenderöidä animaatioksi. Lisäsin kompositointiin muutamia jälkikäsittelyefektejä, joilla säädin ensin erikseen eri viewlayereiden värejä ja sitten lopulta koko lopputuloksen värejä ja valotusta yhdessä. Animaation renderöinnin jälkeen vihdoin uurastuksen lopputulos oli käsissä!

Aikainen rendertesti Kompositointitesti Eeveellä ennen viimeisiä renderöintejä ViewLayereiden luonti Vesi omassa layerissään Läpinäkyvien kuvien yhteen kutominen Eeveellä kannattaa testata ennen Cyclesin käyttöä että kaikki sujuu Maiseman jälkikäsittelyä

Hasteet

Alussa en tajunnut sitä miten booleanit toimivat, ja ihmettelin, että boolean-leikkauksen jälkeen leikkauskohdan materiaali on eri kuin mikä leikattavan materiaalin. Tutustuttuani aiheeseen dokumentaation kautta paremmin, tajusin, että booleanit jättävät leikkaavan objektin materiaalin leikattavan objektin leikkauspinnalle. Ratkaisu tähän oli poistaa leikattavan objektin materiaali ja asettaa se uudelleen leikkauksen jälkeen.

Kun olin saanut ovet ja ikkunat tehtyä, kokeilin renderöintiä Cyclesillä ja huomasin, että ovessa ja ikkunalaudoissa oli mustia raitoja. Eeveellä renderöitäessä ei ollut. Huomasin, että objektin Pivot-pointin eli originin asettaminen saranasta objektin keskelle korjasi osittain mustat raidat tekstuurissa.

Yksi harmillisimmista ongelmista mikä tuli vastaan oli se, kun yritin mallintaa halkeamia hirsien päätyyn. Halkeamien syvyyttä ei saanut tavallisella normal/bumpmapilla tehtyä, joten vaihtoehtona oli käyttää Cyclesillä näkyvää displacementtiä, joka tekee visuaalisen mutta oikean muutoksen muotoon. Kokeilin erilaisia sisäänrakennettuja tekstuureja halkeamien tuottamiseen kuten voronoi, perlin noise, musgrave, ja sain lopulta aika aidon näköisen halkeaman aikaan. Huono puoli oli siinä, että halkeamien tuottamiseen displacementillä vaadittiin runsaasti geometriaa, ja geometria vaati paljon tehoa tietokoneelta. Sain blenderin kaatumaan, eikä se suostunut käynnistämään projektia pitkien yritysten ja odotustenkaan jälkeen, mutta onneksi löysin varmuuskopion projektista, joka tosin laittoi minun etenemisen useita tunteja taaksepäin.

Renderöinnissä oli lopuksi haastetta, sillä maisemani oli niin yksityiskohtainen, että yhden kehyksen renderöinti kesti yli 40 minuuttia. Minulla oli animaatioiden vuoksi renderöitäviä kehyksiä 100, joten joko animaatio piti jättää pois, tai keksiä miten renderöintiaikaa saisi pienennettyä. Tuntiopettaja antoi vinkin, että renderöitäviä asioita voi jakaa eri layereihin eli kerroksiin. Löysin netistä hieman ohjeita, ja sain objektit jaettua eri kerroksiin ja sain renderöityä kerrokset erikseen ja yhdistettyä kompositoinnin avulla.

Renderöinnissä tuli toinenkin ongelma, kun yhden animaation tallennuksen jälkeen tallennustiedostomuodoksi oli vaihtunut PNG ilman alfa-kerrosta, eli toisin sanoen läpinäkymätön kuvamuoto. Tämän jälkeen olin renderöinyt 100 kehystä veden layeriä vain huomatakseni, että kuvissa ei ole ollenkaan läpinäkyvyyttä enkä voi yhdistää kuvia kompositoinnin avulla. Vaihdoin tallennustiedostomuotoa tallentamaan myös läpinäkyvyystiedot, ja jouduin renderöimään nämä 100 kehystä uudelleen.’

Materiaalissa artifaktit Cyclesillä Leikkausjäljet booleanilla Ratkaisuna materiaalin poistaminen.. ..ja takaisin laittaminen Bumpmapilla ei saa aikaan syvää halkeamaa Halkeamien kokeileminen displacementillä

Itsearviointi

Työ eteni ja onnistui suuremmilta osin hyvin. Olen tyytyväinen lopputulokseen. Parannettavaa tietenkin on paljon, mutta tähän projektiin tämä on mielestäni riittävä lopputulos. Käytin monimutkaisia tekniikoita esim. Geometry Nodes, ViewLayer-renderöinti, animaation kompositointi, partikkelit. Skulptausta oli hieman myös mukana (maasto). Käytin myös mielestäni tekniikoita suhteellisen monipuolisesti.

Onnistuneimpana ominaisuutena projektissa pidän erityisesti mökkiä. Se on monipuolinen ja sisältää paljon yksityiskohtia, jotka on osa tehty uusimpia tekniikoita käyttäen. Myös pidän hyvin onnistuneena maastoa. Sain hyvin yhdistettyä yhteen maastoon eri maskitekstuureja ja maalaamista hyväksi käyttäen kompleksisia materiaaleja, jotka mielestäni näyttävät hyvältä lopputuloksessa. Ehkä materiaalit ja node-editorin käyttö on oma vahvuuteni, joka aika hyvin näkyy harjoitustyöstä.

Pidän harjoistyötäni kiitettävään arvosanaan riittävänä tai ainakin pääsevän lähelle sitä.

Kritiikki

Työssä ehkä heikoin kohta on siinä, että maiseman monimutkaisuus ei jakaannu ihan tasaisesti. Mökki on monimutkaisin osa maisemaa, ja ympäröivä muu maisema ei ole aivan yhtä monimutkainen. Mökkiin onkin käytetty suhteessa eniten aikaa. Ennen kuin tein viimeisen renderöinnin, pienensin näkymää kohdistumaan enemmän mökkiin, että mökki pääsisi paremmin oikeuksiinsa.

Vesiraja jäi kokonaan huomiotta, joka renderissä pistää hieman silmään. Sen voisi ehkä tekstuurilla häivyttää.

Puihin oli myös vaikea saada lehdet näyttämään hyvältä. Kokeilin yksittäisiä lehtiä puissa, mutta se ei näyttänyt hyvältä. Oksia olisi pitänyt olla paljon enemmän ja niiden olisi pitänyt jakaantua vielä lisää. Tyydyin tässä vähän heikompaan tulokseen.

Tulokset

Voit katsoa renderöidyn animaation ja renderöidyt kuvat tästä (Muista klikata video 1080p-resoluutiolle):

Render frame 1 Render frame 25 Render frame 50

Projektin vaiheisiin kulunut aika:

Tunnit Vaiheet
6 Perustukset, Seinät, ikkunat
4 ikkunat ja oviaukko
9 ovi ja materiaalit
4 Materiaalit
9 Terassi, betoniperustus, aidat
5 portaat, palkit, katto
9 Katto, savupiippu
7 Maasto, vesi, puut, kivet
10 Renderöinti, kompositointi
   
Yht 63