Lekcja 2. Pierwszy wielokąt
Autor: Herion
Oryginał: Your First Polygon (Jeff 'NeHe' Molofee)
Źródła: http://nehe.gamedev.net/data/lessons/vc/lesson02.zip

W pierwszej lekcji nauczyłeś się tworzyć okno OpenGL. W tej nauczysz się tworzyć trójkąty i kwadraty. Stworzymy trójkąt używając GL_TRIANGLES i kwadrat używając GL_QUADS.

Używając kodu z poprzedniej lekcji, dodamy trochę nowości do funkcji DrawGLSCene(). Napiszemy ją tu na nowo aby były widoczne zmiany.

int DrawGLScene(GLvoid)         // Tu się wszystko rysuje
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // Wyczyść ekran i bufor głębi
    glLoadIdentity();         // Zresetuj widok

Przy wywołaniu glLoadIdentity() przmieszczasz się na środek ekranu. Oś X biegnie z lewej do prawej, Y z góry na dół, a Z do ciebie.

Środek ekranu to punkt 0.0 na osi X i Y. Poruszanie w lewo zmniejszy wartość X. W Prawo ją zwiekszy. W Górę zwiększy się wartość Y, a w dół zmniejszy. W Tył Zwiększy się wartość Z, a w przód Zmniejszy.

glTranslatef(x, y, z) przemieszcza obiekt po 3 osiach. Ta linia kodu porusza na osi X o 1.5 jednostki. Nie porusza na Y, ale porusza na Z w głąb ekranu 6.0 jednostek. glTranslatef() porusza współrzędne od punktu w którym ty się znajdujesz.

    glTranslatef(-1.5f,0.0f,-6.0f);         // Porusz 1.5 w lewo i 6.0 wgłąb

Teraz, kiedy przmieściliśmy się w 3/4 ekranu na lewo, i trochę na przód (-6.0), będziemy mogli zobaczyć utworzony trójkąt. glBegin(GL_TRIANGLES) oznacza, że rozpoczynamy rysowanie trójkątów. glEnd() oznacza koniec rysowania objektu. Jeśli chcesz narysować trzy punkty, użyj GL_TRIANGLES. Rysowanie trójkątów jest najszybszym rozwiązaniem na wielu kartach graficznych. Jeśli masz 4 punkty, użyj GL_QUADS aby było ci łatwiej. Jeśli masz więcej niż 4 punkty użyj GL_POLYGON.

W naszym przykładowym programie, narysujemy tylko jeden trójkąt. Jeśli chcielibyśmy jeszcze jeden, musielibyśmy dodać kolejne 3 linie kodu (3 wierzchołki trójkąta) po pierwszych trzech. Wszystkie 6 lini powinno być między glBegin(GL_TRANGLES) a glEnd(). Nie ma sensu pisać osobnego glBegin() i glEnd() dla każdego trójkąta. Z kwadratami jest podobnie, tylko należy podać nie 3, ale 4 wierzchołki.

Pierwsza linia po glBegin() wstawia pierwszy punkt trójkąta. Pierwszym numerem w glVertex jest pozycja na osi X, drugim na osi Y, a trzecim na Z. Pierwszy wierzchołek na środku osi X (0), jedną jednostkę w górę (1.0f) i 0.0 na osi Z. Jest to górny wierzchołek naszego trójkąta. Drugi glVertex leży jedną jednostkę w lewo, jedną w dół i Z bez zmian. Trzeci leży po drugiej stronie osi Y. Spójż na współrzędną X i spróbuj to sobie wyobrazić. glEnd() mówi, że nie będzie już więcej wierzchołków. Zostanie narysowany wypełniony trójkąt. Oczywiście do tych współrzędnych zostaną dodane lub odjęte te z glTranslatef() w celu przemieszczenia.

    glBegin(GL_TRIANGLES);         // Rysujemy trójkąty
        glVertex3f( 0.0f, 1.0f, 0.0f);         // Góra
        glVertex3f(-1.0f,-1.0f, 0.0f);         // Lewy
        glVertex3f( 1.0f,-1.0f, 0.0f);         // Prawy
    glEnd();         // Koniec rysowania trójkąta

Mamy już trójkąt. Teraz przesuniemy się na drugą stronę ekranu aby narysować kwadrat. Użyjemy oczywiście glTranslatef(). Tym razem X będzie wartością dodatnią, bo rysujemy po drugiej stronie (0 jest w połowie ekranu, ujemne po lewej, a dodatnie po prawej). Ponieważ wcześniej użyliśmy glTranslatef() i poruszyliśmy się 1.5 w lewo, teraz musimy powrócić na środek i jeszcze wyjść tyle samo na drugą stronę. Łącznie wyjdzie 3.0 jednostki (1.5 do powrotu na środek i 1.5 na prawo). Na osi Z pozostaniemy w -6.0

    glTranslatef(3.0f,0.0f,0.0f);         // Porusz 3 w prawo

Teraz narysujemy kwadracik. Użyjemy GL_QUADS. "Quad" to czworokąt. Coś idealnego do narysowania kwadratu. Kod rysujący kwadrat jest bardzo podobny do tego z trójkąta. Jedyna różnica to GL_QUADS zamiast GL_TRIANGLES i jeden więcej wierzchołek (kwadrat ma ich 4). Kwadrat będziemy rysować zgodnie z ruchem wskazówek zegara: najpierw górny lewy wierzchołek, później górny prawy, później dolny prawy no i dolny lewy. Kolejność rysowania ma znaczenie, gdyż od tego zależy w którą stronę zwrócony jest kwadrat. Rysowanie zgodnie z ruchem wskazówek zegara stworzy kwadrat zwrócony do nas, ale to teraz nieważne.

    glBegin(GL_QUADS);         // Rysujemy kwadraty
        glVertex3f(-1.0f, 1.0f, 0.0f);         // górny lewy
        glVertex3f( 1.0f, 1.0f, 0.0f);         // górny prawy
        glVertex3f( 1.0f,-1.0f, 0.0f);         // dolny prawy
        glVertex3f(-1.0f,-1.0f, 0.0f);         // dolny lewy
    glEnd();         // Koniec rysowania kwadratu
    return true;
}

Pozostaje kwestia jednostek. Czym one są? Metrami? centymetrami? Nie. Jednostki możesz sobie dostosować do włanych potrzeb. Np. Człowieka możesz zrobić o wysokości 45 jednostek. W tej lekcji dokładnie wyjaśniłem jak należy rysować kwadraty i trójkąty używając OpenGL. Jeśli nie rozumiesz zasad działania współrzędnych, pobaw się kodem, pozamieniaj wartości. Może cię olśni.