Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: OpenGL ja kääntyily

Heikki [13.04.2005 21:09:30]

#

Olen tässä OpenGL:ää hieman opetellut, ja nyt minulla on tällainen pikkuinen ongelma.

Eli, minulla on polygoneista koostuva 3d-maailma (luen kolmioiden kärkipisteet + tiedot teksturoinnista tiedostosta), jossa yritän mahdollistaa liikkumisen kuten fps-räiskinnöissä eli "hahmon silmistä" kuvattuna.

No, pystyn liikkumaan maailmassa eteen-taaksepäin, mutta kääntyily tuottaa ongelmia. Tällä hetkellä kääntäminen hoituu näin:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, 640.0/480.0, 1, 99);

// Aseta modelview-matriisi
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glRotatef(kulma,0,1.0f,0);

Kulma kasvaa oikealle painettaessa ja vähenee vasemmalle painettaessa.

No, tuo kääntyilyhän ei toimi kunnolla. Ainoastaan jos olen ihan keskellä maailmaa syntyy vaikutelma että "pelaaja" kääntyisi. Muuaalla tuo kääntyminen aiheuttaa omituisen efektin, jossa vaikuttaa siltä että pelaaja pyörii maailman ympäri.

Eli yksinkertaisesti, miten saan pyöritettyä maailmaa siten, että pyöritysakseli (oikea sana?) on hahmon (eli kameran) kohdalla?

Metabolix [13.04.2005 21:32:57]

#

Varmista, glRotate on ennen glTranslatea. Kääntyminen tapahtuu ilmeisesti aina (0,0,0):n ympäri.

Heikki [13.04.2005 21:47:25]

#

Kiitoksia, glTranslate oli ensin, nyt onnistuu tuo kääntyminen, MUTTA:
Nyt sitten jos käännän "hahmoa" vaikka 90 astetta oikealle ja sitten painat eteenpäin, tyyppi kävelee sivuttain. Saakos tätä jollain yksinkertaisella komennolla korjattua vai täytyykö alkaa laskemaan erikseen liikkuminen x-, y- ja z-suunnissa?

Metabolix [13.04.2005 22:25:16]

#

Paras tapa on luonnollisesti se, että säilytät jossakin tyypin koordinaatteja ja suuntakulmia, lasket sinin ja kosinin avulla normalisoidun liikesuunnan, ja liikut sen mukaan. Tässä tavassa on etuna se, että tyypin sijainti on jatkuvasti tiedossa, ja tätä on pakko käyttää, jos haluaa jonkinlaista peliä ja törmäystarkistusta tehdä.

Vaikka voisit kameraa liikuttaa suoraan (jos voisit), et saisi koordinaattejasi selville (ainakaan kovin helposti), joten kaikki jäisi vain liikkumisen tasolle (ei törmäyksiä yms).

Liikkuvan pisteen toteutukseen olen todennut hyväksi luokan, jonka varsinaiset ominaisuudet ovat suunnan muuttaminen ja määrättyyn suuntaan liikkuminen. Suunta on varmaankin kätevintä määrittää kahdella muuttujalla: kulma sivusuunnassa ja kulma vaakatasosta ylös/alas. Tämän perusteella kannattaa laskea valmiiksi vektori, jottei kallista prosessoritehoa kulu jatkivasti sinien ja kosinien vääntöön. Liikkumisfunktio sitten lisää kuhunkin koordinaattiin liikevektorin vastaavan arvon (kerrottuna liikkeen määrällä). Tällaisella vehkeellä pääsee yllättävän pitkälle, ja kun sen on kerran tehnyt, sitä voi aina käyttää.

Heikki [14.04.2005 06:59:31]

#

Kiitoksia, täytyykin yrittää saada tuollainen systeemi aikaan.

Vastaus

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

Tietoa sivustosta