Darmowa prenumerata - tu i teraz!
BezImienny - wersja online!
Serwis internetowy netmax.pl
Poprzedni artykułNastępny artykuł Komputery   

OpenGL - lekcja 2
Przesunięcia i obroty

Piotr Smirnow

Jak dotąd wszystko co rysowaliśmy na ekranie znajdowało się w środku sceny i nie poruszało się ani się nie obracało. Oczywiście żeby uzyskać efekt przesunięcia możemy dodawać do współrzędnych prymitywów jakieś wartości.
W OpenGL przesunięcia (translacje) i obroty (rotacje) wykonuje się inaczej. Załóżmy, że posiadając wiedzę z poprzednich lekcji zbudowaliśmy sześcian na środku ekranu. Teraz chcemy, aby ten sześcian znajdował się po lewej stronę ekranu, a nie na środku. Aby przesunąć nasz obiekt w lewo używamy funkcji glTranslatef(X, Y, Z). X, Y, Z mówi OpenGL ile jednostek po osiach chcemy się poruszać. Dla przypomnienia X porusza w "lewo i prawo", Y "z góry na dół", a Z "w głąb sceny". Chcemy narysować obiekt przesunięty o jedną jednostkę w lewo. Stoimy w punkcie 0,0,0 - początek układu współrzędnych. Wywołujemy glTranslatef(-1.0f, 0.0f, -0.0f) potem rysujemy nasz obiekt i gotowe !!!. (-1.0 przesunie obiekt w lewo o 1.0 jednostek, a 1.0 przesunie obiekt w prawo o 1.0 jednostek).

int DrawGLScene()
{
// Czyścimy Ekran i Bufor Głębokości
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Powracamy do początku układu wsp
glLoadIdentity();
// Przesuwamy się e lewo o 1.0
glTranslatef(-1.0f, 0.0f, 0.0f);
// Wywołujemy naszą funkcję rysującą
RysujSześcian();

return TRUE;
}

Obroty są równie proste. Do obracania obiektami służy funkcja glRotatef(Kąt, X, Y, Z). X, Y, Z - oznacza po której osi będziemy się obracać. Kąt - o jaki kąt ma być obrót.
Chcemy obrócić nasz obiekt wokół osi Y o kąt 12.0f. Wykona to polecenie glRotatef(12.0f, 0.0f, 1.0f, 0.0f). Pewnie zastanawiasz się dlaczego w miejsce X, Z wpisaliśmy 0.0f a w Y 1.0f ? To bardzo proste !!! Wpisując wartość 1.0f w X, Y lub Z powiadamiamy OpenGL po jakiej osi ma być obrót. W naszym przypadku po osi Y, więc piszemy 1.0f w miejsce Y. Można także stosować kombinacje glRotatef(1.0f, 1.0f, 0.0f, 12.0f) - obróci po osiach X, Y o 12.0f na każdą z osi, glRotatef(0.0f, 1.0f, 1.0f, 45.0f) - obróci po osiach Y, X o 45.0f, itd.

int DrawGLScene()
{
// Czyścimy Ekran i Bufor Głębokości
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Powracamy do początku układu wsp.
glLoadIdentity();
// Przesuwamy się e lewo o 1.0
glTranslatef(-1.0f, 0.0f,0.0f);
// Obrót o 12.0 jednostek
glRotatef(12.0f, 0.0f, 0.0f,1.0f);
// Wywołujemy naszą funkcję rysującą.
RysujSześcian();

return TRUE;
}

Wszystkie operacje translacji i rotacji MUSZĄ być wywołane przed narysowaniem obiektu, ale to chyba oczywiste.
UWAGA !!! Kolejność wywołania tych funkcji ma duże znaczenie!!! Jeżeli wywołamy glRotatef() przed glTranslatef() to obiekt się obróci i jednocześnie obrócą się współrzędne!!!! Teraz X, Y, Z nie będą wskazywały tam gdzie na początku i translacja o jakąś wartość po osiach może umieścić obiekt nie tam gdzie chcemy !!!!

Ten program jak i kody źródłowe do lekcji znajdziesz na http://opengl.si.pl

Piotr Smirnow
Tekst pochodzi ze strony http://opengl.si.pl - Portal Technologii OpenGL