Jak zrobić kostkę w opengl

OpenGL to narzędzie programowania 3D, które umożliwia tworzenie złożonych obrazów trójwymiarowych z prostych form. Z tego artykułu dowiesz się, jak rysować, pomoże prostym kostce, które można obrócić w trzech wymiarach!

Kroki

Część 1 z 3:
Instalacja wstępna
jeden. Zainstaluj OpenGL. Uruchom S Opengl Installation Guides w Twoim komputerze. Jeśli opengl i kompilator z tobą już masz, możesz pominąć ten krok i przejść do następnego.
  • 2. Utwórz dokument. Utwórz nowy plik w ulubionym edytorze kodu i zapisz go jako MyCube.DO
  • 3. Dodaj #inCludes. Oto główne dyrektywy #include, których potrzebujesz. Ważne jest, aby pamiętać, że dyrektywy dla różnych systemów operacyjnych są różne, dlatego konieczne jest wybór wszystkiego, aby program był uniwersalny i można go uruchomić w dowolnym systemie.
    // obejmuje # obejmuje #Zawierać #Zawierać #Define gl_gelxt_prototypy # ifdef __apple __ # obejmuje # inaczej # zawierać #dek
  • cztery. Dodaj prototypy funkcjonalne i zmienne globalne. Następny krok zadeklaruje prototypów funkcjonalnych.
    // funkcjonalny wyświetlacz prototypesvoid () - Voide Specialkeys () - // Global VarialblesDeble Rotate_y = 0-Double Rotate_x = 0-
  • pięć. Ustaw funkcję główną ().
    Int Główny (INT Argc, Char * Argv []) // Inicjalizuj użytkownika Glut i Process User ParametersGlutinit (& ARGC, ARGV) - // Poproś o podwójne okno buforujące, buforowanie i schemat kolorów True colorglutinitdisplayMode (glut_double 
  • Część 2 z 3:
    Funkcja wyświetlacza ()
    jeden. Zrozumieć przypisanie funkcji wyświetlacza (). Wszystkie prace na rysunku Kuby spadną na delikatne linie tej funkcji. Idea ogólnie jest następujący: rysujesz sześć oddzielnych twarzy kostki i umieść je w odpowiednich pozycjach.
    • Dla każdej powierzchni zdefiniujesz cztery kąt, a OpenGL łączy je z liniami i wypełnij wybrany kolor. Poniżej powie, jak to zrobić.
  • 2. Dodaj funkcję GlcCear (). Przede wszystkim pracuję z tą funkcją, potrzebujemy Wyczyść kolor i bufor. Bez tego, pod nowym wzorem będzie widoczny stary, a obiekty pobierane przez program zostaną nieprawidłowo ułożone.
    Wyświetlacz Void () GL_DEPTH_Buffer_bit)-
  • 3. Dodaj Gbegin () i Glend (). Obiekty OpenGL to kombinacje różnych wielokątów. Zespół GBEGIN () Pozwól nam narysować obiekt z tobą - to jak ołówek, który wyciągasz postać, nie rozrywając go z papieru. Rozerwać ołówek z arkusza i zacznij rysować coś nowego, potrzebujesz zespołu Blend (). W tym artykule będziemy używać GL_POLYGON do narysowania każdej krawędzi sześcianu, chociaż możliwe jest użycie innych parametrów, takich jak GL_LINE, GL_QUAD lub GL_TRIANGLE, aby utworzyć inne formy.
  • Zacznij od przodu kostki. Później dodamy kolor do każdej z sześciu twarzy.
  • // Multicolor Side - Frontglbegin (GL_POLYGON) - // Wersety Dodaj w następnym steps ()-
  • cztery. Dodaj funkcję GLTTTEX3F (). Teraz, gdy wyjaśniłeś program, który chcesz zacząć rysować wielokąt, potrzebujesz Ustaw wierzchołki Obiekt. Funkcja GLENTEX ma kilka formularzy, z których korzystanie zależy od tego, co zamierzasz zrobić z obiektem.
  • Najpierw - ile pomiarów będziesz pracować? Rysunek 3 IN w GLTTTEX3F wskazuje trzy wymiary. Jednak możesz pracować w 2 i 4 pomiarach. Litera f, z kolei wskazuje, że pracujemy z pływającymi półkolonami. Jednak tutaj możesz użyć liczb całkowitych, podwójnych lub krótkich.
  • Zauważ, że wszystkie punkty są ustawione przeciwnie do ruchu wskazówek zegara strzały. Chociaż nie jest to bardzo ważne, ale kiedy zaczynasz pracować nad oświetleniem, teksturowaniem, leczeniem obróbki taryfowych, zwyczaj przepisywania wszystkiego przeciwnym do ruchu wskazówek zegara będzie bardzo przydatny.
  • Dodaj wierzchołki między liniami GBEGIN () i Glend ().


  • // Multicolor Side - Frontglbegin (GL_POLYGON) -GlverTex3f (-0.pięćdziesiąt.pięćdziesiąt.5) - // p1glvertex3f (-0.5.0.pięćdziesiąt.5) - // p2glvertex3f (0.5.0.pięćdziesiąt.5) - // p3glvertex3f (0.pięćdziesiąt.pięćdziesiąt.5) - // P4GLEND ()-
  • pięć. Dodaj funkcję GloColor3f (). Współpracuje na wiele sposobów podobnych do GlverTex. Punkty Możesz ustawić typy danych krótkich, liczb całkowitych, podwójnych lub pływających. Każdy kolor ma wartość od 0 do 1. Wszystkie zer są czarne, wszystkie jednostki - odpowiednio, białe. Figura 3 w Glicor3f () wskazuje schemat kolorów RGB bez kanału alfa. Kolory kanału alfa są odpowiedzialne za jego przejrzystość. Aby zmienić wartość kanału alfa, użyj Glicor4f () z ostatnim parametrem od 0 do 1, czyli, od nieprzezroczystej do przezroczystości.
  • Wywołanie Gliccor3F (), renderujemy każdego wierzchołka z określonego punktu w określonym kolorze. Innymi słowy, jeśli wszystkie cztery wierzchołki powinny być czerwone, tylko jeden tylko czas ustawić wartość kolorów przed wywołaniem poleceń GLENTEX3F (), a wszystkie będą czerwone.
  • Na przykładzie przedniej części poniżej widać, jak nowy kolor każdego wierzchołka jest ustawiony. Kiedy to zrobisz, możesz zapoznać się z ciekawą cechą kwiatów OpenGL. Ponieważ każda szczypta wielokąta ma swój własny kolor, OpenGL automatycznie miesza kolory! Kod umieszczony pokazuje, jak utworzyć cztery wierzchołki o tym samym kolorze.
  • // Multicolor Side - Frontglbegin (GL_POLYGON) -glolor3f (1.0, 0.0, 0.0) -glververtex3f (0.pięćdziesiąt.pięćdziesiąt.5) - // P1 Redglolor3f (0.0, 1.0, 0.0) -glververtex3f (0.5.0.pięćdziesiąt.5) - // P2 Greenglolor3f (0.0, 0.0, 1.0) -gverTEx3f (-0.5.0.pięćdziesiąt.5) - // P3 Blueglolor3f (1.0, 0.0, 1.0) -gverTEx3f (-0.pięćdziesiąt.pięćdziesiąt.5) - // P4 PurpleGlend ()-
  • 6. Narysuj inne twarze Kuba. Lepiej, oczywiście, jeśli sam znajdziesz lokalizację reszty kostki i każdego z wierzchołków, ale ze względu na prostotę, którą je obliczyliśmy dla Ciebie. Kodeks jest podany B Ostateczny wyświetlacz funkcji () poniżej.
    // Biała strona - Zastosowanie się (GL_POLYGON) -glolor3f (1.0,1.0, 1.0) -glververtex3f (0.pięćdziesiąt.pięćdziesiąt.5) -glververtex3f (0.5.0.pięćdziesiąt.5) -gververtex3f (-0.5.0.pięćdziesiąt.5) -gververtex3f (-0.pięćdziesiąt.pięćdziesiąt.5) -glend () - // Violet Side - Ruralglbegin (GL_POLYGON) -glolor3f (1.0,0.0,1.0) -glververtex3f (0.pięćdziesiąt.pięćdziesiąt.5) -glververtex3f (0.5.0.pięćdziesiąt.5) -glververtex3f (0.5.0.5.0.5) -glververtex3f (0.pięćdziesiąt.5.0.5) -glusz () - // zielony - leveglbegin (gl_polygon) -glolor3f (0.0,1.0,0.0) -gverTEx3f (-0.pięćdziesiąt.5.0.5) -gververtex3f (-0.5.0.5.0.5) -gververtex3f (-0.5.0.pięćdziesiąt.5) -gververtex3f (-0.pięćdziesiąt.pięćdziesiąt.5) -Glend () - // Blue Side - UpperGlugin (GL_POLYGON) -glolor3f (0.0,0.0,1.0) -glververtex3f (0.5.0.5.0.5) -glververtex3f (0.5.0.pięćdziesiąt.5) -gververtex3f (-0.5.0.pięćdziesiąt.5) -gververtex3f (-0.5.0.5.0.5) -glend () - // Red Side - Nizhnyglbegin (GL_POLYGON) -glolor3f (1.0,0.0,0.0) -glververtex3f (0.pięćdziesiąt.pięćdziesiąt.5) -glververtex3f (0.pięćdziesiąt.5.0.5) -gververtex3f (-0.pięćdziesiąt.5.0.5) -gververtex3f (-0.pięćdziesiąt.pięćdziesiąt.5) -Glend () - Glflush () - Glutswapbuffers ()-
  • Zwróć uwagę na dwie ostatnie linie. Są to funkcje Glflush ()- i glutswapbuffers ()-, Dając efekt podwójnego buforowania, który został opowiedziany powyżej.
  • Część 3 z 3:
    Program interaktywny
    jeden. Dodaj funkcję Specialkeys (). Zasadniczo wszystko jest prawie gotowe, ale sześcian jest rysowany i nie obraca się. Zrobić to, stwórz Funkcja specjalkamy (), który obróci kostkę, naciskając klawisze strzałek!
    • Było to dla tej funkcji, że ogłoszono zmienne globalne ROTATE_X i ROTATE_Y. Po naciśnięciu klawiszy strzałek "Left" i "Prawy", wartość ROTATE_Y wzrośnie lub zmniejszy się o pięć stopni. Podobnie zmienimy wartość ROTATE_X, ale już naciskając klawisze strzałek "w górę" i dół.
    Voide Specialkeys (Int Key, Int X, Int Y) {// Strzałka w prawo - Zwiększenie obrotu 5 stopni (klawisz == glut_key_right) ROTATE_Y + = 5 - // Strzałka w lewo - Redukcja obrotu 5 stopni, jeśli (klawisz == glut_key_left) ROTATE_Y - = 5 - ELAY IF (klawisz == glut_key_up) ROTATE_X + = 5-ELUMY IF (Key == glut_key_down) ROTATE_X - = 5 - // Wniosek o aktualizację EkrantizpozieszkodedplayPlay () -}
  • 2. Dodaj GLOTATE (). Ostatnią rzeczą, jaką zrobimy, to dodać ciąg, który pozwoli nam obrócić obiekt. Wróć do funkcji Wyświetlacz () I przed opisaniem frontu, dodaj:
    // Resetowanie TransformationSgloNetIdenity () - // Obrót Podczas wymiany wartości Rotate_x i Rotate_yglrotatef (ROTATE_X, 1.0, 0.0, 0.0) -glotatef (Rotate_y, 0.0, 1.0, 0.0) - // Multicolor Side - Front....
  • Należy pamiętać, że składnia Glotatef (), który jest podobny do składni piętra () i GLENTEX3F (), ale zawsze wymaga wskazania czterech parametrów. Najpierw - kąt obrotu w stopniach. Następujące trzy osi, dla których rotacja idzie, w kolejności X, Y, Z. Do tej pory musimy obracać kostkę na dwóch osiach, X i Y.
  • Dla wszystkich transformacji określają program, wymagane są podobne linie. W rzeczywistości reprezentujemy obrót obiektu wzdłuż osi X jako zmiany wartości ROTATE_X, a obrót osi osi - jako zmiana wartości Rotate_y. Jednak OpenGL będzie zjednoczyć wszystko w jednej macierzy transformacji. Czy nazywasz funkcję wyświetlania, utworzysz matrycę transformacji i Gladidentity () pozwoli ci zacząć za każdym razem z nową matrycą.
  • Inne funkcje transformacji, których można użyć, jest Gltranslatef () i Glcaleef (). Są one podobne do Glotatef (), z wyjątkiem tego, że wymagają tylko trzech parametrów: wartości X, Y i Z, aby zmienić i skalować obiekt.
  • Więc wszystko jest wyświetlane poprawnie, gdy wszystkie trzy transformacje są stosowane do jednego obiektu, musisz ustawić transformacje w odpowiedniej kolejności, a mianowicie Gltranslate, Glotate, Glcale - I nigdy nie. OpenGL przekształca obiekt czytający program od dołu. Aby lepiej to zrozumieć, wyobraź sobie, jak Cube 1x1x1 będzie opiekować się wszystkimi przemianami, jeśli OpenGL zastosowała je w kolejności, jak wskazano (od góry do dołu), a następnie pomyśl o tym, jak Opengl traktuje kostkę, czytając instrukcje od dołu do góry.
  • 3. Dodaj następujące polecenia do dwukrotnego skalowania kostki wzdłuż osi X i Y, aby obrócić sześcian 180 stopni wzdłuż osi osi, jak również przesuwać sześcianę o 0,1 wzdłuż osi X. Upewnij się, że wszystkie odpowiednie polecenia, w tym wcześniej określone polecenia GLOTATE (), są określone we właściwej kolejności. Jeśli boisz się mylić, zobacz ostateczną wersję programu na końcu artykułu.
    // Inne transformacjeGltransLatef (0.10.0, 0.0) -glotatef (180, 0.0, 1.0, 0.0) -glscalef (2.0, 2.0, 0.0)-
  • cztery. Skompilować i uruchom kod. Załóżmy, że używasz GCC jako kompilatora, więc wprowadź następujące polecenia do terminala:
    W Linux: GCC Cube.C -O CUBE -LGLUT -LGL./ Mycuben Mac: GCC -O Foo Foo.C -framework Glut -Framework OpenGL./ Windows MyCube: GCC -Wall -Fooo foo.C -LLUT32CU -LGLU32 -Lopengl32./ Mycube
  • pięć. Sprawdź ostateczny kod. Oto ostateczny kod utworzony przez autora artykułu, w którym uwagi nie zostały przetłumaczone.
    //// Plik: MyCube.C // Autor: Matt Daisley // Utworzona: 4/25 / 2012 // Projekt: Kod źródłowy do tworzenia kostki w OpenGL // Opis: Tworzy okno OpenGL i rysuje kostkę 3D //, którą użytkownik może obracać, używając Klawisze strzałek // // Sterowanie: Strzałka w lewo - Obróć w lewo // Strzałka w prawo - Obróć w prawo // W górę strzałki - Obróć w górę // Down-Rotuj w dół // --------------- -------------------------------------------- // obejmuje // - ----------------------------------------------------- - -------- # obejmuje #Zawierać #Zawierać #Define gl_gelxt_prototypy # IFDEF __apple __ # Uwzględnij # inaczej # dołączyć # endif // -------------------------------------------------- - ------------------------ // Prototypy funkcji // --------------------- -------------------------------------------- Void Display () - Void Specialkeys () - // ------------------------------------------------- ------------ // Globalne zmienne // --------------------------------- ----------------------------- Podwójny Rotate_y = 0-Podwójny Rotate_x = 0 - // --------- ------------------------------------------------- / / Wyświetlacz () Funkcja zwrotna / / ------------------------------------------- ---------------- Void Display () // Clear Screen i Z-BufferGlear (GL_COLOR_Buffer_bit // ------------------ ----------------------------------------------- () Funkcja zwrotna // - --------------------------------------------------- --------- voide Specialkeys (Int Key, Int X, Int Y) {// Strzałka w prawo - Wzrost obrotów o 5 stopni (klawisz == glut_key_right) ROTATE_Y + = 5 - // Strzałka w lewo - Zmniejszenie obrotu O 5 stopni, jeśli (klawisz == glut_key_ W lewo) ROTATE_Y - = 5 - ELAY IF (Key == Glut_key_up) ROTATE_X + = 5 - ELAY IF (Key == glut_key_down) Rotate_x - = 5 --// żądanie Wyświetl UpdateGlutrodisplay () -} // ------ ----------------------------------------------------- - - // Główna () Funkcja // ----------------------------------------- --------------------- int Główny (int Argc, Char * Argv []) Glut_Depth) - // Utwórz WindowGlutCreatów ("Niesamowite kostka") - // Enable Z-Buffer Głębokość Testglable (GL_DEPTH_TEST) - // Funkcje CallbackGlutdisplayFunc (Display) -GlutSpecialfunc (Specialkeys) - // Pass Control To Glut dla EventsGlutMainloop () - // Powrót do OSReturnOop-
  • Podobne publikacje