Hvordan lage en kube i OpenGL

Forfatter: Gregory Harris
Opprettelsesdato: 12 April 2021
Oppdater Dato: 1 Juli 2024
Anonim
How to make a cube of paper | Origami cube | Modular cube
Video: How to make a cube of paper | Origami cube | Modular cube

Innhold

OpenGL er et 3D -programmeringsverktøy som lar deg lage komplekse 3D -bilder fra enkle former. I denne artikkelen lærer du hvordan du kan tegne en enkel kube med hans hjelp som kan roteres i tre dimensjoner!

Trinn

Del 1 av 3: Første installasjon

  1. 1 Installer OpenGL. Start med en opplæring i hvordan du installerer OpenGL på datamaskinen. Hvis du allerede har OpenGL og en C -kompilator, kan du hoppe over dette trinnet og gå videre til neste.
  2. 2 Lag et dokument. Lag en ny fil i din favorittkode -editor og lagre den som mycube.c
  3. 3 Legg til #inkluderer. Her er de grunnleggende #include -direktivene du trenger. Det er viktig å huske at direktivene for forskjellige operativsystemer er forskjellige, og derfor må du velge alt slik at programmet er universelt og kan kjøres på et hvilket som helst 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 Legg til funksjonelle prototyper og globaler. Det neste trinnet er å erklære funksjonelle prototyper.

      // Funksjonelle prototyper ugyldig visning (); void specialKeys (); // Globale variabler dobbel rotere_y = 0; dobbel roter_x = 0;

  5. 5 Definer hovedfunksjonen ().

      int main (int argc, char * argv []) // Initialiser GLUT og behandle tilpassede parametere glutInit (& argc, argv); // Be om et vindu med støtte for dobbel buffering, Z-buffering og True Color glutInitDisplayMode (GLUT_DOUBLE

Del 2 av 3: Displayet () Funksjon

  1. 1 Forstå formålet med display () -funksjonen. Alt arbeidet med å gjengi kuben vil falle på de skjøre linjene i denne funksjonen. Den generelle ideen er denne: du vil tegne seks separate ansikter på kuben og plassere dem i hver sin posisjon.
    • For hvert ansikt vil du definere fire hjørner, og OpenGL vil koble dem med linjer og fylle dem med fargen du har valgt. Hvordan du gjør dette vil bli forklart nedenfor.
  2. 2 Legg til funksjonen glClear (). Først av alt, når vi arbeider med denne funksjonen, trenger vi klar farge og z-buffer... Uten dette vil den gamle være synlig under det nye bildet, og objektene som er tegnet av programmet vil bli plassert feil.

      void display () // Clear the Screen And Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • Vær oppmerksom på de to siste linjene. Dette er funksjonene glFlush (); og glutSwapBuffers ();, noe som gir effekten av dobbel buffering, som ble beskrevet ovenfor.

Del 3 av 3: Programinteraktivitet

  1. 1 Legg til funksjonen specialKeys (). I prinsippet er alt nesten klart, men terningen er bare tegnet og ikke rotert. For å gjøre dette må du lage specialKeys () -funksjonen, som lar deg rotere kuben ved å trykke på piltastene!
    • Det er for denne funksjonen at de globale variablene rotate_x og rotate_y ble deklarert. Når du trykker på venstre og høyre piltast, vil rotate_y -verdien øke eller redusere med fem grader. Verdien av rotate_x vil endre seg på samme måte, men denne gangen ved å trykke på pil opp og ned.
    • void specialKeys (int key, int x, int y) {// Høyrepil - øk rotasjonen med 5 grader hvis (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Venstre pil - Reduser rotasjonen 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; // Request Screen Refresh glutPostRedisplay (); }

  2. 2 Legg til glRotate (). Det siste vi skal gjøre er å legge til en linje som lar oss rotere objektet. Gå tilbake til funksjonen vise () og før beskrivelsen av FRONT -siden legg til:

      // Tilbakestill Transforms glLoadIdentity (); // Roter når brukeren endrer Verdiene rotate_x og rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Flerfarget side - FRONT ....

    • Vær oppmerksom på at syntaksen glRotatef ()som ligner syntaksen til glColor3f () og glVertex3f (), men krever alltid fire parametere. Den første er rotasjonsvinkelen i grader. De tre neste er aksene som rotasjonen skjer langs, i rekkefølgen x, y, z. For nå må vi rotere kuben langs to akser, x og y.
    • Alle transformasjoner som vi definerer i programmet krever lignende linjer. I utgangspunktet representerer vi rotasjonen av et objekt langs x-aksen som en endring i verdien av rotate_x, og rotasjon langs y-aksen som en endring i verdien av rotate_y. Imidlertid vil OpenGL samle alt i en transformasjonsmatrise. Hver gang du ringer display, vil du lage en transformasjonsmatrise og glLoadIdentity () lar deg starte med en ny matrise hver gang.
    • Andre transformasjonsfunksjoner du kan ha brukt er glTranslatef () og glScalef (). De ligner på glRotatef (), bortsett fra at de bare krever tre parametere: x-, y- og z -verdiene for å endre størrelsen og skalere objektet.
    • For at alt skal vises riktig når alle tre transformasjonene brukes på ett objekt, må du sette transformasjoner i riktig rekkefølge, nemlig glTranslate, glRotate, glScale - og aldri ellers. OpenGL transformerer objektet ved å lese programmet fra bunn til topp. For å bedre forstå dette, tenk deg hvordan 1x1x1 -terningen ville se etter alle transformasjonene hvis OpenGL brukte dem i den viste rekkefølgen (topp til bunn), og tenk deretter på hvordan OpenGL ville behandle terningen ved å lese instruksjonene fra bunn til topp.
  3. 3 Legg til følgende kommandoer for å skalere kuben to ganger i x- og y -retningen, for å rotere kuben 180 grader i y -aksen og for å flytte kuben 0,1 i x -aksen. Sørg for at alle relevante kommandoer, inkludert de tidligere gitt glRotate () -kommandoene, er i riktig rekkefølge. Hvis du er redd for å gjøre en feil, kan du se den siste versjonen av programmet på slutten av artikkelen.

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

  4. 4 Kompiler og kjør koden. La oss si at du bruker gcc som kompilator, så skriv inn følgende kommandoer i terminalen:

      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 Sjekk den endelige koden. Her er den endelige koden opprettet av forfatteren av artikkelen, som ikke oversetter kommentarene.

      // // Fil: mycube.c // Forfatter: Matt Daisley // Laget: 25.04.2012 // Prosjekt: Kildekode for Lag en kube i OpenGL // Beskrivelse: Oppretter et OpenGL -vindu og tegner en 3D -kube/ / At brukeren kan rotere ved hjelp av piltastene // // Kontroller: Venstre pil -Roter venstre // Høyre pil -Roter høyre // Pil opp -Roter opp // Pil ned -Roter ned // ------ -------------------------------------------------- -// 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 // ------------------------------------------ ------------------ // Funksjonsprototyper // -------------------------- -------------------------------- ugyldig visning (); void specialKeys (); // ------------------------------------------------ ---------- // Globale variabler // ---------------------------------- ------------------------ dobbel roter_y = 0; dobbel roter_x = 0; // ------------------------------------------------ ---------- // display () Tilbakekallingsfunksjon // ------------------------------- --------------------------- ugyldig visning () // Fjern skjerm og Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () tilbakeringingsfunksjon // ----------------------------------------- ------------------ void specialKeys (int-tast, int x, int y) {// Høyrepil-øk rotasjonen med 5 grader hvis (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Venstre pil - reduser rotasjonen 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; // Be om skjermoppdatering glutPostRedisplay ();} // ------------------------------------- ---------------------- // main () -funksjon // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB