Witam wszystkich. Ci którzy już teraz chcą wiedzieć co będziemy robić polecam moje demo Worthless! Jestem bosco i dam z siebie wszystko, żeby nauczyć was jak zrobić animowany obrazek. Ta lekcja bazuje na lekcji 6. i właśnie wiedzę tam zawartą powinieneś posiadać. Ściągnij źródła tamtej lekcji i umieść teksturę, którą dołączam w katalogu z kodem. Możesz też użyć własnej tekstury, o ile spełnia ona wymogi OpenGL
Zacznijmy od początku. Otwórz lekcję 6. w Visual C++ i dodaj poniższą linię pod innymi liniami include. #include <math.h> pozwala nam używać takich rzeczy jak sinus czy kosinus
Użyjemy tablicy punktów do przechowania współrzędnych punktów siatki. Siatka ma wymiary 45x45 punktów, czyli 44x44 czworokąty. wiggle_count śledzi prędkość falowania tekstury. Każda klatka wygląda całkiem nieźle, a zmienna przechowuje wartość zmiennoprzecinkową, żeby wygładzić falę na fladze. Te linie dodaj pod ostatnim include'em i przed GLuint texture[1]
Przejdź do procedury LoadGLTextures(). Nazwiemy naszą teksturę Tim.bmp. Znajdź LoadBMP("Data/NeHe.bmp") i zamień na LoadBMP("Data/Tim.bmp")
Następne dwie linie dodaj do InitGL() przed return TRUE.
Oznaczają one, że chcemy mieć tylną ścianę wypełnioną całkowicie, a przednią tylko za pomocą linii. Te ustawienia zależą w większości od własnych upodobań - oriantacja wierzchołków clockwise czy counterclockwise. Więcej informacji w 'Red Book'. Pozwól, że powiem, iż to przewodnia pozycja do nauki OpenGL nie włączając strony NeHe! [od tłumacza= w Polsce taką pozycją jest OpenGL.Księga Eksperta] Wróćmy do lekcji. Za powyższym kodem i przez return TRUE dopisz następujące linie.
Dziękuję Grahamowi Gibbons'owi za sugestię odnośnie pętli integer.
Te dwie powyższe pętle inicjują punkty na siatce. Inicjuję zmienne w pętli, żeby były lokalne - dostępne tylko w bloku pętli. Nie jestem pewien czy to koszerne rozwiązanie. Używamy wartości integer, żeby zapobiec dziwnym rzeczom, które pojawiają się kiedy liczymy na liczbach zmiennoprzecinkowych (ang. float). Dzielimy x oraz y przez 5 (np. 45/5=9) i odejmujemy 4.5 od każdej, żeby wyśrodkować falę. To samo można by osiągnąć przez translację, ale ja wolę taki sposób.
Wartość w points[x][y][2] jest wartością naszej fali. Funkcja sin() wymaga podania radianów. Bierzemy wartość w stopniach, która jest naszą float_x pomnożoną przez 40.0f. Kiedy to zrobiliśmy, żeby przekonwertować na radiany bierzemy wartość w stopniach, dzielimy ją przez 360.0f, mnożymy przez PI (albo przybliżenie) i wtedy mnożymy przez 2.0f.
Przepiszę funkcję DrawGLScene od zera, żeby wszystko było jasne.
Rożne zmienne wykorzystane to kontrolowania pętli. Zobacz kolejny fragment kodu.
Widziałeś to już wcześniej. Kod dokładnie taki jak w lekcji 6., jednak odsunąłem scenę nieco bardziej.
Jednak zacznijmy pętlę rysującą wielokąty. Użyłem wartości integer, żeby nie musieć używać funkcji int() jak zrobiłem wcześniej, żeby dostać referencję na tablicę jako integer.
Używam czterech zmiennych jako współrzędnych tekstury. Każdy wielokąt (czworokąt w siatce) ma wymiary 1/44 (na osi X) x 1/44 (na osi Y) teksturze. Pętla określa lewy dolny wierzchołek, potem odpowiednio dodajemy, żeby otrzymać pozostałe trzy.
Powyższa linia każe OpenGL przejść przez wszystkie czworokąty flagi. Cztery oddzielne komórki - każda glTexCoord2f() i glVertex3f(). Przejdźmy dalej. Zauważ, że czworokąty są rysowane zgodnie z ruchem wskazówek zegara (ang. clockwise). To znaczy, że ściana, na którą patrzysz jest tylną, a nie przednią. Tylna, jak pamiętasz, jest wypełniona. Przednia zrobiona z linii.
Jeśli rysowałeś w odwrotnym porządku (ang. counterclockwise) to zamiast wypełnionych czworokątów ujrzysz siatkę :)
Jeżeli narysowaliśmy naszą scenę, to przetwarzamy jeden cykl fali
Oto co tutaj robimy. Wartość każdej linie przesuwamy w lewo, co powoduje falowanie. Przechowujemy skrajną wartość, żeby zachować falę. Następnie resetujemy licznik wiggle_counter, żeby nasza animacja wciąż trwała.
Standardowe wartość obrotów. I wszystko gra. Skompiluj, powinieneś ujrzeć obracającą się falującą bitmapę. Nie wiem co jeszcze powiedzieć, whew... to było DŁUGIE! Ale mam nadzieję, że coś wynieśliście z tej lekcji. Jeśli masz jakieś pytania, chcesz żebym coś wyjaśnił, albo powiedzieć mi jak okropnie kodzę, lol, napisz do mnie.
To był czad, ale bardzo energo- i czasochłonny. Teraz doceniam NeHe bardziej niż dotychczas. Dziękuję wszystkim.