Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ openGL animaatiota

tneva82 [09.02.2009 21:58:50]

#

Eli samainen projekti jatkuu. Nyt yritän saada yksinkertaista animaatiota kasaan. Ideana siis että tiedostoon pistetään jokaiselle framelle omat vertexien koordinaatit ja piirtäessä valitaan vain oikean animaation polygonit. So far so good. Homma myös toimii niinkauan kuin ei ole lisää frameja eli en onnistunut rikkomaan jo toimivaa systeemiä. Mutta nyt kun yritän lisätä frameja kuva välkkyy ja pahasti. Hyvä kun laatikkoa näkee. Oletan sen johtuvan siitä että valittu frame vaihtuu niin vikkelään että sitä ei ehdi huomata(FPS pyöriikin tuhansissa...).

Noh helppo homma luulin. Pistetään tarkistus että X määrä millisekuntteja pitää kulua ennenkuin piirrettävä frame piirretään. Toteutin sen näin:

now=SDL_GetTicks();
...Draw object
now=SDL_GetTicks();
      if(nextTime<= now) {
	currentFrame++;
	if(currentFrame>ownModel->frameCount-1) {
	  currentFrame=0;
	  }
	nextTime=now+TICK_INTERVAL;
      }

Mutta tuo ei ratkaisekkaan. Jos laitan esmes TICK_INTERVAL arvoksi 300 arkku näkyy pitkän odotuksen jälkeen, katoaa, palaa taas. Eli välkkyy mutta hitaammin. Pienempi arvo välkkyy tiheämmin.

Miten saisin sen piirtämään haluamani framen kokoajan mutta vaihtaen vain tietyin välein? Vai onko se alkuperäisen välkkymisen syy peräti jossain muualla?

Grey [09.02.2009 22:23:12]

#

Kenties kaksoispuskurointi voisi olla ratkaisu?..

-Grey-

tneva82 [09.02.2009 22:26:23]

#

lainaus:

Kenties kaksoispuskurointi voisi olla ratkaisu?..

-Grey-

Mielestäni openGL tekee sen vakiona kunhan sen laittaa päälle. Ainakin seuraavat koodit löytyvät ohjelmastani:

    /* Sets up OpenGL double buffering */
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
SDL_GL_SwapBuffers( );

(ja ei nuo EI ole peräkkäin koodissa oikeasti vaan eri kohtaa koodia ;-)

Sitäpaitsi kuva ei vilku ennenkuin lisää frameja objektiin. Yhdellä framella pelittää oikein mainiosti.

Metabolix [09.02.2009 22:39:42]

#

Luultavasti virhe on muualla framekoodissasi. Tuo kohta näyttäisi ihan oikealta, vaikka koodin siisteydessä kyllä on huimasti parantamista.

next_frame_time = SDL_GetTicks() + INTERVAL;
frame = 0;
while (1) {
  //...
  if (SDL_GetTicks() > next_frame_time) {
    next_frame_time += INTERVAL;
    frame = (frame + 1) % frame_count;
  }
}

Debug-mielessä voisit vaikka tulostella, mitä verteksejä oikein piirrät. Kokeile myös ottaa framea vaihtava koodi pois ja laittaa frame jo alussa toiseksi.

tneva82 [10.02.2009 09:39:18]

#

Jooph kyl siel jotain häikkää on. Tulee segmentation erroreja kun yritän tiedostoon tulostaa toisen framen sijaintia. Kas kun ei tule piirtäessä vaan ainoastaan tiedostoon kirjoittaessa.

Edit: Ja taisin jopa bongata missä vika. Nyt pitääkin keksiä ratkaisu siihen. Taitaa vaatia objektin lukurutiinin uudelleenjärjestämistä.

Edit3: Ongelma ratkaistu ja nyt koodi toimii niinkuin haluankin!

Edit2: Arvio oli oikea. Eli ongelma yksinkertaisuudessaan:

v -1.00000000 -1.00000000 1.00000000
v -1.00000000 1.00000000 1.10000000
v 1.00000000 1.00000000 1.10000000
v 1.00000000 -1.00000000 1.00000000
v -1.00000000 -1.00000000 -1.10000000
v -1.00000000 1.00000000 -1.00000000
v 1.00000000 1.00000000 -1.00000000
v 1.00000000 -1.00000000 -1.10000000
p 4 0 3 2 1 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0
p 4 0 4 7 3 1.0 1.0 0.0 1.0 0.0 0.0 1.0 0.0
p 4 1 5 4 0 1.0 1.0 0.0 1.0 0.0 0.0 1.0 0.0
p 4 2 6 5 1 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0
p 4 3 7 6 2 1.0 1.0 0.0 1.0 0.0 0.0 1.0 0.0
p 4 5 6 7 4 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0

Tuossa lukee vertexit oikein. Ongelma tulee polygoni ja frame lukuja lukiessa. eli tällä hetkellä polygonia lukiessa luon vain senhetkisen framen polygonien verteksi- ja UV taulukon. Sitten kun tulee f kirjain vastaan lisää framejen määrää. MUTTA p kirjaimia ei tulekkaan enää vastaan joten ei luokkaan uuden framen polygonien verteksejä. Hups! Eli pitää säätää lukijaa siten että se luo ne oikein. Voisin laittaa lukijan loppuun ja kopioida arvot alkuperäisestä(lisäten oikean indeksiarvon verteksejä varten mikä on helppo kaava.

Ja tuossa se vika on sillä kun kopioin p taulukot jokaisen framen loppuun animaatio pelitti komeasti.

Vastaus

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

Tietoa sivustosta