Lekce 03 - Barvy

glColor3f

Jistě jste si všimly, že všechny námi dosud vytvořené obekty měly bílou barvu. Za to může funkce glColor3f(R, G, B) jenž se chová jako statická proměnná a je imlicitně nastavena na bílou barvu. Parametry v závorce určují intenzitu červené (R - red), zelené (G - green) a modré (B - blue). Hodnoty jsou v rozsahu 0 až 1 typu Glfloat resp. Single. Nastavený barevný odstín se vztahuje vždy k vertexu objektu. Následující kód vykreslí trojůhelník a vyplní ho červenou barvou.

glBegin GL_TRIANGLES 'Začátek kreslení trojúhelníků
glColor3f 1#, 0#, 0# 'nastaveni cervene barvy
glVertex3f 0#, 1#, 0# 'Horní bod
glVertex3f -1#, -1#, 0# 'Levý dolní bod
glVertex3f 1#, -1#, 0# 'Pravý dolní bod
glEnd 'Ukončení kreslení trojúhelníků

Pokud budeme chtít pro každý vertex jinou barvu, provedeme to takto.

glBegin GL_TRIANGLES 'Začátek kreslení trojúhelníků
glColor3f 1#, 0#, 0# 'nastaveni cervene barvy
glVertex3f 0#, 1#, 0# 'Horní bod
glColor3f 0#, 1#, 0# 'nastaveni zelene barvy
glVertex3f -1#, -1#, 0# 'Levý dolní bod
glColor3f 0#, 0#, 1# 'nastaveni modre barvy
glVertex3f 1#, -1#, 0# 'Pravý dolní bod
glEnd 'Ukončení kreslení trojúhelníků

Až se naučíme mapovat textury na objekty můžeme tuto funkci rovněž použít jako filtr k dodání nádechu daného odstínu.

Pozice v prostoru

Dnes se ještě nebudeme pouštět do dynamické kamery, postačí když si uděláme představu o tom jak se pohybovat ve 3D prostoru na předem známou polohu. Máme v podstatě dvě možnosti. Můžeme si sami spočítat transformační matici a tu následně předat OGL, nebo využít již existujícíh funkcí. Druhá možnost je o něco snazší a proto u ní zůstaneme.

glTranslatef

Funkce glTranslatef(x, y, z) pohybuje počátkem souřadnicových os. Střed OpenGL scény je na souřadnicích, kde se x, y a z rovná nule. Příklad - vykreslíme několik objektů jenž jsou od sebe vzdáleny 2 jednotky. Nyní potřebujeme všechny objekty posunout o 1 jednotku v daném směru. Abychom nemuseli všechny vertexy přepočítávat, stačí jen posunout počátek kreslení. Následující řádek posune počátek kreslení na ose Z o 6 jednotek.

glTranslatef 0#, 0#, -6# 'posun do hloubky o 6 jednotekv

Pokud zavoláme tuto funkci 2x, posuneme se celkem o 12 jednotek. Nezapomeňte že se nepohybujeme z centra obrazovky, ale z místa, kam jsme se s pomocí této funkce dostali. Zadáváme tedy pouze offset pohybu.Tento postup je ovšem naprosto nevhodný. Brzy totiž zjistíte že ztrácíte přehled o aktuální poloze. Je proto vhodnější si před každou transformací náš počátek resetovat na nulové hodnoty..

glLoadIdentity

Funkce glLoadIdentity() resetuje veškeré posuny a rotace zpět na nulu. Volejte ji vždy před samotnou změnou polohy.

glLoadIdentity 'Reset matice
glTranslatef 0#, 0#, -12# 'posun do hloubky o 12 jednotek

glrotatef

Funkce glrotatef (úhel, x, y, z) nám umožňuje libovolně natočit scénu vůči počátku souřadnicových os. Úhel je číslo o kolik stupňů se budeme otáčet, znaménko určuje směr rotace. Kladná hodnota otáčí proti směru hodinových ručiček a záporná po směru. Parametry x, y a z určují osu kolem které se budeme otáčet. 0 je jako False a 1 jako True, takže zadání glrotatef (90, 0, 1, 0) znamená rotaci o 90 stupňů na ose Y (můžeme samozřejmě rotovat všechny osy najednou). Při rotaci buďte velice obezřetní. Nezapomínejte že použitím rotace si měníme polohu os x, y, z. Pokud např. provedeme rotaci o 90stupňů na ose Y, dojde k tomu že osa Z se nám přesune tam kde předtím byla osa X a ta se naopak přesune na původní pozici osy Z.

Zdrojáky dnes nebudou. Můžete použít kód první lekce a proceduru DrawScene() upravte třeba takto.

Sub DrawScene()
Static uhel
uhel = uhel + 1

glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT 'Vymaže obrazovku a hloubkový buffer
glLoadIdentity 'Reset matice

glTranslatef 0#, 0#, -6# 'posun do hloubky o 6 jednotek
glRotatef uhel, 0, 1, 0 'rotace o hodnotu v promenne "uhel" na ose Y

glBegin (GL_TRIANGLES) 'Začátek kreslení trojúhelníků
glVertex3f 0#, 1#, 0# 'Horní bod
glVertex3f -1#, -1#, 0# 'Levý dolní bod
glVertex3f 1#, -1#, 0# 'Pravý dolní bod
glEnd 'Ukončení kreslení trojúhelníků

End Sub

Upravte si hodnotu kroku úhlu podle rychlosti vašeho procesoru. Na rychlejších počítačích bude rotovat strašně rychle. Takhle se to samozřejmě běžně nepoužívá, ale dokud neumíme počítat FPS (počet snímků za sekundu) musí nám to stačit.

© 2005 Jindřich Mach & Jan Ticháček