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>