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