Moro!
Kielenä C++
Kirjastona OpenGl
Eli siis minulla on pieni ongelma tuon glRotatef-funktiosta kanssa. Piirrän ruudulle kolmion ja se kuvaa pientä alustani. Sitten luen hiiren sijainnin ja yritän kääntää alusta hiiren suuntaan, mutta alus kallistuu oudosti.
glRotatef(kulma, 1.0f, 0.0f, 0.0f); Muuttaisi aluksen kulmaa ihan oikein x-suunnassa
glRotatef(kulma, 0.0f, 1.0f, 0.0f); Muuttaisi aluksen kulmaa ihan oikein y-suunnassa
glRotatef(kulma, 0.0f, 0.0f, 1.0f); Pitäisi pyörittää alusta
Käytän koodissani juuri tuota viimeistä funktiota. Alukseni keula tähtää kohti hiirtä, mutta alus kallistuu jännästi (niinkuin toisi automaattisesti kolmiulotteista tuntumaa, vaikka en sitä halua).
Voisiko joku kertoa mistä kallistus johtuu? Ja kuinka sen voisi korjata tai korvata?
Kiitos jo etukäteen!
Wusakko
Tuosta selityksestä ei nyt vielä oikein ota selvää. Kannattaa tarkistaa, missä järjestyksessä kutsut GL-funktioita, kuten glRotate
, glTranslate
, gluLookAt
tai glBegin(GL_TRIANGLES)
...glEnd()
.
Järjestyksellä on olennainen merkitys ja ongelmasi liittyy luultavasti tähän. OpenGL on matalan tason 3D-rajapinta, joka tekee 3D-maailman hallintaan liittyen hyvin vähän asioita puolestasi.
tuosta ei pahemmin auennut teetkö 2d vai 3d peliä.
Wusakko kirjoitti:
Alukseni keula tähtää kohti hiirtä, mutta alus kallistuu jännästi (niinkuin toisi automaattisesti kolmiulotteista tuntumaa, vaikka en sitä halua).
- mitä tarkoitat kolmiulotteisella tuntumalla? Tuo pitäisi pyörittää z akselia
Mod. lisäsi lainaustagit, käytä itsekin!
Sun pitäis varmaan käyttää ensimmäistä noista versioista, mitä listasit tohon ylemmäs.
Jos ortho-moodi on käytössä eli perinteinen X,Y ja 2D niin Z-akselin ympäri pyöritetään (eli viimenen kolmesta).
niinpä tietysti, tuli taas ajatuskatkos.
Sain toimimaan! Pelihän on siis 2D. Olin tehnyt Dev-C++ projectin, jossa oli yhdistettynä SDL ja OpenGL. Mutta kun tein vain OpenGL projectin niin sama koodinpätkä käyttäytyi eri tavalla. Luultavasti olen jättänyt jotain alustuksia laittamatta alkuun tai jotain mitä olisi tarvittu SDL:n ja OpenGL yhdistämiseen.
(Ihmeellisesti kyllä käyttäytyi:
Z-akselia pyörittäessä kolmion tosiaan kallistui hieman.)
Edit: Lisää asiaa ja kysymyksiä
Piirtelin paintilla "taidokkaan" kuvasen projectistani:
http://img692.imageshack.us/img692/1513/
En oikein osaa selittää ongelmaani, mutta yritetään.
Oletetaan että alus on koordinaateissa 10,10 ja seinä 10,20.
Alukseni ei liiku näytöllä vaan ns. kartta liikkuu (Tarkoitan tuolla vain sitä, että alukseni on aina keskellä näyttöä). Kuinka saan suhteutettua koordinaatit näytön -1 ja 1 välille?
Sitten mietin tässä vähä tulevaakin:
Teen alukselle muuttujia, jotka kertovat sen sijainnista. Keskipisteen lisäksi teen myös kolme muuttujaa, jotka kuvaavat kolmion kärkiä. Ideana tässä olisi se että voisin sitte tarkastella ammusten osumia alukseen(mikäli ammuksen koordinaatit ovat kolmion rajojen sisällä - osuu ammus alukseen).
Itse pelikentän (taulukon) kooksi ei taida riittää 100x100? :D
Alukseni kääntyileen noin asteen tarkkuudella ja jo pelkästään alukseni täyttävää koordinaatistoa pitäisi varmaan kuvata joku 1000*1000 kokoinen taulukko, jotta ammusten osumat olisivat mahdollisimman tarkkoja. Onko totta, että tämäntyylisissä peleissä on tautalla kaks ulotteinen taulukko joka on todella suuri kokoluokaltaan?
Voisin toki tehdä kaikista objecteista oliot ja sitten ammuksen liikkuessa tarkastaisin onko mikään seinä tai alus edessä. Tämä kylläkin vie melko paljo tehoja, kun objecteja on suuri määrä.
Vai onko kumpikaan näistä oikea ratkaisu?
Tai onko mitään muita vinkkejä aloittelevalle tähän liittyen?
Wusa
Onko OpenGL käsky glScale() tuttu? Se varmaan ratkasee tuon piirto-ongelman.
1000x1000 taulukot alkaa olla jo niillä rajoilla että voi miettiä muita vaihtoehtoja. Törmäyksiä jne voi tehdä myös matemaattisesti ilman mitään ruudukoita. Siinä käytetään mm. monikulmioita ja vektoreita. Esim on olemassa nopeita funktioita jotka osaa suoraan sanoa onko piste kolmion sisällä ja siitä voit päätellä osuuko luoti alukseen.
Kolmantena asiana, jos koordinaatistosi todella on -1 .. 1 niin sun piirtotila on edelleen perspektiivinen. Jos teet 2D peliä niin käytä ortho-moodia jolloin koordinaatit menee 0..leveys x 0..korkeus.
Ja nimenomaan leveys, ei leveys-1, sillä jos haluat piirtää pikselin vasempaan alakulmaan niin se tapahtuu neliönä jonka kulmat on 0,0 - 1,1
Aihe on jo aika vanha, joten et voi enää vastata siihen.