Opiskelen peliohjelmointia, mutta 3d-kurssit eivät ole vielä alkaneet. Käytämme koulussa koulun omaa 3d engineä, joka näyttää varsin tehokkaalta ja hyvältä, mutta sen tutoriaalit on melko lyhyehköjä; oletetaan että osataan 3d-ohjelmointia ja keskitytään vain pelimoottorin ominaisuuksiin.
NeHe:n OpenGL-tutoriaali vaikutti hyvältä, mutta on kuulemma vanhentunut, kun uudemmat OpenGL:t käyttää shadereita. Haluaisin siis jonkun tutoriaalin, jossa ei niinkään keskitytä kirjaston tai kielen ominaisuuksiin, vaan yksinkertaisesti tarvittavaan matematiikkaan 3d-ohjelmoinnissa. Matriisit on täysin tuntematon käsite, eikä oikein mistään tunnu löytyvän hyvin selitettyä esimerkkiä.
Olisiko kenelläkään ehdottaa jotain hyvää 3d-tutoriaalia, tälläiseen yleiseen 3d-opiskeluun. Mielellään OpenGL 3.0+ niin oppii sitä siinä ohessa.
Jos osaat vektorit perin pohjin, pystyt johtamaan kaiken tavallisessa 3D-grafiikassa tarvittavan. Tavalliset toimitukset (yhteenlasku, pistetulo, ristitulo ja näiden sovellukset) riittävät. Ohjelmointiputkassa oleva matematiikkaopas kertoo kaiken tarpeellisen, ja loppu on vain omasta opettelustasi ja ymmärryksestäsi kiinni (pelkkä lukeminen ei riitä).
Modernia OpenGL-ohjelmointia voi opiskella englanniksi esimerkiksi näistä oppaista:
GLSL-opiskelun tueksi sopii myös kirja OpenGL Shading Language.
Matriiseista ym. löytyy paljon materiaalia netistä jos niille tulee välttämätön tarve. Metabolixin mainitsemilla matematiikan tiedoilla pääsee kuitenkin jo hyvin pitkälle.
Muistetaanpa vielä mainita, että GLSL:n käyttö ei vaikuta mitenkään siihen, mitä matematiikkaa pitää osata ja miten mallin piirtäminen ja kameran pyöritys tapahtuvat. GLSL:ää käytetään vasta edistyneempiin asioihin kuten varjostukseen ja efekteihin.
punppis kirjoitti:
Matriisit on täysin tuntematon käsite
Metabolix kirjoitti:
Jos osaat vektorit perin pohjin
Mun mielestä outo oletus, että osaisi vektorit perin pohjin, jos matriisit on täysin tuntemattomia. Vektorihan on periaatteessa vaan 1*n matriisi.
Grez: ei tuo nyt mitenkään mahdotonta ole. Metabolixin mainitsemat asiat käydään läpi lukiossa, mutta matriiseja ei mainita sanallakaan (tai ainakaan ei mainittu kun itse kävin lukion).
Grez, preesens-aikamuodosta huolimatta en tarkoittanut, että punppis tällä hetkellä osaisi ne perin pohjin. Kyseinen aikamuoto toimii suomen kielessä myös futuurina. Varsinainen sanomani on siis "opettele vektorit; kun osaat ne" mutta sillä skeptisellä oletuksella, että opettelun lopputuloksena ei välttämättä synny oppimista, minkä vuoksi jossittelu on paikallaan.
Sisuaski on myös aivan oikeassa: Itse en ole koskaan varsinaisesti käyttänyt matriiseja enkä muista ulkoa edes, kummin päin matriisit merkitään eli miten kertolasku tapahtuu. Tämä ei estänyt päättelemästä, miten parilla yksinkertaisella vektorilaskutoimituksella pyöritetään pistettä mielivaltaisen akselin ympäri. Kerran jaksoin vääntää nuo laskuni sellaiseen muotoon, että sain palautettua pyörityksen 3×3-matriisiksi. Tosin kyseinen paperi taisi juuri mennä vihdoin siivouksessa roskiin. :)
OpenGL:n 3D-matematiikan tapauksessa olennaisin sisäistettävä asia on se, miten asioiden siirtelyä ja kääntelyä toistensa suhteen kolmiulotteisessa avaruudessa voidaan kuvata erilaisia koordinaatistomuunnoksia yhdistelemällä.
Koordinaatistomuunnosten ja OpenGL:n komentojen välisen yhteyden sisäistäminen on välttämätön edellytys OpenGL:n toiminnan syvällisempään ymmärtämiseen ja minusta matriisit, joiden avulla OpenGL:n geometriakomentojen toimintaa myös teknisesti määritellään, ovat luonteva työkalu asian hahmottamiseen.
Matriiseilla voi kuvata monia muitakin asioita, joten opettelussa kannattaa keskittyä 3D-geometrian kannalta olennaisiin asioihin, erityisesti 3D-lineaari- ja -affiinikuvausten esittämiseen matriisien avulla. Tässä pari hyvää sivua:
http://www.glprogramming.com/red/chapter03.html (erityisesti kohta "Viewing and Modeling Transformations")
http://en.wikipedia.org/wiki/
Kuvina oppii matematiikkaa joskus aika hyvin. Ei kaikkia laskutapoja jne tarvitse tietää kun vaan ymmärtää mitä tapahtuu.
Matriisin voi hahmottaa vaikka näin:
Meillä on 1 piste jossain avaruudessa ja siitä lähtee 3 janaa. Perusmatriisissa kaikkien janojen pituus on 1 ja ne ovat toisiinsa nähden 90 asteen kulmassa, kolmeen suuntaan.
That's it... Matriisi sarake sarakkeelta on todellakin 4 vektoria, ja ne on (left, up, front, position). Rotaatiomatriisi jota käytetään eniten, hyödyntää vain kolmea ensimmäistä ja paikkavektori on pelkkää nollaa.
Jos haluaisit saada objektin näkymään pystysuunnassa skaalattuna 2-kertaisena niin kerrot kaikki up-vektorin (3 lukua, xyz) arvot 2:lla.
Harmi kun suomipelit.com meni nurin. Siellä oli suomenkielinen "Matriisimatematiikkaa peliohjelmoijalle" artikkeli, joka oli oikeesti hyvä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.