Lekce 5

Lekce 5 - PevnΘ objekty

RozÜφ°enφm poslednφ Φßsti vytvo°φme skuteΦnΘ 3D objekty. Narozdφl od 2D objekt∙ ve 3D prostoru. Zm∞nφme troj·helnφk na pyramidu a Φtverec na krychli. Pyramida bude vybarvena barevn²m p°echodem a ka₧dou st∞nu krychle vybarvφme jinou barvou.

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

glRotatef(rtri,0.0f,1.0f,0.0f);// OtoΦφ pyramidu okolo osy y

╚ßst k≤du vezmeme z p°edchozφ Φßsti a vyrobφme pomocφ n∞j 3D objekt. Je jedna v∞c na kterou jsem Φasto dotazovßn. ProΦ se objekty neotßΦejφ okolo svΘ osy. Vypadß to jako by se lΘtaly po celΘ obrazovce. Pokud objektu °eknete, aby se otoΦil okolo osy, otoΦφ se okolo osy sou°adnicovΘho systΘmu. Pokud chcete, aby se rotoval okolo svΘ osy, musφte dßt poΦßtek sou°adnic do jeho st°edu nebo aspo≥ tak, aby se sou°adnicovß osa, okolo kterΘ otßΦφte, kryla s osou objektu okolo kterΘ chcete otoΦit.

Nßsledujφcφ k≤d vytvo°φ pyramidu okolo centrßlnφ osy. Vrcholek pyramidy je o jednu naho°e od st°edu, spodek o jednu dol∙. Vrchnφ bod je vpravo uprost°ed a dolnφ body jsou vpravo a vlevo od st°edu. VÜimn∞te si, ₧e vÜechny troj·helnφky jsou kresleny ve sm∞ru proti hodinov²m ruΦiΦkßm. Je to d∙le₧itΘ a bude to vysv∞tleno v dalÜφch lekcφch - nap°. lekce 11. Te∩ si pouze zapamatujte, ₧e je dobrΘ kreslit po sm∞ru nebo proti sm∞ru hodinov²ch ruΦiΦek a pokud k tomu nemßte d∙vod, nem∞li byste dv∞ osy prohodit. ZaΦneme kreslenφm Φelnφ st∞ny. Proto₧e vÜechny sdφlφ hornφ bod, ud∞lßme jej u vÜech st∞n Φerven². Barvy na spodnφch vrcholech se budou st°φdat. ╚elnφ st∞na bude mφt lev² bod zelen² a prav² modr². Troj·helnφk na pravΘ stran∞ bude mφt lev² bod modr² a prav² zelen². Prohozenφm dolnφch dvou barev na ka₧dΘ st∞n∞ ud∞lßme spoleΦn∞ vybarvenΘ vrcholy na spodku ka₧dΘ st∞ny.

glBegin(GL_TRIANGLES);// ZaΦßtek kreslenφ pyramidy

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

glVertex3f(0.0f,1.0f,0.0f);// Vrchol troj·helnφku (Φelnφ st∞na)

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

glVertex3f(-1.0f,-1.0f, 1.0f);// Lev² spodnφ bod troj·helnφku (Φelnφ st∞na)

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

glVertex3f( 1.0f,-1.0f, 1.0f);// Prav² spodnφ bod troj·helnφku (Φelnφ st∞na)

Vykreslφme pravou st∞nu. Spodnφ body kreslφme vpravo od st°edu a hornφ bod je kreslen o jedna na ose y od st°edu a prav² st°ed na ose x. To zp∙sobuje, ₧e se st∞na sva₧uje od hornφho bodu doprava dol∙. Lev² bod je tentokrßt modr² stejn∞ jako prav² dolnφ bod Φelnφ st∞ny, ke kterΘmu p°ilΘhß. ZbylΘ t°i troj·helnφky kresleny ve stejnΘm glBegin(GL_TRIANGLES) a glEnd() jako prvnφ troj·helnφk. Proto₧e d∞lßm cel² objekt z troj·helnφk∙, OpenGL vφ, ₧e ka₧dΘ t°i body tvo°φ troj·helnφk. Jakmile nakreslφte t°i body a p°idßte dalÜφ body, OpenGL p°edpoklßdß, ₧e je t°eba kreslit dalÜφ troj·helnφk. Pokud zadßte Φty°i body mφsto t°φ, OpenGL pou₧ije prvnφ t°i a bude p°edpoklßdat, ₧e Φtvrt² je zaΦßtek dalÜφho troj·helnφku. Nevykreslφ Φtverec. Proto si dßvejte pozor, aby jste nßhodou nep°idali n∞jak² bod navφc.

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

glVertex3f( 0.0f, 1.0f, 0.0f);// Hornφ bod (pravß st∞na)

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

glVertex3f( 1.0f,-1.0f, 1.0f);// Lev² bod (pravß st∞na)

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

glVertex3f( 1.0f,-1.0f, -1.0f);// Prav² bod (pravß st∞na)

Te∩ vykreslφme zadnφ st∞nu. Op∞t prohozenφ barev. Lev² bod je op∞t zelen², proto₧e odpovφdajφcφ prav² bod je zelen².

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

glVertex3f( 0.0f, 1.0f, 0.0f);// Hornφ bod (zadnφ st∞na)

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

glVertex3f( 1.0f,-1.0f, -1.0f);// Lev² bod (zadnφ st∞na)

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

glVertex3f(-1.0f,-1.0f, -1.0f);// Prav² bod (zadnφ st∞na)

Nakonec nakreslφme levou st∞nu pyramidy. Proto₧e pyramida rotuje okolo osy Y, nikdy neuvidφme podstavu. Pokud chcete experimentovat, zkuste p°idat ji p°idat. Potom pootoΦte pyramidu okolo osy x a uvidφte zda se vßm to povedlo.

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

glVertex3f( 0.0f, 1.0f, 0.0f);// Hornφ bod (levß st∞na)

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

glVertex3f(-1.0f,-1.0f,-1.0f)// Lev² bod (levß st∞na)

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

glVertex3f(-1.0f,-1.0f, 1.0f);// Prav² bod (levß st∞na)

glEnd();// Konec kreslenφ pyramidy

Te∩ vykreslφme krychli. Je tvo°ena Üesti Φtverci, kterΘ jsou kresleny op∞t proti sm∞ru hodinov²ch ruΦiΦek. To znamenß, ₧e prvnφ bod je prav² hornφ, druh² lev² hornφ, t°etφ lev² dolnφ a Φtvrt² prav² dolnφ. Kdy₧ kreslφme zadnφ st∞nu, m∙₧e to vypadat, ₧e kreslφme ve sm∞ru hodinov²ch ruΦiΦek, ale pamatujte, ₧e jsme za krychlφ a dφvßme se sm∞rem k Φelnφ st∞n∞. Tak₧e levß strana obrazovky je pravou stranou Φtverce. Tentokrßt posouvßme krychli trochu dßl. Tφm velikost vφce odpovφdß velikosti pyramidy a Φßsti mohou b²t o°φznuty okraji obrazovky. M∙₧ete si pohrßt s nastavenφm poΦßtku a uvidφte, ₧e posunutφm dßle se zdß menÜφ a naopak. D∙vodem je perspektiva. Vzdßlen∞jÜφ objekty se zdajφ menÜφ.

glLoadIdentity();// Reset matice

glTranslatef(1.5f,0.0f,-7.0f);// Posun poΦßtku vpravo a dozadu

glRotatef(rquad,1.0f,1.0f,1.0f);// Rotace okolo x, y, a z

ZaΦneme kreslenφm vrcholku krychle. VÜimn∞te si, ₧e sou°adnice y je v₧dy jedna. Tφm kreslφme st∞nu rovnob∞₧n∞ s rovinou xz. ZaΦneme prav²m hornφm bodem. Ten je o jedna vpravo a o jedna dozadu. DalÜφ bod je o jedna vlevo a o jedna dozadu. PotΘ vykreslφme spodnφ Φßst Φtverce sm∞rem k pozorovateli. Abychom toho dosßhli, narozdφl od posunu do obrazovky, posuneme se o jeden bod z obrazovky.

glBegin(GL_QUADS);// ZaΦßtek kreslenφ krychle

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

glVertex3f( 1.0f, 1.0f,-1.0f);// Prav² hornφ bod (hornφ st∞na)

glVertex3f(-1.0f, 1.0f,-1.0f);// Lev² hornφ bod (hornφ st∞na)

glVertex3f(-1.0f, 1.0f, 1.0f);// Lev² dolnφ bod (hornφ st∞na)

glVertex3f( 1.0f, 1.0f, 1.0f);// Prav² dolnφ bod (hornφ st∞na)

Spodnφ Φßst krychle se kreslφ stejn²m zp∙sobem, jen je posunuta na ose y do -1. DalÜφ zm∞na je, ₧e prav² hornφ bod je tentokrßt bod bli₧Üφ k vßm, narozdφl od hornφ st∞ny, kde to byl bod vzdßlen∞jÜφ. V tomto p°φpad∞ by se nic nestalo pokud by jste pouze zkopφrovali p°edchozφ Φty°i °ßdky a zm∞nili hodnotu y na -1, ale pozd∞ji by vßm to mohlo p°inΘst problΘmy nap°φklad u textur.

glColor3f(1.0f,0.5f,0.0f);// Oran₧ovß

glVertex3f( 1.0f,-1.0f, 1.0f);// Prav² hornφ bod (spodnφ st∞na)

glVertex3f(-1.0f,-1.0f, 1.0f);// Lev² hornφ (spodnφ st∞na)

glVertex3f(-1.0f,-1.0f,-1.0f);// Lev² dolnφ (spodnφ st∞na)

glVertex3f( 1.0f,-1.0f,-1.0f);// Prav² dolnφ (spodnφ st∞na)

Te∩ vykreslφme Φelnφ st∞nu.

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

glVertex3f( 1.0f, 1.0f, 1.0f);// Pravß hornφ (Φelnφ st∞na)

glVertex3f(-1.0f, 1.0f, 1.0f);// Levß hornφ (Φelnφ st∞na)

glVertex3f(-1.0f,-1.0f, 1.0f);// Levß dolnφ (Φelnφ st∞na)

glVertex3f( 1.0f,-1.0f, 1.0f);// Pravß dolnφ (Φelnφ st∞na)

Zadnφ st∞na.

glColor3f(1.0f,1.0f,0.0f);// Älutß

glVertex3f( 1.0f,-1.0f,-1.0f);// Prav² hornφ (zadnφ st∞na)

glVertex3f(-1.0f,-1.0f,-1.0f);// Lev² hornφ (zadnφ st∞na)

glVertex3f(-1.0f, 1.0f,-1.0f);// Lev² dolnφ (zadnφ st∞na)

glVertex3f( 1.0f, 1.0f,-1.0f);// Prav² dolnφ (zadnφ st∞na)

Levß st∞na.

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

glVertex3f(-1.0f, 1.0f, 1.0f);// Pravß hornφ (levß st∞na)

glVertex3f(-1.0f, 1.0f,-1.0f);// Levß hornφ (levß st∞na)

glVertex3f(-1.0f,-1.0f,-1.0f);// Levß dolnφ (levß st∞na)

glVertex3f(-1.0f,-1.0f, 1.0f);// Pravß dolnφ (levß st∞na)

Pravß st∞na. Je to poslednφ st∞na krychle. Pokud chcete tak ji vynechejte a zφskßte krabici. Nebo m∙₧ete zkusit nastavit pro ka₧d² roh jinou barvu a vybarvit ji barevn²m p°echodem.

glColor3f(1.0f,0.0f,1.0f);// Fialovß

glVertex3f( 1.0f, 1.0f,-1.0f);// Pravß hornφ (pravß st∞na)

glVertex3f( 1.0f, 1.0f, 1.0f);// Levß hornφ (pravß st∞na)

glVertex3f( 1.0f,-1.0f, 1.0f);// Levß dolnφ (pravß st∞na)

glVertex3f( 1.0f,-1.0f,-1.0f);// Pravß dolnφ (pravß st∞na)

glEnd();// Konec kreslenφ krychle

rtri+=0.2f;// Inkrementace ·hlu pootoΦenφ pyramidy

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

return TRUE;

}

Na konci tohoto tutorißlu byste m∞li lΘpe rozum∞t jak jsou vytvß°eny 3D objekty. M∙₧ete p°em²Ület o OpenGL scΘn∞ jako o kusu papφru s mnoha pr∙svitn²mi vrstvami. Jako gigantickß krychle tvo°enß body. Pokud si dokß₧ete p°edstavit v obrazovce hloubku, nem∞li by jste mφt problΘm s vytvß°enφm nov²ch 3D objekt∙.

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

ZdrojovΘ k≤dy

Lekce 5

<<< Lekce 4 | Lekce 6 >>>