Lekce 4 - Rotace

Naučíme se, jak otáčet objekt okolo os. Trojúhelník se bude otáčet kolem osy y a čtverec kolem osy x. Je jednoduché vytvořit scénu z polygonů. Přidání pohybu ji pěkně oživí.

Začneme přidáním dvou proměnných pro uložení rotace každého objektu. Deklarujeme je jako globální na začátku programu. Brzy zjistíte, že desetinná čísla jsou nezbytná k programování v OpenGL.

GLfloat rtri;// Úhel pro trojúhelník

GLfloat rquad;// Úhel pro čtverec

Přepíšeme funkci DrawGLScene, která slouží pro vykreslování.

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

Následující část kódu je nová. Funkce glRotatef(uhel, x_vektor, y_vektor, z_vektor) je odpovědná za rotaci souřadnicových os. Budete ji často používat. Uhel je číslo (obvykle uložené v proměnné), které určuje o kolik stupňů chcete otočit objektem. Parametry x_vektor, y_vektor a z_vektor dohromady se současným počátkem souřadnic určují vektor okolo kterého se objekt bude otáčet.

Pro lepší vysvětlení uvedu vysvětlení na příkladech: Osa x - Představte si, že stojíte u vodorovné desky a chcete jí otočit. Pokud zadáte kladnou rotaci [1,0,0] zvedá se vzdálenější část desky a bližší klesá. Při záporné rotaci [-1,0,0] je to naopak. Osa y - Opět stejná deska. Při kladné rotaci [0,1,0] se pravá část desky pohybuje od vás a levá část desky k vám. Při záporné rotaci [0,-1,0] je to naopak. Osa z - Opět stejná deska. Při kladné rotaci [0,0,1] se zvedá pravá část desky a levá klesá a při záporné [0,0,-1] je to naopak.

Pokud bude rtri 7, následujícím řádkem pootočíme trojúhelníkem o 7° okolo osy y proti směru hodinových ručiček.

glRotatef(rtri,0.0f,1.0f,0.0f);// Otočí trojúhelník okolo osy y

Další část kódu zůstává nezměněna. Vykreslí vybarvený trojúhelník. Tentokrát ale díky předcházejícímu řádku pootočený okolo osy y.

glBegin(GL_TRIANGLES);// Začátek kreslení trojúhelníků

glColor3f(1.0f, 0.0f, 0.0f);// Červená barva

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

glColor3f(0.0f, 1.0f, 0.0f);// Zelená barva

glVertex3f(-1.0f, -1.0f, 0.0f);// Levý dolní bod

glColor3f(0.0f, 0.0f, 1.0f);// Modrá barva

glVertex3f(1.0f, -1.0f, 0.0f);// Pravý dolní bod

glEnd();// Ukončení kreslení trojúhelníků

Jistě si v následujícím kódu všimnete, že jsme přidali další volání funkce glLoadIdentity(). Protože byly osy pootočeny neukazují do směrů, které předpokládáte. Takže pokud posouváme okolo osy x, můžeme skončit posouváním ve směru původní osy z, záleží na tom, jak moc jsme pootočili. Zkuste odstranit řádek s voláním glLoadIdentity(), ať vidíte co myslím. Jakmile máme resetováno míří osy opět původními směry, tj. x - zleva doprava, y - zdola nahoru, z - z obrazovky k vám. Všimněte si, že posouváme jen o 1,5 na ose x narozdíl od posunu o 3 z předchozí části. Když resetujeme, posune se počátek zpátky do středu obrazovky.

glLoadIdentity();// Reset matice

glTranslatef(1.5f,0.0f,-6.0f);// Posun počátku

glRotatef(rquad,1.0f,0.0f,0.0f);// Pootočení čtverce okolo osy x

Vykreslení je stejné jako v předcházející části. Opět vykreslí čtverec, ale tentokrát pootočený.

glColor3f(0.5f,0.5f,1.0f);// Světle modrá barva

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ů

Po každém zobrazení se změní proměnné rtri a rquad, ve kterých jsou uloženy hodnoty pootočení trojúhelníku a čtverce. Změnou znamínka můžete změnit smysl rotace. Změnou velikosti přičítaných hodnot můžete změnit rychlost rotace.

rtri+=0.2f;// Inkrementace úhlu pootočení trojúhelníku

rquad-=0.15f;// Inkrementace úhlu pootočení čtverce

return TRUE;// Ukončení funkce

}

Doufám, že jste pochopili, že se vše vykresluje pořád stejně, souřadnice bodů se nikdy nemění. Pokaždé se pouze liší počátek souřadnicových os, jejich natočení nebo měřítko - glScalef(x,y,z). Pokud chcete, aby se objekt otáčel okolo své osy, umístěte ho okolo počátku nebo alespoň na jednu ze souřadnicových os - tato lekce. Při jiném umístění bude chaoticky létat po scéně.

Také je důležité, zda napřed provedete translaci nebo rotaci. Při počátečním pootočení budou osy směřovat jinam než očekáváte a následné posunutí skončí úplně někde jinde než chcete.

napsal: Jeff Molofee - NeHe <nehe (zavináč) connect.ab.ca>
přeložil: Milan Turek <nalim.kerut (zavináč) email.cz>

Zdrojové kódy

Lekce 4

<<< Lekce 3 | Lekce 5 >>>