3D grafiikka

3D-grafiikka

Ennen kuin tutustut 3D-maailman mahdollisuuksiin, kannattaa käydä läpi luku 2D-transformaatioista. Lähes kaikki seuraavissa esimerkeissä ja tutoriaaleissa esiteltävät asiat nojaavat 2D-transformaatioihin. Käymme tässä materiaalissa pintaraapaisuna läpi vain yhden esimerkin. Aihe on niin laaja, että kannattaa ehdottomasti tutustua esimerkiksi Processing.orgin P3D-tutoriaaliin ja etsiä itse netistä lisätietoa.


Esimerkki: Laatikko

3D-grafiikassa meidän on määriteltävä size-metodissa renderöijä, sillä aiemmin käytössä ollut Processingin oletusrenderöijä ei riitä kaikkiin kolmiulotteisiin tarpeisiimme. Yksinkertaisen laatikko-objektin saamme esille määrittelemällä renderöijän size-metodissa, siirtämällä kuvan translate-metodilla (3D-grafiikassa välttämätön!) ja piirtämällä laatikon box-metodilla. Lisätään vielä pari hiireen reagoivaa rotate-metodia, jotta havaitsemme kuvan kolmiulotteisuuden.

void setup(){
// määritellään P3D-renderer size-metodissa
  size(500, 500, P3D);
  fill(200);
  noStroke();
}

void draw(){
  background(0);

// siirretään piirettävät asiat haluttuun paikkaan
  translate(width/2, height/2, 0);  

// hiiren liikuttelu kiertää kuvaa
  rotateX(mouseX*0.01);
  rotateY(mouseY*0.01);  

// piirretään laatikko, jonka koko on 100
  box(100);
}

Laatikkomme on vielä kummallinen möhkylä eikä kierrossa ole meille juuri mitään uutta. Lisätään ohjelmaan valot lights-metodilla ja mahdollistetaan perspektiivin muutokset käyttämällä perspective-metodia. Kaksi uutta muuttujaa mahdollistavat kameran liikuttelun nuolinäppäimillä vaaka- ja syvyyssuunnassa.

// field of view: näkymän laajuus radiaaneina
float fov = PI/3.0;

// kameran sijainti x-akselilla
float posx = 0;

void setup(){
  size(500, 500, P3D);
  fill(200);
  noStroke();
}

void draw(){
  background(0);
// lights() asettaa oletusvalot päälle
  lights();

// määritellään perspektiivi: näkymän laajuus,
// leveyden suhde korkeuteen, sekä lähin ja kaukaisin
// piirrettävä taso z-akselilla
  perspective(fov, float(width)/float(height), width/2.0, height*2.0);    

// otetaan posx huomioon translate-metodissa
  translate(width/2+posx, height/2, 0);   
  rotateX(mouseX*0.01);
  rotateY(mouseY*0.01); 
  box(100);
}

void keyPressed(){
 
// käytetään näppäimistön nuolinäppäimiä perspektiivin ja
// kameran sijainnin määrittelyyn
  if (keyCode == UP){
    fov -= 0.1;
  } else if (keyCode == DOWN){
    fov += 0.1;
  } else if (keyCode == LEFT){
    posx -= 5;
  } else if (keyCode == RIGHT){
    posx += 5;
  }
}

Alla lopullinen ohjelma. Kokeile pyörittää laatikkoa hiirellä ja liikuttaa kameraa nuolinäppäimillä.