Lekce 2

Lekce 2 - Vytvß°enφ troj·helnφk∙ a Φty°·helnφk∙

Zdrojov² k≤d z prvnφ lekce trochu upravφme, aby program vykreslil troj·helnφk a Φtverec. Vφm, ₧e si asi myslφte, ₧e takovΘto vykreslovßnφ je banalita, ale a₧ zaΦnete programovat pochopφte, ₧e orientovat se ve 3D prostoru nenφ na p°edstavivost a₧ tak jednoduchΘ. JakΘkoli vytvß°enφ objekt∙ v OpenGL zßvisφ na troj·helnφcφch a Φtvercφch. Pokud pochopφte tuto lekci mßte nap∙l vyhrßno.

Chcete-li pou₧φt k≤d z prvnφ lekce, tak p°epiÜte funkci DrawGLScene(), vÜe ostatnφ z∙stßvß nezm∞n∞no.

int DrawGLScene(GLvoid)// Vykreslovßnφ

{

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

glLoadIdentity();// Reset matice

Pou₧itφm glLoadIdentity() se p°esunete doprost°ed obrazovky. Osa x prochßzφ zleva doprava, osa y zespodu nahoru a osa z od monitoru sm∞rem k vßm. St°ed OpenGL scΘny je na sou°adnicφch, kde se x, y i z rovnß nule. Funkce glTranslatef(x, y, z) pohybuje poΦßtkem sou°adnicov²ch os. Nßsledujφcφ °ßdek ho posune doleva o 1.5 jednotky. Nep°esouvßme se na ose y (0.0f) a posune se sm∞rem dovnit° obrazovky o 6.0 jednotek. P°i pou₧itφ glTranslatef(x, z, z), se nepohybujeme v₧dy z centra obrazovky, ale z mφsta, kde jsme se s pomocφ tΘto funkce dostali. Zadßvßme tedy pouze offset pohybu.

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

Nynφ jsme se posunuli do levΘ poloviny obrazovky a nastavili jsme mφsto pohledu dostateΦn∞ hluboko, tak₧e m∙₧eme vid∞t celou scΘnu. Vykreslφme troj·helnφk. Posun po ose z urΦuje jak velkΘ budou vykreslovanΘ objekty (perspektiva). GlBegin(GL_TRIANGLES) OpenGL °φkß, ₧e chceme zaΦφt kreslit troj·helnφky a glEnd() oznamuje ukonΦenφ kreslenφ troj·helnφk∙. Kreslenφ troj·helnφk∙ je na v∞tÜin∞ grafick²ch karet o hodn∞ rychlejÜφ ne₧ kreslenφ Φtverc∙. Pokud chcete spojovat Φty°i body pou₧ijete GL_QUADS. Mnoho·helnφky se vytvß°ejφ pomocφ GL_POLYGON. V∞tÜina karet je ale stejn∞ konvertuje na troj·helnφky. V naÜem jednoduchΘm programu nakreslφme pouze jeden troj·helnφk. Pokud bychom cht∞li nakreslit druh² troj·helnφk, staΦφ p°idat dalÜφ t°i body hned za prvnφ t°i. VÜech Üest °ßdk∙ by bylo mezi glBegin(GL_TRIANGLES) a glEnd() a ka₧dß skupina po t°ech tvo°φ jeden troj·helnφk. Tohle platφ stejn∞ i pro Φty°·helnφky, kde jsou skupiny brßny po Φty°ech. Kreslenφ mnoho·helnφku je ale u₧ o n∞Φem jinΘm, proto₧e m∙₧e b²t vytvo°en z libovolnΘho poΦtu bod∙. VÜechny body by byly p°i°azeny k jedinΘmu mnoho·helnφku. Prvnφ °ßdek po glBegin() definuje prvnφ bod troj·helnφku. Prvnφ parametr ve funkci glVertex3f() urΦuje sou°adnici na ose x, druh² parametr osu y a t°etφ parametr osu z. V prvnφm °ßdku se tedy nepohybujeme po ose x. Bod umφstφme pouze o jednu jednotku nahoru na ose y a na ose z nechßme op∞t nulu. Tφm nastavφme hornφ bod. Druhß volßnφ glVertex3f() umis¥uje bod posunut² o jednotku vlevo a dol∙. Tφm vytvo°φme druh² vrchol. T°etφ funkce umis¥uje bod vpravo na x a dol∙ na y. Mßme vytvo°en² t°etφ vrchol. Funkcφ glEnd() °ekneme OpenGL, ₧e u₧ nebudeme umφs¥ovat dalÜφ body. Zobrazφ se vypln∞n² troj·helnφk.

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

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

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

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

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

Na levΘ stran∞ obrazovky jsem vykreslili troj·helnφk. Provedeme translaci doprava a umφstφme Φtverec. Na ose x se posunujeme o 1.5, abychom dosßhli zp∞t st°edu a k tomu p°iΦteme dalÜφch 1.5 a budeme vpravo. Na osßch y a z se nep°esunujeme.

glTranslatef(3.0f,0.0f,0.0f);// Posun o 3 jednotky doprava

K≤d pro nakreslenφ Φtverce je velice podobn² tomu, kter² jsme pou₧ili pro troj·helnφk. Jedin² rozdφl v pou₧itφ GL_QUADS mφsto GL_TRIANGLES je p°idßnφ dalÜφho vertexu pro Φtvrt² bod. Nakreslφme postupn∞ lev² hornφ, prav² hornφ, prav² dolnφ a lev² dolnφ vrchol.

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∙

return TRUE;// UkonΦenφ funkce

}

To je pro tuto lekci vÜe. Probrali jsme nejjednoduÜÜφ kreslenφ. Doufßm, ₧e vßs moc neodradilo - to teprve p°ijde :-]

napsal: Jeff Molofee - NeHe
p°elo₧il: Vßclav SlovßΦek - Wessan

ZdrojovΘ k≤dy

Lekce 2

<<< Lekce 1 | Lekce 3 >>>