Dzięki kwadrykom można w prosty sposób rysować złożone obiekty. Sposoby tradycyjne przeważnie zajmują kilka pętli FOR i wymagają stosownej podstawy trygonometrycznej.
Będziemy używać kodu z lekcji siódmej. Dodamy 7 zmiennych i zmodyfikujemy teksturę, żeby było ciekawiej.
Teraz przejdziemy do funkcji InitGL(). Dodamy tu 3 linie kodu, które zainicjalizują naszą kwadrykę. Dodaj te trzy linie po włączeniu light1, ale jeszcze zanim zwrócisz true. Pierwsza linia inicjalizuje kwadrykę i ustawia wskaźnik na jej adres w pamięci. Jeżeli nie będzie można go utworzyć, to zwrócone zostanie 0. Druga linia tworzy gładkie wektory normalne na naszej kwadryce, więc oświetlenie będzie dobrze wyglądać. Innymi możliwymi wartościami są GLU_NONE i GLU_FLAT. Na koniec włączamy mapowanie tekstury na naszej kwadryce. Mapowanie tekstury jest dosyć dziwnym procesem i nigdy nie przebiega w pełni zgodnie z oczekiwaniami.
Zdecydowałem, że zachowam sześcian w tym tutorialu, więc można zobaczyć, jak mapowana będzie tekstura na kwadryce. Postanowiłem, że przeniosę sześcian do osobnej funkcji, więc po napisaniu funkcji rysującej wszystko stanie się bardziej przejrzyste.
Następnie mamy funkcję DrawGLScene, w której dopisałem prostą instrukcję warunkową w celu sprawnego rysowania różnych obiektów. Aby było bardziej przejrzyście, przepiszę całą funkcję DrawGLScene.
Zauważysz, że gdy mówię o użytych parametrach, to ignoruję pierwszy parametr (quadratic). Wynika to z tego, że używam go do rysowania wszystkich obiektów z wyjątkiem sześcianu.
Drugim tworzonym obiektem będzie cylinder. Pierwszy parametr (1.0f) jest promieniem dolnej podstawy cylindra. Drugi (1.0f) jest promieniem górnej podstawy. Trzeci parametr (3.0f) określa wysokość cylindra (jaki jest długi). Czwarty parametr (32) określa liczbę segmentów wokół osi Z, a piąty parametr określa ilość segmentów wzdłuż osi Z. Im więcej segmentów, tym bardziej szczegółowy obiekt. Zwiększając ilość segmentów, dodajemy więcej wielokątów do obiektu. Zatem poprawiamy jakość kosztem prędkości. Zazwyczaj łatwo jest znaleźć optymalne rozwiązanie.
Trzecim obiektem będzie dysk w kształcie płyty CD. Pierwszy parametr (0.5f) określa wewnętrzny promień dysku. Ta wartość może być równa zero, co będzie oznaczało, że nie będzie pośrodku otworu. Im większy wewnętrzny promień, tym większy będzie otwór pośrodku dysku. Drugi parametr (1.5f) to promień zewnętrzny. Powinien on być większy niż promień wewnętrzny. Jeżeli ta wartość będzie niewiele większa od wewnętrznego promienia, to otrzymamy cieńki pierścień. Trzeci parametr (32) to ilość kawałków składających się na dysk. Pomyśl o nich jak o kawałkach pizzy. Więcej kawałków da nam gładszą zewnętrzną krawędź. Czwarty parametr (32) określa liczbę pierścieni tworzących dysk. Pierścienie są podobne do ścieżek na winylowych płytach. Okrąg w okręgu. Łączą się odpowiednio zewnętrznym i wewnętrznym promieniem, dając więcej detali. Analogicznie, im więcej będzie takich segmentów, tym wolniej będzie to działać.
Nasz czwarty obiekt powinniście bez większych problemów rozpoznać. To kula! Ten obiekt jest całkiem prosty. Pierwszy parametr to promień kuli. Jeżeli nie spotkałeś się dotąd z tym pojęciem, to definiuje się je następująco: promień jest to odległość od środka obiektu do jego powierzchni. W tym wypadku promień wynosi 1.3f. Następnie mamy segmenty wokół osi z (32) oraz segmenty wzdłuż osi z (32). Więcej segmentów spowoduje, że kula będzie gładsza. Kula zazwyczaj potrzebuje sporo segmentów, aby wyglądała gładko.
Kolejny obiekt utworzymy przy użyciu tej samej komendy, która tworzyła cylinder. Jak pamiętasz, pierwsze dwa parametry kontrolowały promienie dolnej i górnej podstawy cylindra. Aby zrobić stożek, wystarczy podać zero jako jeden z promieni. W ten sposób na jednym końcu cylindra powstanie punkt. W poniższym kodzie podajemy promień górnej podstawy równy zero.
Nasz szósty obiekt jest tworzony przy użyciu funkcji gluPartialDisc. Stworzony przy użyciu tej komendy obiekt będzie wyglądał dokładnie tak, jak dysk, który zrobiliśmy poprzednio, ale funkcja gluPartialDisc przyjmuje jeszcze dwa nowe parametry. Piąty parametr (part1) jest kątem początkowym, od którego chcemy zacząć rysować dysk. Szósty parametr to kąt łuku. Kąt łuku to odległość do przejścia od aktualnego kąta. Zwiększając kąt łuku, spowodujemy, że dysk będzie powoli rysowany na ekranie, zgodnie z ruchem wskazówek zegara. Gdy kąt łuku przekroczy 360 stopni, zaczniemy zwiększać kąt początkowy. Będzie to wyglądało tak, jakby dysk był zmazywany i wszystko zaczyna się od początku!
W funkcji KillGLWindow() musimy usunąć naszą kwadrykę, aby zwolnić zasoby systemowe. Zrobimy to przy użyciu komendy gluDeleteQuadric.
W ostatniej części zajmiemy się reakcją na klawisze. Po prostu dodaj ten kod tam, gdzie znajduje się reszta kodu dotycząca klawiszologii.
To wszystko! Teraz możesz już rysować kwadryki w OpenGL. Połączenie morphingu i kwadryk może dać naprawdę imponujące efekty. Animowany dysk jest przykładem prostego morphingu.