Kuvataide ja ohjelmointi

Johdanto

Ohjelmointi perustuu lopulta toistamiseen. Komentoja suoritetaan uudestaan ja uudestaan, ja kun välissä tehdään pieniä muutoksia, saamme aikaan jonkinlaista liikettä. Tähän mennessä tällä polulla on työskennelty melko kokeilevasti käyttämällä satunnaislukuja muotojen sijainteina, kokoina ja väreinä. Monet ympäristömme ilmiöt näyttävät meistä ainakin osittain satunnaisilta, ja ohjelmointi on oivallinen työkalu tällaisen liikkeen esittämiseen ja luomiseen.

Tässä luvussa syvennytään kuitenkin ennakoidumpaan liikkeeseen. Jatkuva liike on jollain tapaa läsnä kaikissa kuvissa: esimerkiksi valokuvia katsellessamme alamme vaistomaisesti kuvitella, mitä ennen kuvaa on tapahtunut ja mitä kuvan jälkeen saattoi tapahtua.

Ann van den Borne, Flickr Creative Commons https://bit.ly/2JxMQdK

Ann van den Borne, Flickr Creative Commons https://bit.ly/2JxMQdK

Pohdintaruutu
Minkälaisia säännönmukaisia muotoja hahmotat yllä olevasta kuvasta? Mitä kuvasta osaisit jo toteuttaa ohjelmoimalla? Entä minkälaista liikettä löydät kuvasta? Mikä yllätys kuvassa voisi seuraavaksi tapahtua?
  • Idea: Ensin perehdytään vähän muuttujiin ja liikkeeseen ohjelmoinnissa. Sitten havainnoidaan ympäristöä, ja pohditaan, mitä tällaisella liikkeellä voisi esittää. Lopuksi viimeistellään työ.

Aloitetaan ohjelmointi

Pääset tämän harjoituksen aikana havainnoimaan ympäristöä, ja tuomaan siellä huomaamaasi liikettä osaksi työtäsi. Liikettä luodaksemme meidän tulee kuitenkin ensin ottaa käyttöön muutama uusi ohjelmointityökalu.

Aloitetaan  harjoitus perehtymällä hieman muuttujiin ja liikkeen luomiseen ohjelmoinnissa.

Vaihe 1

Kopioi alla oleva ohjelma Processingiin ja suorita se. Ohjelman ylimmällä rivillä luodaan desimaalilukutyypin (float) muuttuja ja annetaan sille nimi "paikkaX" ja alkuarvo 0.

Muuta muuttujan paikkaX alkuarvoa, joka nyt on 0. Suorita ohjelma aina muutoksen jälkeen ja katso, miten se vaikuttaa lopputulokseen.

Ohjelman draw-osassa muutetaan paikkaX arvoa lisäämällä siihen luku 2.  Muuta lukua 2 pienemmäksi ja suuremmaksi ja katso, miten se vaikuttaa lopputulokseen.

Vastaa lopuksi sivun alalaidassa oleviin monivalintoihin. Näitä ei mitenkään arvioida, vaan tavoitteena on helpottaa omaa oppimistasi.

float paikkaX = 0;

void setup(){
  // Asetetaan piirtoikkunan koko.
  size(750, 400);
}

void draw(){
  // Liikkuva neliö
  rect(paikkaX, 200, 40, 40);
  paikkaX = paikkaX + 2;
}

Mitä suurempi on muuttujan paikkaX alkuarvo, sitä...
Mitä suurempi on muuttujaan paikkaX lisättävä arvo, sitä...

Mitä muuttujat ovat

Ohjelman yläreunassa luomasi muuttuja on kuin tietosäiliö, johon tallennettua arvoa voi hyödyntää myöhemmin ohjelmassa, joko setup- tai draw-osassa. Arvoa voi myös muuttaa ohjelman aikana - siitä nimi muuttuja. Muuttujalla on Processingissa ja monissa muissakin ohjelmointikielissä aina tyyppi, nimi ja arvo.

Ohjelman yläreunassa asetit muuttujan paikkaX alkuarvoksi 0. Käytit muuttujaa myöhemmin rect-komennossa suorakulmion vaakasuuntaisena paikkana. Siksi ruudulle ilmestyvä suorakulmio oli aluksi aivan piirtoikkunan vasemmassa reunassa. Muista, että x-koordinaatti on piirtoikkunan vasemmassa reunassa 0 ja kasvaa oikealle siirryttäessä.

Jokaisella draw-metodin kierroksella muuttujan paikkaX edelliseen arvoon lisätään 2. Ensin arvo on 0, sitten 2, sitten 4, sitten 6.… Nelikulmio piirretään siksi koko ajan hiukan enemmän oikealle ja se näyttää liikkuvan! Mitä suurempi luku muuttujaan lisätään, sitä nopeammin nelikulmio liikkuu.

Asiaa on havainnollistettu alla olevassa animaatiossa. Muuttujan paikkaX arvo on aluksi 0 ja kasvaa koko ajan.

muuttujat ja liike
Vaihe 2

Piirrä draw-osan alussa koko piirtoikkunan kokoinen taustanelikulmio, joka voi olla osittain läpinäkyvä. Taustanelikulmio pyyhkii aina aiemmat muodot  piirtoikkunasta ja siksi neliön "häntä" katoaa.

Kokeile eri peittävyysarvoja taustanelikulmiolle! Muista, että arvon tulee olla väliltä 0-255.

Extra

Voit kokeilla käyttää muuttujaa sijainnin sijaan neliön leveytenä tai korkeutena, tai vaikka molempina samaan aikaan! Mitä tapahtuu?  Esim.

rect(200, 200, paikkaX, paikkaX);
float paikkaX = 0;


void setup(){
  // Asetetaan piirtoikkunan koko.
  size(750, 400);
}

void draw(){
  // Taustanelikulmion väriksi musta. Väri on osittain läpinäkyvä(peittävyysarvo 50).
  fill(0, 0, 0, 50);
  // Taustanelikulmion piirtäminen
  rect(0, 0, 750, 400);
  // Neliön täyttöväriksi valkoinen
  fill(255, 255, 255);
  // Neliön piirtäminen. Vaakasuuntaisena paikkana käytetään muuttujaapaikkaX
  rect(paikkaX, 150, 40, 40);
  // Edelliseen paikkaX arvoon lisätään aina 2, joten paikkaX kasvaa!
  paikkaX = paikkaX + 2;
}

Nopeus muuttujaksi

Vaihe 3

Luo ohjelman yläosassa vielä muuttuja nopeusX, ja aseta sille jokin arvo. Muuta draw-osaa siten, että muuttujaan paikkaX lisätäänkin numeron sijaan nopeusX. 

Vaihda nopeusX:n alkuarvoa ohjelman ylälaidassa. Suorita ohjelma aina muutoksen jälkeen niin huomaat, mihin arvo vaikuttaa. Tässä ei tehdä mitään kovin uutta, sillä aiempi numero korvattiin vain numeron sisältävällä muuttujalla. 

float paikkaX = 0;
float nopeusX = 2;
void setup(){
  // Asetetaan piirtoikkunan koko.
  size(750, 400);
}
void draw(){
  // Taustanelikulmion väriksi osittain läpinäkyvä musta
  fill(0, 0, 0, 50);
  // Taustanelikulmion piirtäminen
  rect(0, 0, 750, 400);
  // Neliön täyttöväriksi valkoinen
  fill(255, 255, 255);
  // Neliön piirtäminen. Vaakasuuntaisena paikkana käytetään muuttujaa paikkaX
  rect(paikkaX, 150, 40, 40);
  // Edelliseen paikkaX arvoon lisätään aina muuttuja nopeusX, joten paikkaX kasvaa!
  paikkaX = paikkaX + nopeusX;
  
}

Pystysuuntainen liike

Neliö on tähän mennessä liikkunut pelkästään vaakasuuntaisesti. Pystysuunnassa paikka on ollut koko ajan sama. Liikutetaan neliötä seuraavaksi myös pystysuunnassa. Tämä tapahtuu ihan samalla periaatteella kuin vaakasuuntainenkin liikuttelu. Luodaan siis kaksi uutta muuttujaa pystysuuntaista liikettä varten.


Vaihe 4

Luo ohjelman yläosassa vielä kaksi uutta muuttujaa: paikkaY ja nopeusY. Anna näille jotkin alkuarvot.

Aseta rect-komennossa neliön pystysuuntaiseksi paikaksi paikkaY.

Lisää draw-osassa muuttujan paikkaY arvoon muuttuja nopeusY.

Kokeile muuttujille paikkaY ja nopeusY eri arvoja ohjelman ylälaidassa. Suorita ohjelma aina muutoksen jälkeen. Miten nämä arvot vaikuttavat lopputulokseen?

float paikkaX = 0;
float nopeusX = 2;
float paikkaY = 100;
float nopeusY = 1;

void setup(){
  // Asetetaan piirtoikkunan koko.
  size(750, 400);
}

void draw(){
  // Taustanelikulmion väriksi osittain läpinäkyvä musta
  fill(0, 0, 0, 50);
  // Taustanelikulmion piirtäminen
  rect(0, 0, 750, 400);
  // Neliön täyttöväriksi valkoinen
  fill(255, 255, 255);
  // Neliön piirtäminen. Vaakasuuntaisena paikkana käytetään muuttujaa paikkaX ja pystysuuntaisena muuttujaa paikkaY.
  rect(paikkaX, paikkaY, 40, 40);
  // Edelliseen paikkaX arvoon lisätään aina muuttuja nopeusX, joten paikkaX kasvaa!
  paikkaX = paikkaX + nopeusX;
  // Edelliseen paikkaY arvoon lisätään aina muuttuja nopeusY, joten paikkaY kasvaa!
  paikkaY = paikkaY + nopeusY;
}

Havainnoidaan!

Olemme tähän mennessä luoneet tasaista liikettä muuttujien avulla. Ehkä sinulle onkin syntynyt jokin ajatus siitä, mitä tällaisella liikkeellä voisi esittää tai ilmaista? Seuraavaksi pääset jalostamaan liikettä kohti tekemiäsi havaintoja.

Vaihe 5
Tuuleta aivojasi pienellä havainnointikävelyllä! Voit käydä pihalla, tai havainnoida vaikka ihan työpisteesi ympäriltäkin llöytyviä asioita.

Poimi ympäristöstä jokin tasaisesti liikkuva objekti, ilmiö tai olio. Liike on harvoin täysin tasaista, mutta kunhan kyse ei ole ihan  mielivaltaisesta poukkoilusta, niin se kelpaa. Voit jo pohtia, miten poimimaasi asian voisi esittää pelkistämällä sen yhteen tai muutamaan geometriseen muotoon.

Poimi liikkeen ympäriltä jokin paikallaan pysyvä säännöllinen muoto tai jokin asia, jota voisit pelkistää erilaisilla geometrisilla muodoilla. Muotoja voi myös olla useita. Jos kyseessä on maisema, voi muoto olla esimerkiksi rakennus, tie, taivas, kukkula tai sateenkaari. Jos teet jotain rajatumpaa, voi muoto olla jokin esine, yksityiskohta tai vaikka kehon osa!
Hitaat ja abstraktit muutokset?

On olemassa paljon tasaista muutosta, jota on vaikea havaita lyhyessä ajassa. Tällaista on esimerkiksi auringon nouseminen, päivän vaihtuminen yöksi tai ilmastonmuutoksen eteneminen. Toisaalta voidaan puhua tunnelman tai mielialan vaihtelusta, ja tällaista “liikettä” voi visualisoida esimerkiksi värieen vaihtumisella tai liikkeen rytmin muutoksilla.

Jos haluat, voit ottaa hidasta tai abstraktiakin liikettä tämän tehtävän lähtökohdaksi!


Havaintoja kohti

Olet tähän asti liikutellut objektia melko kokeilevasti. Nyt voit pohtia, miten voisit hyödyntää liikettä havainnoimiesi asioiden esittämisessä. Muista, että kyse on tässä kohtaa pelkistävästä ilmaisusta - tarkka jäljitteleminen ei ole välttämättä hedelmällistä.

Vaihe 7
Korvaa aiempi liikkuva neliö muodolla. joka voisi esittää havaitsemaasi liikkuvaa asiaa. Voit joko säätää suorakulmion kokoa muokkaamalla rect-komennon kahta viimeistä parametriä, tai sitten vaihtaa muodon esimerkiksi ellipsiksi. Kun vaihdat vielä muodon väriä, saa ellipsillä tai nelikulmiolla pelkistettyä jo hyvin monenkaltaisia asioita.

Säädä myös muodon lähtöpaikkaa ja nopeutta sopivaksi muuttamalla muuttujien lähtöarvoja ohjelman ylälaidassa.

Extra
Voit käyttää muuttujia myös fill-komennon sisällä. Tällöin väritkin vaihtuvat. Värit voivat olla jopa ainoa muuttuva asia teoksessa!

Käytä muuttujaa muodon korkeutena tai leveytenä. Jos muodon koko kasvaa tasaisesti, se näyttää tulevan koko ajan lähemmäksi. Tämä tuo teokseen kolmiulotteisuutta.

Eikö ellipsi tai suorakulmio riitä? Myös esim. kolmion, nelikulmion tai viivan liikuttelu on mahdollista. Nämä muodot piirretään määrittelemällä niiden kärkipisteistä jokainen erikseen. Voit halutessasi liikuttaa esimerkiksi vain yhtä kolmion kärkipistettä muiden pysyessä paikallaan.

Voit koostaa objektin myös useista muodoista ja liikutella niitä samanaikaisesti. Sivun alalaidassa on malliksi koodi, jossa kuudesta muodosta koostettu harakka liitelee piirtoikkunan läpi.
//Tämä on extra-tekemistä!
//Jos sinulla on intoa ja kärsivällisyyttä, voit tehdä sommitelman useista muodoista ja liikutella sitä
//Tässä koodissa piirretään useista muodoista koostuva harakka. 
//Jokainen muoto paikannetaan erikseen käyttämällä muuttujia paikkaX ja paikkaY.
//Kun näiden muuttujien arvot muuttuvat, harakka liikkuu
//Ensin Harakan pää
fill(0);
ellipse(paikkaX, paikkaY, 10, 10); 
//Harakan keho 
fill(255); 
rect(paikkaX - 12, paikkaY, 8, 18); 
// Harakan sininen osa 
fill(0, 20, 240); 
rect(paikkaX-15, paikkaY, 5, 10); 
// Harakan vihertävä pyrstö 
fill(50, 200, 20); 
rect(paikkaX-50, paikkaY, 30, 5); 
// Harakan mustat siivet on tehty nelikulmioina quad-komennoilla. 
fill(0); 
quad(paikkaX-10, paikkaY, paikkaX-25, paikkaY-25, paikkaX-50, paikkaY-50, paikkaX + 10, paikkaY - 25); 
quad(paikkaX-10, paikkaY, paikkaX-25, paikkaY+25, paikkaX-50, paikkaY+50, paikkaX + 10, paikkaY - 25)

Muoto maisemassa

Vaihe 8
Lisää työhösi aiemmin havaitsemasi paikallaan pysyvä muoto, joka auttaa hahmottamaan liikkeen mittasuhteet ja ehkä luo teokseen perspektiiviäkin.

Piirrä muoto draw-osan alussa heti taustanelikulmion piirtämisen jälkeen.

Alla on muutamia esimerkkejä muodoilla esittämisestä ja pelkistämisestä. 

Ylärivi vasemmalta: Delaunay (1906)Baisunghuri (1431-1432)Mondriaan (1939-1942)

Keskirivi vasemmalta: El Lissitzky (1925)Seurat (1881)La Fresnaye (1914)

Alarivi vasemmalta: Pop & Zebra, Ludovic Gauthier


Viimeistely ja extra

Vaihe 9

Viimeistele vielä työsi. Muista, että harjoituksen tavoitteena on ollut tutkia liikettä ja sen lakeja pelkistämisen kautta, ei esittää asioita yksityiskohtaisesti.

Alla on jonkin verran extra-ideoita. Jos virtaa vielä riittää, tutustu niistä ainakin muutamaan!

Extra

Jos haluat, voit kehitellä työtäsi pidemmälle esimerkiksi seuraavin keinoin. 

Lisää setup- ja draw-osien ulkopuolelle mouseClicked-osa, jonka sisällä olevat komennot suoritetaan aina hiirtä klikattaessa. Vaihda osan sisällä muuttujien nopeusX ja nopeusY arvot joksikin toisiksi. Nyt liikkeen suunta muuttuu, kun klikkaat hiirtäsi työn päällä (painat ja päästät ylös)! Voit käyttää nopeutena myös negatiivista arvoja tai nollaa. Jos vaihdat nopeudet nolliksi aina hiirtä klikattaessa, liike pysähtyy. Esim.

void mouseClicked(){
  nopeusX = -2;
  nopeusY = 3;
}

Olet tässä harjoituksessa muuttanut muodon paikkaa lisäämällä paikka-muuttujiin tasaisena pysyvän nopeuden. Kokeile lisätä muuttujiin paikkaX ja paikkaY nopeuden sijaan satunnaisluku, esim. seuraavalla tavalla.

 paikkaX = paikkaX + random(-5, 5);
 paikkaY = paikkaY + random(-5, 5);

Satunnaisuutta voi myös hyödyntää siten, että aina hiirtä klikattaessa nopeudet arvotaan uudestaan joltakin väliltä.


Mitä jos liikkuvan asian kokoa voisi säätää reaaliaikaisesti hiirtä liikuttamalla? Aseta muodon leveydeksi ja korkeudeksi muuttujat mouseX ja mouseY, jotka pitävät kirjaa hiiren sijainnista.

Loppuivatko ideat kesken? Ota pohjaksi viikon 2 Bezier-työsi, ja lisää siihen tasaisesti liikkuvia muotoja!

Haluaisitko, että luomasi muoto palaisi takaisin ikkunaan, kun se on ylittänyt piirtoikkunan rajan? Lisää if-lause koodisi draw-osaan. Seuraava koodi palauttaa paikkaX-muuttujan takaisin nollaan, jos se ylittää arvon 750. Aseta arvon 750 tilalle oman piirtoikkunasi leveys.

 if (paikkaX > 750){
   paikkaX = 0;
 }