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 <nehe (zavináč) connect.ab.ca>
přeložil: Václav Slováček - Wessan <horizont (zavináč) host.sk>

Zdrojové kódy

Lekce 2

<<< Lekce 1 | Lekce 3 >>>