Pelasin viime viikonloppuna Wings ykköstä ja kakkosta ja mietin, miten aluksien pyöritys on voitu toteuttaa? Olen tietoinen "rotozoomereista", mutta ensinnäkin tuossa vain pyöritetään alusta eikä zoomata, ja toiseksi eikös rotozoomaaminen ole varsin raskas operaatio toteutettavaksi usealle kappaleelle samanaikaisesti ruudulla?
Tiedän myös mahdollisuuden pyörittää kappaleita OpenGL-funktioilla, mutta Wings ykkönen ei varmaan käyttänyt OpenGL:ää? Miten tuollaisen DOS-ajan pelin pyöritys on voitu toteuttaa, jos ei rotozoomerilla?
Alukset on joko piirretty valmiiksi eri kulmissa (esim 32 eri kulmaa) suoraan kuvankäsittelyohjelmalla tai pyöritetty/"esirenderöity" valmiiksi spriteiksi ohjelmaa ladatessa yhden valmiiksi piirretyn kuvan perusteella. Tämä on varsin helppoa geometriaa, johon ei todellakaan tarvita OpenGL:ää.
Lisäksi useinmiten 90 ja 180 ( ja -90) asteen käännökset onnistuvat ihan jouhevasti "reaaliajassakin", jolloin noita ennalta laskettuja käännöskuvia ei tarvitse tehdä kuin välille 0-90. Yleensä 16 - 32 kpl riittää vallan mainiosti jo koko 360 asteen pyöräytykseen Wingsin grafiikan tasoiseen peliin.
Tässä vielä pseudokoodina kuvan kaksiulotteinen pyöritys:
jokaiselle mahdolliselle kulmalle, k : jokaiselle kuvapisteelle (x,y) : kuva_aluksessa_kulmassa[k] [x][y] = alkuperäinen_kuva_aluksesta[(x-x0)*cos(-k) - (y-y0)*sin(-k) + x0] [(x-x0)*sin(-k) + (y-y0)*cos(-k) + y0]
missä x0 ja y0 ovat aluksen keskipisteen kuvakoordinaatit.
Oikeaan koodiin kuulu tietenkin vielä pakollista säätöä kulmayksiköiden, kuvarajojen ja mahdollisesti interpoloinnin kanssa.
Kiitti nopeista vastauksista, mutta onko noi cosit ja sinit radiaanimuodossa vai tarviiko ne muuttaa asteiksi? Eikös math.h:n trigonometriset funktiot käytä radinaaneja?
Burton kirjoitti:
Eikös math.h:n trigonometriset funktiot käytä radinaaneja?
Kyllä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.