Jak zrobić kostkę w OpenGL

Autor: Gregory Harris
Data Utworzenia: 12 Kwiecień 2021
Data Aktualizacji: 1 Lipiec 2024
Anonim
OpenGL Tutorial 23 - Drawing A Cube
Wideo: OpenGL Tutorial 23 - Drawing A Cube

Zawartość

OpenGL to narzędzie do programowania 3D, które pozwala tworzyć złożone obrazy 3D z prostych kształtów. W tym artykule dowiesz się, jak narysować z jego pomocą prostą kostkę, którą można obracać w trzech wymiarach!

Kroki

Część 1 z 3: Pierwsza instalacja

  1. 1 Zainstaluj OpenGL. Zacznij od samouczka, jak zainstalować OpenGL na swoim komputerze. Jeśli masz już OpenGL i kompilator C, możesz pominąć ten krok i przejść do następnego.
  2. 2 Utwórz dokument. Utwórz nowy plik w swoim ulubionym edytorze kodu i zapisz go jako mycube.c
  3. 3 Dodaj #zawiera. Oto podstawowe dyrektywy #include, których będziesz potrzebować. Należy pamiętać, że dyrektywy dla różnych systemów operacyjnych są różne i dlatego trzeba wybrać wszystko, aby program był uniwersalny i można go było uruchomić na dowolnym systemie.

      // Zawiera #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Dodaj funkcjonalne prototypy i globalne. Następnym krokiem jest zadeklarowanie funkcjonalnych prototypów.

      // Funkcjonalne prototypy void display (); nieważne klawisze specjalne (); // Zmienne globalne double rotate_y = 0; podwójna rotacja_x = 0;

  5. 5 Zdefiniuj główną funkcję ().

      int main (int argc, char * argv []) // Zainicjuj GLUT i przetwórz niestandardowe parametry glutInit (& argc, argv); // Poproś o okno z obsługą podwójnego buforowania, buforowania Z i True Color glutInitDisplayMode (GLUT_DOUBLE

Część 2 z 3: Funkcja wyświetlacza ()

  1. 1 Zrozum cel funkcji wyświetlania (). Cała praca nad renderowaniem sześcianu spadnie na delikatne linie tej funkcji. Ogólna idea jest taka: narysujesz sześć oddzielnych ścian sześcianu i umieścisz je w odpowiednich pozycjach.
    • Dla każdej twarzy zdefiniujesz cztery rogi, a OpenGL połączy je liniami i wypełni je wybranym kolorem. Jak to zrobić, zostanie wyjaśnione poniżej.
  2. 2 Dodaj funkcję glClear(). Przede wszystkim podczas pracy z tą funkcją potrzebujemy jasny kolor i bufor Z... Bez tego stary będzie widoczny pod nowym obrazem, a obiekty narysowane przez program będą nieprawidłowo ustawione.

      void display () // Wyczyść ekran i bufor Z glClear (GL_COLOR_BUFFER_BIT

    • Zwróć uwagę na dwie ostatnie linijki. To są funkcje glFlush (); oraz glutSwapBufory ();, dając efekt podwójnego buforowania, co zostało opisane powyżej.

Część 3 z 3: Interaktywność programu

  1. 1 Dodaj funkcję specialKeys(). W zasadzie wszystko jest już prawie gotowe, ale sześcian jest tylko rysowany, a nie obracany. Aby to zrobić, musisz stworzyć funkcja specialKeys (), który pozwoli Ci obrócić kostkę za pomocą klawiszy strzałek!
    • Dla tej funkcji zostały zadeklarowane zmienne globalne rotate_x i rotate_y. Po naciśnięciu lewego i prawego klawisza strzałki wartość rotate_y zwiększy się lub zmniejszy o pięć stopni. Wartość rotate_x zmieni się w ten sam sposób, ale tym razem po naciśnięciu klawiszy strzałek w górę i w dół.
    • void specialKeys (int key, int x, int y) {// Strzałka w prawo - zwiększ obrót o 5 stopni jeśli (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Strzałka w lewo - Zmniejsz obrót o 5 stopni w przeciwnym razie if (klawisz == GLUT_KEY_LEFT) rotate_y - = 5; inaczej if (klucz == GLUT_KEY_UP) rotate_x + = 5; inaczej if (klucz == GLUT_KEY_DOWN) rotate_x - = 5; // Żądaj odświeżenia ekranu glutPostRedisplay (); }

  2. 2 Dodaj glObrót (). Ostatnią rzeczą, jaką zrobimy, jest dodanie linii, która pozwoli nam obrócić obiekt. Powrót do funkcji wyświetlacz () a przed opisem strony FRONT dodaj:

      // Resetuj przekształcenia glLoadIdentity (); // Obróć, gdy użytkownik zmieni wartości Rotate_x i rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (obrót_y, 0,0, 1,0, 0,0); // Strona wielokolorowa - PRZÓD ....

    • Należy pamiętać, że składnia glRotatef ()który jest podobny do składni glColor3f() i glVertex3f(), ale zawsze wymaga czterech parametrów. Pierwszy to kąt obrotu w stopniach. Kolejne trzy to osie, wzdłuż których odbywa się obrót, w kolejności x,y,z. Na razie musimy obrócić sześcian wzdłuż dwóch osi x i y.
    • Wszystkie przekształcenia, które definiujemy w programie, wymagają podobnych linii. Zasadniczo reprezentujemy obrót obiektu wzdłuż osi x jako zmianę wartości rotate_x, a obrót wzdłuż osi y jako zmianę wartości rotate_y. Jednak OpenGL połączy wszystko w jedną macierz transformacji. Za każdym razem, gdy wywołasz wyświetlacz, utworzysz macierz transformacji i glLoadIdentity () pozwoli Ci za każdym razem zacząć od nowej matrycy.
    • Inne funkcje transformacji, których możesz użyć, to glTranslatef() i glScalef(). Są one podobne do glRotatef(), z tą różnicą, że wymagają tylko trzech parametrów: wartości x, y i z, aby zmienić rozmiar i przeskalować obiekt.
    • Aby wszystko było wyświetlane poprawnie, gdy wszystkie trzy przekształcenia są zastosowane do jednego obiektu, musisz ustawić przekształcenia w odpowiedniej kolejności, a mianowicie glPrzetłumacz, glObróć, glSkala - i nigdy inaczej. OpenGL przekształca obiekt, czytając program od dołu do góry. Aby lepiej to zrozumieć, wyobraź sobie, jak wyglądałaby kostka 1x1x1 po wszystkich przekształceniach, gdyby OpenGL zastosował je w pokazanej kolejności (od góry do dołu), a następnie zastanów się, jak OpenGL przetworzy kostkę, czytając instrukcje od dołu do góry.
  3. 3 Dodaj następujące polecenia, aby przeskalować sześcian dwukrotnie w kierunkach x i y, obrócić sześcian o 180 stopni w osi y i przesunąć sześcian o 0,1 w osi x. Upewnij się, że wszystkie odpowiednie polecenia, w tym poprzednio podane polecenia glRotate(), są we właściwej kolejności. Jeśli boisz się popełnić błąd, zobacz ostateczną wersję programu na końcu artykułu.

      // Więcej przekształceń glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);

  4. 4 Skompiluj i uruchom kod. Załóżmy, że używasz gcc jako kompilatora, więc wprowadź w terminalu następujące polecenia:

      W systemie Linux: gcc cube.c -o cube -lglut -lGL ./ mycube W systemie Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube W systemie Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 Sprawdź ostateczny kod. Oto ostateczny kod stworzony przez autora artykułu, który nie tłumaczy komentarzy.

      // // Plik: mycube.c // Autor: Matt Daisley // Utworzono: 25.04.2012 // Projekt: Kod źródłowy do tworzenia kostki w OpenGL // Opis: Tworzy okno OpenGL i rysuje kostkę 3D / / Że użytkownik może obracać za pomocą klawiszy strzałek // // Sterowanie: Strzałka w lewo - Obróć w lewo // Strzałka w prawo - Obróć w prawo // Strzałka w górę - Obróć w górę // Strzałka w dół - Obróć w dół // ------ -------------------------------------------------- - // Zawiera // -------------------------------------------- - -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else # include GL / glut.h> #endif // --------------------------------------- - ------------------ // Prototypy funkcji // ------------------------- - -------------------------------- nieważne wyświetlanie (); nieważne klawisze specjalne (); // ------------------------------------------------ ---------- // Zmienne globalne // ---------------------------------- ------------------------ podwójna rotacja_y = 0; podwójna rotacja_x = 0; // ------------------------------------------------ ---------- // wyświetlacz () Funkcja oddzwaniania // -------------------- --------------------------- void display () // Clear screen i Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- - // specialKeys () Funkcja wywołania zwrotnego // --------------------------------------- - ------------------ void specialKeys (int key, int x, int y) {// Strzałka w prawo - zwiększ obrót o 5 stopni, jeśli (klawisz == GLUT_KEY_RIGHT) rotate_y + = 5; // Strzałka w lewo - zmniejsz obrót o 5 stopni w przeciwnym razie, jeśli (klawisz == GLUT_KEY_LEFT) obróć_y - = 5; w przeciwnym razie, jeśli (klawisz == GLUT_KEY_UP) obróć_x + = 5; w przeciwnym razie, jeśli (klawisz == GLUT_KEY_DOWN) obróć_x - = 5; // Poproś o aktualizację wyświetlania glutPostRedisplay ();} // ----------------------------------- - ---------------------- // funkcja główna () // ------------------- - -------------------------------------- int main (int argc, char * argv [ ] ) GLUT_RGB