Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: glRotatef(theta, 0.0f, 0.0f, 0.0f);

Sivun loppuun

Wusakko [09.06.2010 12:02:06]

#

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

os [10.06.2010 20:43:33]

#

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.

alottelijaa [10.06.2010 22:37:27]

#

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!

vehkis91 [10.06.2010 22:48:34]

#

Sun pitäis varmaan käyttää ensimmäistä noista versioista, mitä listasit tohon ylemmäs.

User137 [11.06.2010 09:46:25]

#

Jos ortho-moodi on käytössä eli perinteinen X,Y ja 2D niin Z-akselin ympäri pyöritetään (eli viimenen kolmesta).

alottelijaa [11.06.2010 17:13:52]

#

niinpä tietysti, tuli taas ajatuskatkos.

Wusakko [18.06.2010 14:41:34]

#

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/nyttvskartta.png

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

User137 [19.06.2010 12:09:56]

#

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


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta