Lemur zaprasza
Lekcja 2 - Rysowanie trojkatow i czworokatow W pierwszym lekcji dotyczacej OpenGL nauczylem cie jak sie tworzy miejsce pracy. W tym artykule naucze cie jak sie tworzy trojkaty i czworokaty. Trojkaty bêdziemy tworzyli urzywajac funkcji GL_TRIANGLES, natomiast czworokaty urzywajac funkcji GL_QUADS.Bedziemy korzystac z kodu z pierwszej lekcji (to znaczy z szablonu :)) a nowe rzeczy bedziemy dodawac do procedury DrawGLScene(). Przepisze ja teraz ponizej, mozesz zamienic procedure DrawGLScene() na ta ponizsza albo po prostu dodac te linie kodu ktorych nie ma w szablonie. int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); Teraz trzeba sobie powiedziec ze os X rusza sie w lewo i prawo, os Y w gore i w dol a os z w glab i na zewnatrz ekranu.Centralnym punktem OpenGL jest punkt 0.0f osi X i Y. Punkt po lewej stronie ekranu bedzie mial numer ujemny, a po prawej stronie bedzie to liczba dodatnia. Ruszajac sie ku gorze bedzie to tez numer ujemny, ruszajac sie w dol bedzie to numer ujemny. W glebi ekranu jest numer ujemny a poruszajac sie do przodu ekranu pedzie to liczba dodatnia.Funkcja glTranslatef(x, y, z) ustawia punkt centralny wzdloz osi x,y,z tak jak jest to podane. Ponizsza linijka kodu przesowa w lewa strone os X o 1,5 jednostki, os Y nie przesowa wcale a os Z porusza 6.0 jednostek wglab ekranu. glTranslatef(-1.5f,0.0f,-6.0f); // Przesowa w lewo o 1.5 jednostki i 6.0 jednostek w glab ekranu Teraz kiedy przesunelismy punkt centralny ekranu w lewa strone i kiedy jestesmy juz w glebi ekranu o 6.0 jednostek. Mozemy teraz rozpoczac tworzenie trojkata. Funkcja glBegin oznacza ze chcemy zaczac tworzyc trojkat, natomiast funkcja glEnd() oznacza, ze juz skaczylismy tworzyc ten trojkat. Jezeli chcesz stworzyc obiekt o 3 punktach to uzyj funkcji GL_TRIANGLES, trojkaty tworza sie bardzo szybko, chociaz zalezy to troche od twojej karty graficznej. Jak chcesz utworzyc obiekt skladajacy sie z 4 punktow to uzyj GL_QUADS, a jesli chcesz stworzyc obiekt skladajacy sie z wiecej niz 4 punkty to uzyj gl_POLYGON. W naszym przykladowym programie bedziemy tworzyli tylko jeden trojkat, ale jezeli chcemy stworzyc jeszcze jeden to wystarczy dolaczyc trzy linijki kodu (dla 3 punktow) po trzech pierwszych. Wsystkie te szesc linijek kodu musza znajdowac sie miedzy glBegin (GL_TRIANGLES) a glEnd(). Pierwsza linia za gl_BEGIN stawia pierwszy punkt naszegj figury. Pierwsza wartosc funkcji glVertex jest dla osi X, druga dla osi Y, a trzecia dla osi Z. A wiec w pierwszej linijce ponizszego kodu nie poruszamy osia X ani w lewo ani w prawo. Poruszamy za to jedna jednostke do gory i nie poruszamy osi Z. To daje nam gorny wierzcholek naszego trojkata. Nastepna funkcja glVertex przesowa o jedna jednostke os X i o jedna jednostke w dol w osi Y. To daje nam dolny lewy punkt naszgo trojkata. Trzecia funkcja glVertex daje nam przesuniecie w prawo o jedna jednostke i w dol o jedna jednostke. Co daje nam dolny prawy rog naszeogo trojkata. Funkcja glEnd() mowi OpenGL, ze nie chcemy juz stawiac wiecej punktow. Na dole przedstawiona jest funkcja o ktorej mowa byla powyzej. glBegin(GL_TRIANGLES); // Poczatek tworzenia trojkata glVertex3f( 0.0f, 1.0f, 0.0f); // Gora glVertex3f(-1.0f,-1.0f, 0.0f); // Lewy dol glVertex3f( 1.0f,-1.0f, 0.0f); // prawy dol glEnd(); // Koniec tworzenia trojkata Ok teraz gdy juz mamy trojkat na lewej stronie ekranyu zrobiony, musimy teraz przesunac sie na prawa polowe ekranu by utworzyc tam kwadrat. Znowu do tego celu urzyjemy funkcji glTranslate. Tym razem jednak musimy przesunac sie na prawa strone, wiec X musi miec wartosc dodatnia. Poniewaz poprzednio przesunelismy sie w lewo o 1,5 jednostek, wiec teraz musimy sie przesunac o 1,5 jednostek w prawo. Musimy sie jednak oczywiscie przesunac jeszcze o 1.5 jednostek, aby to jakos wszystko wygladalo. Musimy sie w sumie przesunac o 3 jednostki w prawo. glTranslatef(3.0f,0.0f,0.0f); // Przesuwamy sie o 3 jednostki w prawo Teraz stworzymy kwadrat, a osiagniemy to urzywajac funkcji gl_QUADS. Kwadrat jest oczywiscie czteroboczny, wiec ta funkcja nadaje sie do tego perfekcyjnie. Kod tworzenia kwadratu jest bardzo podobny do tego, ktorego urzywalismy do tworzenia trojkata. Jedyna roznica pomiedzy gl_QUADS a GL_TRIANGLES jest jeden dodatkowy glVertex3f. Bedziemy rysowac nasz kwadrat zaczynajac od gornej lewej strony potem gorna prawa, dolna prawa, dolna lewa (zgodnie ze wskazowkami zegara). Aby bylo to zgodne z ruchem wskazowek zegara kwadrat bedzie pokanywany od tylnej strony. Znaczy to, ze strona, ktora bedziemy ogladali bedzie strona tylnia. To, ze bedziemy rysowac kwadrat od tylu znacznie ulatwi nam pewne rzeczy. Moze narazie nie jest to jakas bardzo wazna sprawa bez, ktorej nie dalo by sie obejsc, ale pozniej zobaczysz, ze ta wiedza bardzo ci sie przyda. Mozesz tez rysowac czworokaty normalnie, a to uznaj tylko jak ciekawoske - sam wybierz. glBegin(GL_QUADS); // poczatek glVertex3f(-1.0f, 1.0f, 0.0f); // gora lewo glVertex3f( 1.0f, 1.0f, 0.0f); // gora prawo glVertex3f( 1.0f,-1.0f, 0.0f); // dol prawo glVertex3f(-1.0f,-1.0f, 0.0f); // dol lewo glEnd(); // koniec return TRUE; Na koniec zmienimy napis znajdujacy sie na samej goze okna jak nie jest ono otworzone na pelnym ekranie. if (keys[VK_F1]) // Czy klawisz F1 zostal nacisniety? { keys[VK_F1]=FALSE; // Jezeli tak ustaw wartosc na false KillGLWindow(); // Zamknij nasze okno fullscreen=!fullscreen; // pelny ekran / tryb okienkowy // Przerabiamy nasze okno OpenGL if (!CreateGLWindow("Lekcja pierwsza - trojkaty i czworokaty",640,480,16,fullscreen)) { return 0; // Wyjdz jezeli okno nie zostalo otworzone } } W tej lekcji staralem sie wyjasniac jak najwiecej szczegolow w sposobie tworzenia trojkatow i czworokatow na ekranie urzywajac OpenGL. Jezeli masz jakies pytania to prosze napisz do mnie. Jezeli czujesz, ze wytlumaczylem cos zle, albo kod jest zle napisany, albo czujesz, ze zrobil bys to lepiej tez daj mi znac. |