Muodonmuutokset

Muodonmuutokset mahdollistavat paikan, johon asiat maailmassa piirretään, muuttamisen. Esimerkiksi laatikoita piirtävä funktio voi piirtää vain akselin suuntaisia laatikoita. Jos kuitenkin ensin määrität kiertomuodonmuutoksen, voit luoda kierrettyjä laatikoita. Myös kuvat piirretään aina xy-pinnalle. Voit vaikuttaa tähän asettamalla muodonmuutoksen. Muodonmuutosfunktioita on kahdentyyppisiä: funktioita, jotka asettavat muodonmuutoksen ja funktioita, jotka lisäävät muodonmuutosta.

d3d_transform_set_identity() Asettaa muodonmuutoksen identiteettiin (ei muodonmuutosta).
d3d_transform_set_translation(xt,yt,zt) Asettaa muodonmuutokseen siirtymän ilmoitetun vektorin suuntaisesti.
d3d_transform_set_scaling(xs,ys,zs) Asettaa muodonmuutokseen skaalauksen annetuilla mittasuhteilla.
d3d_transform_set_rotation_x(angle) Asettaa muodonmuutokseen kierron x-akselin ympäri ilmoitetun arvon verran.
d3d_transform_set_rotation_y(angle) Asettaa muodonmuutokseen kierron y-akselin ympäri ilmoitetun arvon verran.
d3d_transform_set_rotation_z(angle) Asettaa muodonmuutokseen kierron z-akselin ympäri ilmoitetun arvon verran.
d3d_transform_set_rotation_axis(xa,ya,za,angle) Asettaa muodonmuutokseen kierron määritetyn vektorin ympäri ilmoitetun arvon verran.
d3d_transform_add_translation(xt,yt,zt) Lisää siirtymän ilmoitetun vektorin suuntaisesti.
d3d_transform_add_scaling(xs,ys,zs) Lisää skaalauksen annetuilla mittasuhteilla.
d3d_transform_add_rotation_x(angle) Lisää kierron x-akselin ympäri ilmoitetun arvon verran.
d3d_transform_add_rotation_y(angle) Lisää kierron y-akselin ympäri ilmoitetun arvon verran.
d3d_transform_add_rotation_z(angle) Lisää kierron z-akselin ympäri ilmoitetun arvon verran.
d3d_transform_add_rotation_axis(xa,ya,za,angle) Lisää kierron määritetyn vektorin ympäri ilmoitetun arvon verran.
Ota huomioon, että kierrot ja skaalaus tapahtuvat maailman keskipisteen (origon), eivät piirrettävän objektin suhteen. Jos objekti ei ole origossa, se siirtyy lisäksi toiseen paikkaan, mitä ei yleensä haluta tapahtuvan. Esimerkiksi objektin kiertämiseksi sen oman x-akselin ympäri täytyy ensin lisätä siirtymä, jolloin objekti siirtyy origoon, sitten se on kierrettävä ja lopuksi se on palautettava oikeaan sijaintiinsa. Tätä varten ovat siirtymien lisäämisfunktiot.

Seuraavat esimerkit saattavat selittää tätä paremmin. Oletetaan, että pelissä on kuva spr, jonka haluamme piirtää sijaintiin (100,100,10). Tämän tekemiseen voidaan käyttää seuraavaa koodia:

{
  d3d_transform_set_translation(100,100,10);
  draw_sprite(spr,0,0,0);
  d3d_transform_set_identity();
}

Huomaa, että koska käytetään siirtymää, kuva on piirrettänä nyt sijaintiin (0,0). (Tässä oletetaan, että nykyisen instanssin syvyys on 0!) Jos et ole varma, aseta ensin syvyys.) Jos tätä käytettäisiin first person shooter -pelissä, kuvaa ei olisi mahdollista nähdä. Tämän syy on, että se on edelleen xy-pinnan suuntainen. Tällöin halutaan kiertää sitä 90 asteen verran x-akselin (tai y-akselin) ympäri. On siis lisättävä kierto. Muista järjestys: ensin kuva on kierrettävä ja sitten siirrettävä. Seuraavaa koodia voidaan siis käyttää:

{
  d3d_transform_set_identity();
  d3d_transform_add_rotation_x(90);
  d3d_transform_add_translation(100,100,10);
  draw_sprite(spr,0,0,0);
  d3d_transform_set_identity();
}

Joskus halutaan väliaikaisesti tallentaa nykyinen muodonmuutos esimerkiksi ylimääräisen muodonmuutoksen lisäämiseksi ja sitten alkuperäisen palauttamiseksi (näin käy usein, kun piirretään hierarkkisia malleja). Tämän toteuttamiseksi voit työntää (push) nykyisen muodonmuutoksen pinoon ja sitten myöhemmin nostaa (pop) sen pinosta tehdäksesi siitä jälleen nykyisen muodonmuutoksen. Tähän tarkoitukseen on olemassa seuraavat funktiot:

d3d_transform_stack_clear() Tyhjentää muodonmuutospinon.
d3d_transform_stack_empty() Ilmoittaa, onko muodonmuutospino tyhjä.
d3d_transform_stack_push() Työntää nykyisen muodonmuutoksen pinoon. Palauttaa totuusarvon, joka ilmoittaa, oliko pinossa tarpeeksi tilaa uudelle lisätylle muodonmuutokselle (jos unohdat nostaa pinosta muodonmuutoksia, jossain vaiheessa pinosta loppuu säilytystila).
d3d_transform_stack_pop() Nostaa päällimmäisen muodonmuutoksen pinosta ja tekee siitä nykyisen muodonmuutoksen. Funktio palauttaa arvon, joka ilmoittaa, oliko pinossa muodonmuutoksia.
d3d_transform_stack_top() Tekee päällimmäisestä pinon muodonmuutoksesta nykyisen muodonmuutoken muttei poista sitä pinosta. Funktio palauttaa arvon, joka ilmoittaa, oliko pinossa muodonmuutoksia.
d3d_transform_stack_discard() Poistaa pinon päällimmäisen muodonmuutoksen pinosta, muttei tee siitä nykyistä muodonmuutosta. Funktio palauttaa arvon, joka ilmoittaa, oliko pinossa muodonmuutoksia.

Muodonmuutosten käyttäminen on tehokas mekanismi. Ole kuitenkin huolellinen ja aseta aina muodonmuutos takaisin identiteettiin, kun olet tehnyt tarvittavat muodonmuutokset.