Lekce 4

Lekce 4 - Rotace

NauΦφme se, jak otßΦet objekt okolo os. Troj·helnφk se bude otßΦet kolem osy y a Φtverec kolem osy x. Je jednoduchΘ vytvo°it scΘnu z polygon∙. P°idßnφ pohybu ji p∞kn∞ o₧ivφ.

ZaΦneme p°idßnφm dvou prom∞nn²ch pro ulo₧enφ rotace ka₧dΘho objektu. Deklarujeme je jako globßlnφ na zaΦßtku programu. Brzy zjistφte, ₧e desetinnß Φφsla jsou nezbytnß k programovßnφ v OpenGL.

GLfloat rtri;// ┌hel pro troj·helnφk

GLfloat rquad;// ┌hel pro Φtverec

P°epφÜeme funkci DrawGLScene, kterß slou₧φ pro vykreslovßnφ.

int DrawGLScene(GLvoid)// Vykreslovßnφ

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Vyma₧e obrazovku a hloubkov² buffer

glLoadIdentity();// Reset matice

glTranslatef(-1.5f,0.0f,-6.0f);// Posun doleva a do hloubky

Nßsledujφcφ Φßst k≤du je novß. Funkce glRotatef(uhel, x_vektor, y_vektor, z_vektor) je odpov∞dnß za rotaci sou°adnicov²ch os. Budete ji Φasto pou₧φvat. Uhel je Φφslo (obvykle ulo₧enΘ v prom∞nnΘ), kterΘ urΦuje o kolik stup≥∙ chcete otoΦit objektem. Parametry x_vektor, y_vektor a z_vektor dohromady se souΦasn²m poΦßtkem sou°adnic urΦujφ vektor okolo kterΘho se objekt bude otßΦet.

Pro lepÜφ vysv∞tlenφ uvedu vysv∞tlenφ na p°φkladech: Osa x - P°edstavte si, ₧e stojφte u vodorovnΘ desky a chcete jφ otoΦit. Pokud zadßte kladnou rotaci [1,0,0] zvedß se vzdßlen∞jÜφ Φßst desky a bli₧Üφ klesß. P°i zßpornΘ rotaci [-1,0,0] je to naopak. Osa y - Op∞t stejnß deska. P°i kladnΘ rotaci [0,1,0] se pravß Φßst desky pohybuje od vßs a levß Φßst desky k vßm. P°i zßpornΘ rotaci [0,-1,0] je to naopak. Osa z - Op∞t stejnß deska. P°i kladnΘ rotaci [0,0,1] se zvedß pravß Φßst desky a levß klesß a p°i zßpornΘ [0,0,-1] je to naopak.

Pokud bude rtri 7, nßsledujφcφm °ßdkem pootoΦφme troj·helnφkem o 7░ okolo osy y proti sm∞ru hodinov²ch ruΦiΦek.

glRotatef(rtri,0.0f,1.0f,0.0f);// OtoΦφ troj·helnφk okolo osy y

DalÜφ Φßst k≤du z∙stßvß nezm∞n∞na. Vykreslφ vybarven² troj·helnφk. Tentokrßt ale dφky p°edchßzejφcφmu °ßdku pootoΦen² okolo osy y.

glBegin(GL_TRIANGLES);// ZaΦßtek kreslenφ troj·helnφk∙

glColor3f(1.0f, 0.0f, 0.0f);// ╚ervenß barva

glVertex3f(0.0f, 1.0f, 0.0f);// Hornφ bod

glColor3f(0.0f, 1.0f, 0.0f);// Zelenß barva

glVertex3f(-1.0f, -1.0f, 0.0f);// Lev² dolnφ bod

glColor3f(0.0f, 0.0f, 1.0f);// Modrß barva

glVertex3f(1.0f, -1.0f, 0.0f);// Prav² dolnφ bod

glEnd();// UkonΦenφ kreslenφ troj·helnφk∙

Jist∞ si v nßsledujφcφm k≤du vÜimnete, ₧e jsme p°idali dalÜφ volßnφ funkce glLoadIdentity(). Proto₧e byly osy pootoΦeny neukazujφ do sm∞r∙, kterΘ p°edpoklßdßte. Tak₧e pokud posouvßme okolo osy x, m∙₧eme skonΦit posouvßnφm ve sm∞ru p∙vodnφ osy z, zßle₧φ na tom, jak moc jsme pootoΦili. Zkuste odstranit °ßdek s volßnφm glLoadIdentity(), a¥ vidφte co myslφm. Jakmile mßme resetovßno mφ°φ osy op∞t p∙vodnφmi sm∞ry, tj. x - zleva doprava, y - zdola nahoru, z - z obrazovky k vßm. VÜimn∞te si, ₧e posouvßme jen o 1,5 na ose x narozdφl od posunu o 3 z p°edchozφ Φßsti. Kdy₧ resetujeme, posune se poΦßtek zpßtky do st°edu obrazovky.

glLoadIdentity();// Reset matice

glTranslatef(1.5f,0.0f,-6.0f);// Posun poΦßtku

glRotatef(rquad,1.0f,0.0f,0.0f);// PootoΦenφ Φtverce okolo osy x

Vykreslenφ je stejnΘ jako v p°edchßzejφcφ Φßsti. Op∞t vykreslφ Φtverec, ale tentokrßt pootoΦen².

glColor3f(0.5f,0.5f,1.0f);// Sv∞tle modrß barva

glBegin(GL_QUADS);// ZaΦßtek kreslenφ obdΘlnφk∙

glVertex3f(-1.0f, 1.0f, 0.0f);// Lev² hornφ bod

glVertex3f( 1.0f, 1.0f, 0.0f);// Prav² hornφ bod

glVertex3f( 1.0f,-1.0f, 0.0f);// Prav² dolnφ bod

glVertex3f(-1.0f,-1.0f, 0.0f);// Lev² dolnφ bod

glEnd();// Konec kreslenφ obdΘlnφk∙

Po ka₧dΘm zobrazenφ se zm∞nφ prom∞nnΘ rtri a rquad, ve kter²ch jsou ulo₧eny hodnoty pootoΦenφ troj·helnφku a Φtverce. Zm∞nou znamφnka m∙₧ete zm∞nit smysl rotace. Zm∞nou velikosti p°iΦφtan²ch hodnot m∙₧ete zm∞nit rychlost rotace.

rtri+=0.2f;// Inkrementace ·hlu pootoΦenφ troj·helnφku

rquad-=0.15f;// Inkrementace ·hlu pootoΦenφ Φtverce

return TRUE;// UkonΦenφ funkce

}

Doufßm, ₧e jste pochopili, ₧e se vÜe vykresluje po°ßd stejn∞, sou°adnice bod∙ se nikdy nem∞nφ. Poka₧dΘ se pouze liÜφ poΦßtek sou°adnicov²ch os, jejich natoΦenφ nebo m∞°φtko - glScalef(x,y,z). Pokud chcete, aby se objekt otßΦel okolo svΘ osy, umφst∞te ho okolo poΦßtku nebo alespo≥ na jednu ze sou°adnicov²ch os - tato lekce. P°i jinΘm umφst∞nφ bude chaoticky lΘtat po scΘn∞.

TakΘ je d∙le₧itΘ, zda nap°ed provedete translaci nebo rotaci. P°i poΦßteΦnφm pootoΦenφ budou osy sm∞°ovat jinam ne₧ oΦekßvßte a nßslednΘ posunutφ skonΦφ ·pln∞ n∞kde jinde ne₧ chcete.

napsal: Jeff Molofee - NeHe
p°elo₧il: Milan Turek

ZdrojovΘ k≤dy

Lekce 4

<<< Lekce 3 | Lekce 5 >>>