Sådan laver du en terning i OpenGL

Forfatter: Gregory Harris
Oprettelsesdato: 12 April 2021
Opdateringsdato: 1 Juli 2024
Anonim
Sådan laver du en terning i OpenGL - Samfund
Sådan laver du en terning i OpenGL - Samfund

Indhold

OpenGL er et 3D -programmeringsværktøj, der giver dig mulighed for at oprette komplekse 3D -billeder ud fra enkle former. I denne artikel lærer du, hvordan du med hans hjælp tegner en simpel terning, der kan drejes i tre dimensioner!

Trin

Del 1 af 3: Første installation

  1. 1 Installer OpenGL. Start med en tutorial om, hvordan du installerer OpenGL på din computer. Hvis du allerede har OpenGL og en C -kompilator, kan du springe dette trin over og gå videre til det næste.
  2. 2 Opret et dokument. Opret en ny fil i din foretrukne kode -editor, og gem den som mycube.c
  3. 3 Tilføj #inkluderer. Her er de grundlæggende #include -direktiver, du skal bruge. Det er vigtigt at huske, at direktiverne for forskellige operativsystemer er forskellige, og derfor skal du vælge alt, så programmet er universelt og kan køre på ethvert system.

      // Inkluderer #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 Tilføj funktionelle prototyper og globaler. Det næste trin er at erklære funktionelle prototyper.

      // Funktionelle prototyper ugyldig visning (); void specialKeys (); // Globale variabler dobbelt rotate_y = 0; dobbelt roter_x = 0;

  5. 5 Definer hovedfunktionen ().

      int main (int argc, char * argv []) // Initialiser GLUT og behandl brugerdefinerede parametre glutInit (& argc, argv); // Anmod om et vindue med support til dobbeltbuffering, Z-buffering og ægte farver glutInitDisplayMode (GLUT_DOUBLE

Del 2 af 3: Displayet () Funktion

  1. 1 Forstå formålet med display () -funktionen. Alt arbejde med at gengive terningen vil falde på de skrøbelige linjer i denne funktion. Den generelle idé er denne: Du vil tegne seks separate ansigter på terningen og placere dem i deres respektive positioner.
    • For hvert ansigt definerer du fire hjørner, og OpenGL forbinder dem med linjer og fylder dem med din valgte farve. Hvordan dette gøres, vil blive forklaret nedenfor.
  2. 2 Tilføj funktionen glClear (). Først og fremmest, når vi arbejder med denne funktion, har vi brug for klar farve og z-buffer... Uden dette vil det gamle være synligt under det nye billede, og de objekter, der er tegnet af programmet, placeres forkert.

      void display () // Ryd skærmen og Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • Vær opmærksom på de sidste to linjer. Disse er funktionerne glFlush (); og glutSwapBuffers ();, hvilket giver effekten af ​​dobbeltbuffering, som blev beskrevet ovenfor.

Del 3 af 3: Programinteraktivitet

  1. 1 Tilføj funktionen specialKeys (). I princippet er alt næsten klar, men terningen er kun tegnet og ikke roteret. For at gøre dette skal du oprette specialKeys () -funktionen, som giver dig mulighed for at rotere terningen ved at trykke på piletasterne!
    • Det er for denne funktion, at de globale variabler rotate_x og rotate_y blev deklareret. Når du trykker på venstre og højre piletast, vil rotate_y -værdien stige eller falde med fem grader. Værdien af ​​rotate_x ændres på samme måde, men denne gang ved at trykke på pil op og pil ned.
    • void specialKeys (int key, int x, int y) {// Højre pil - øg rotationen med 5 grader, hvis (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Venstre pil - Reducer rotation med 5 grader ellers hvis (key == GLUT_KEY_LEFT) rotate_y - = 5; ellers hvis (key == GLUT_KEY_UP) rotate_x + = 5; ellers hvis (key == GLUT_KEY_DOWN) rotate_x - = 5; // Anmod om skærmopdatering af glutPostRedisplay (); }

  2. 2 Tilføj glRotate (). Den sidste ting, vi vil gøre, er at tilføje en linje, der giver os mulighed for at rotere objektet. Tilbage til funktion Skærm () og før beskrivelsen af ​​FRONT -siden tilføjes:

      // Nulstil Transforms glLoadIdentity (); // Rotér når brugeren ændrer Værdierne rotate_x og rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Flerfarvet side - FRONT ....

    • Bemærk, at syntaksen glRotatef ()som ligner syntaksen for glColor3f () og glVertex3f (), men altid kræver fire parametre. Den første er rotationsvinklen i grader. De næste tre er akserne, langs hvilke rotationen finder sted, i rækkefølgen x, y, z. For nu skal vi rotere terningen langs to akser, x og y.
    • Alle transformationer, som vi definerer i programmet, kræver lignende linjer. Grundlæggende repræsenterer vi rotation af et objekt langs x-aksen som en ændring i værdien af ​​rotate_x og rotation langs y-aksen som en ændring i værdien af ​​rotate_y. Imidlertid vil OpenGL samle alt i en transformationsmatrix. Hver gang du kalder display, opretter du en transformationsmatrix og glLoadIdentity () giver dig mulighed for at starte med en ny matrix hver gang.
    • Andre transformationsfunktioner, du muligvis har brugt, er glTranslatef () og glScalef (). De ligner glRotatef (), bortset fra at de kun kræver tre parametre: x-, y- og z -værdierne for at ændre størrelsen og skalere objektet.
    • For at alt kan vises korrekt, når alle tre transformationer anvendes på et objekt, skal du indstille transformationer i den relevante rækkefølge, nemlig glTranslate, glRotate, glScale - og aldrig ellers. OpenGL transformerer objektet ved at læse programmet fra bund til top. For bedre at forstå dette kan du forestille dig, hvordan 1x1x1 -terningen ville se ud efter alle transformationerne, hvis OpenGL anvendte dem i den viste rækkefølge (top til bund), og tænk derefter over, hvordan OpenGL ville behandle terningen ved at læse instruktionerne fra bund til top.
  3. 3 Tilføj følgende kommandoer for at skalere terningen to gange i x- og y -retningen, for at rotere terningen 180 grader i y -aksen og for at flytte terningen 0,1 i x -aksen. Sørg for, at alle relevante kommandoer, herunder de tidligere givne glRotate () -kommandoer, er i den rigtige rækkefølge. Hvis du er bange for at begå en fejl, kan du se den sidste version af programmet i slutningen af ​​artiklen.

      // Flere transformationer glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);

  4. 4 Kompilér og kør koden. Lad os sige, at du bruger gcc som din kompilator, så indtast følgende kommandoer i din terminal:

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

  5. 5 Tjek den endelige kode. Her er den sidste kode oprettet af forfatteren af ​​artiklen, som ikke oversætter kommentarerne.

      // // Fil: mycube.c // Forfatter: Matt Daisley // Oprettet: 25-04-2012 // Projekt: Kildekode til Lav en terning i OpenGL // Beskrivelse: Opretter et OpenGL -vindue og tegner en 3D -terning/ / At brugeren kan rotere ved hjælp af piletasterne // // Kontrolelementer: Venstre pil -Drej til venstre // Højre pil -Drej til højre // Pil op -Roter op // Pil ned -Rotér ned // ------ ---------------------------------------------------------- -// Indeholder // -------------------------------------------- -------------- #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 // ------------------------------------------ ------------------ // Funktionsprototyper // -------------------------- -------------------------------- tomrumsvisning (); void specialKeys (); // ------------------------------------------------ ---------- // Globale variabler // ---------------------------------- ------------------------ dobbelt rotate_y = 0; dobbelt roter_x = 0; // ------------------------------------------------ ---------- // display () Tilbagekaldsfunktion // ------------------------------- --------------------------- tomrumsvisning () // Ryd skærm og Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () tilbagekaldsfunktion // ----------------------------------------- ------------------ void specialKeys (int-tast, int x, int y) {// Højre pil-øg rotation med 5 grader, hvis (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Venstre pil - reducer rotation med 5 grader ellers hvis (key == GLUT_KEY_LEFT) rotate_y - = 5; else if (key == GLUT_KEY_UP) rotate_x + = 5; else if (key == GLUT_KEY_DOWN) rotate_x - = 5; // Anmod om visningsopdatering glutPostRedisplay ();} // ------------------------------------ ---------------------- // main () funktion // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB