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>