Maailman katseleminen

Oletuksena katselet pitkin negatiivista z-akselia kohti huoneen keskipistettä. 3D-peleissä halutaan usein muuttaa tapaa, jolla maailmaa katsellaan. Esimerkiksi first person shooter -peleissä haluat todennäköisesti kameran katsovan hieman xy-pinnan yläpuolelta xy-pinnan suuntaisesti. Graafiikkatermeillä puhuttaessa asetat tällöin oikean projektion. Muuttaaksesi maailman katsomistapaa voit käyttää seuraavia kahta funktiota.

d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup) Määrittää, millä tavoin maailmaa katsellaan. Sinun on määritettävä piste, josta katsellaan, piste, jota kohti katsellaan, ja ylävektori.

Tämä funktio vaatinee hieman selittämistä. Säätääksesi projektion sinun on ensin tiedettävä, mistä pisteestä maailmaa katsellaan. Tämä määritetään parametreillä (xfrom,yfrom,zfrom). Sitten sinun on määriteltävä suunta, johon katselet. Tämä tehdään antamalla toinen piste, johon katsotaan. Tämä on piste (xto,yto,zto). Lopuksi voit vielä kääntää kameraa katselupisteen ja katsottavan pisteen välisen viivan ympäri. Tämän määrittämiseksi on annettava ylävektori, joka on suunta kamerasta ylöspäin. Tämä tulee antaa kolmella viimeisellä parametrillä (xup,yup,zup). Tässä yksinkertainen esimerkki: katsoaksesi pitkin xy-pintaa, kuten first person shooter -peleissä, voit käyttää seuraavaa koodia:

{
  d3d_set_projection(100,100,10,200,100,10,0,0,1);
}
Katselet siis pisteestä (100,100) 10 yksikköä levyn yläpuolella suuntaan (200,100). Ylävektoripisteet määrittävät z-suunnan olevan ylöspäin, kuten on tarkoitus. Jos teemme tästä vielä hieman mutkikkaampaa, oletetaan, että huoneessasi on instanssi, joka määrittää kameran sijainnin. Sillä on nykyinen (x,y) -sijainti ja suunta (ja jopa nopeus). Voit nyt määritellä tämän kuin instanssin kameraksesi käyttämällä seuraavaa koodia:

{
  with (obj_camera)
    d3d_set_projection(x,y,10,
               x+cos(direction*pi/180),y-sin(direction*pi/180),10,
               0,0,1);
}

Tämä saattaa näyttää hieman monimutkaiselta. Katsomme kameran sijainnista (x,y) 10 yksikköä maanpinnan yläpuolella. Selvittääksemme pisteen oikeaan suuntaan meidän on laskettava joitakin aritmeettisia laskuja. Tämä piste on määritetty seuraavassa kolmessa parametrissä. Lopuksi käytämme ylävektoria kuten aiemminkin.

Tärkeä huomautus! Kun Game Maker aloittaa piirtämään huonetta, se asettaa kuvakulman pisteen takaisin oletussijaintiin. Ensimmäinen asia, joka sinun tulee tehdä piirrettäessä tapahtumapaikkaa on siis asettaa haluamasi projektio. Tämä tulee tehdä piirtotapahtumassa (Draw)!

Yllä olevasta funktiosta on olemassa laajempi versio:

d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,angle,aspect,znear,zfar) Laajennettu versio samasta funktiosta, jossa voit myös määrittää kuvakulman alan määrittävän kulman, kuvakulman vaaka- ja pystysuuntaisen koon suhteen ja lähemmän ja kauemman leikkauspinnan.

Lisäparametrit toimivat seuraavasti. Vaikka määrittelitkin kameran sijainnin, pisteen, jonne katsotaan, ja ylävektorin, voit edelleen määrittää, kuinka leveä kameran linssi on. Tätä kutsutaan kuvakulman alaksi. Järkevä arvo on 45 astetta, joka on myös oletusarvo. Voit kuitenkin muuttaa sitä, jos niin haluat. Seuraavaksi voit asettaa vaaka- ja pystysuuntaisen projektion välisen suhdeluvun. Normaalisti haluat käyttää samaa suhdelukua kuin mikä on huoneen tai kuvakulman koko, esimerkiksi 640/480. Lopuksi voit määrittää pinnat. Objekteja, jotka ovat lähempänä kuin znear kameraan nähden ei piirretä lainkaan. Sama tapahtuu objekteille, jotka ovat kauempana kuin zfar. Voi olla erittäin tärkeää asettaa näihin parametreihin järkevät arvot, koska ne vaikuttavat myös z-vertailun tarkkuuteen. Jos asetat arvot liian suuriksi, tarkkuus huononee. Oletusarvoiset luvut ovat 1 ja 32000. znear-parametrin on oltava suurempi kuin 0!

Joskus tarvitset väliaikaisesti normaalia ortografista projektiota, jota käytetään kun peli ei ole 3D-tilassa. Voit myös haluta palata takaisin aloittaessa käytettyyn perspektiiviseen projektioon. Tätä varten voit käyttää seuraavia funktioita:

d3d_set_projection_ortho(x,y,w,h,angle) Asettaa normaalin ortografisen projektion määritetylle alueelle huoneessa, käännettynä määritetyn kulman verran.
d3d_set_projection_perspective(x,y,w,h,angle) Asettaa normaalin projektion määritetylle alueelle huoneessa, käännettynä määritetyn kulman verran.

Tämän tavallinen käyttötapa on esimerkiksi pisteiden tai muiden tilastojen piirtäminen ruudun päälle. Tämän toteuttamiseksi on asetettava ortografinen projektio käyttöön. Meidän on myös väliaikaisesti asettava piilopintojen poistaminen pois päältä, koska haluamme, että tiedot piirtyvät ruudulle nykyisestä piirtosyvyydestä huolimatta. Seuraava esimerkki näyttää, kuinka näytetään pisteet ruudun päällä.

{
  draw_set_color(c_black);
  d3d_set_projection_ortho(0,0,room_width,room_height,0);
  d3d_set_hidden(false);
  draw_text(10,10,'Score: ' + string(score));
  d3d_set_hidden(true);
}