Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL & SDL 2D Animaatio

kayttaja-3842 [26.04.2007 15:23:35]

#

Joo, eli kysäisin tälläistä, eli minulla on kuva jossa on ukon kävely animaatio pätkä. Kuvat ovat peräkkäin kuin filminauhassa ja ennen pelkällä SDL:llä tehdessä tämän "parseeminen" tapahtui SDL_Rect:llä, mutta jos mukaan otetaan OpenGL, niin miten siinä tapahtuu tämä? Eli kuva laitetaan neiliön tekstuuriksi, mutta kuva pitäisi saada yksittäisinä kuten SDL_Rect:llä tehdään. Eli lyhyesti miten ,animaation teko onnistuu SDL ja OpenGL:Llä kun pelkällä SDL se tehdään SDL_Rect.

kayttaja-3842 [26.04.2007 17:07:31]

#

Itse sain nytten tehtyä jonkinmoisen funktion, mutta nytten tulos on jotain ihan omaa... :P

void GL_Piirto(){
  SDL_Surface *kuvapinta;
  Uint32 rmask;
  Uint32 gmask;
  Uint32 bmask;
  Uint32 amask;

    rmask = 0xff000000;
    gmask = 0x00ff0000;
    bmask = 0x0000ff00;
    amask = 0x000000ff;

  kuvapinta = SDL_CreateRGBSurface(SDL_HWSURFACE, 44, 42, 32,rmask, gmask, bmask, amask);
  kuva = SDL_LoadBMP("Data/mega_anim.bmp");
  PiirraSprite(kuvapinta,kuva,0,0,NULL,0);
  glEnable(GL_TEXTURE_2D);
    glMatrixMode( GL_TEXTURE ) ;
  glLoadIdentity() ;
  glGenTextures(1,&imagee);
  glBindTexture(GL_TEXTURE_2D, imagee);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, kuvapinta->w, kuvapinta->h, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, kuvapinta->pixels);
  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
}

Edit1: Tulos on tällänen: http://img230.imageshack.us/img230/2014/tulosmh1.gif

(Mod. Edit. Rajoitapa vähän välilyönnittömien rivien pituutta kirjoittaessasi, niin on mukavampi lukea...)

Pöytälamppu [26.04.2007 22:07:41]

#

Siis hetkinen... Suoritatko tuon ylläolevan koodin joka piirtokerralla vai vain kerran alussa? Miksi kutsut glMatrixMode(GL_TEXTURE)? Miten piirrät neliön?


Animaation piirto onnistuu siten että vaihdetaan neliön nurkkapisteiden tekstuurikoordinaatteja piirrossa. Eli jotenkin näin: (HUOM! olettaen että kuvat ovat vierekkäin kuvassa)

//Tätä kutsuttaessa on siis jo bindattu tekstuuri
void PiirraAnimaatio(int moneskoKuva,int monestakoKuvasta,
			float x,float y,float w,float h){
	float texX = float(moneskoKuva)/monestakoKuvasta;
	float kuvanLeveys = 1.0f/monestakoKuvasta;


	glBegin(GL_QUADS);
	glTexCoord2f(texX,0);
	glVertex2f(x,y);

	glTexCoord2f(texX,1);
	glVertex2f(x,y+h);

	glTexCoord2f(texX+kuvanLeveys,1);
	glVertex2f(x+w,y+h);

	glTexCoord2f(texX+kuvanLeveys,0);
	glVertex2f(x+w,y);
	glEnd();
}

Legu [26.04.2007 22:12:38]

#

No mitä tuossa nyt on vikana, niin ainakin tekstuurin pitää olla kakkosen potenssi. Lataa se kuva vaikka niin kuin tässä. Kun sitten olet sen ladannut (huom. koko animaation, ei mitään osia siitä), niin tuo pelkän yhden kuvan piirtäminen on sitten helppoa:

glBindTexture( GL_TEXTURE_2D, texturen_id );

glBegin( GL_QUADS );
	glTexCoord2f( 0.0f, 0.0f );
	glVertex3f( ..., ..., ... );

	glTexCoord2f( 0.5f, 0.0f );
	glVertex3f( ... );

	glTexCoord2f( 0.5f, 0.5f );
	glVertex3f( ... );

	glTexCoord2f( 0.0f, 0.5f );
	glVertex3f( ... );
glEnd();

Tuossa se nyt ottaisi yhden kulman kuvasta (1/4). Kokeilemalla/Googlella varmaan löytyy, että miten sen sitten saat haluamaksesi.

Hidas

Vastaus

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

Tietoa sivustosta