Hur man gör en kub i OpenGL

Författare: Gregory Harris
Skapelsedatum: 12 April 2021
Uppdatera Datum: 1 Juli 2024
Anonim
Hur man gör en kub i OpenGL - Samhälle
Hur man gör en kub i OpenGL - Samhälle

Innehåll

OpenGL är ett 3D -programmeringsverktyg som låter dig skapa komplexa 3D -bilder från enkla former. I den här artikeln lär du dig att rita med hans hjälp en enkel kub som kan roteras i tre dimensioner!

Steg

Del 1 av 3: Initial installation

  1. 1 Installera OpenGL. Börja med en handledning om hur du installerar OpenGL på din dator. Om du redan har OpenGL och en C -kompilator kan du hoppa över det här steget och gå vidare till nästa.
  2. 2 Skapa ett dokument. Skapa en ny fil i din favorit kodredigerare och spara den som mycube.c
  3. 3 Lägg till #inkluderar. Här är de grundläggande #include -direktiven du behöver. Det är viktigt att komma ihåg att direktiven för olika operativsystem är olika, och därför måste du välja allt så att programmet är universellt och kan köras på alla system.

      // Inkluderar #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 Lägg till funktionella prototyper och globaler. Nästa steg är att deklarera funktionella prototyper.

      // Funktionella prototyper tomrumsvisning (); void specialKeys (); // Globala variabler dubbel rotera_y = 0; dubbel rotera_x = 0;

  5. 5 Definiera huvudfunktionen ().

      int main (int argc, char * argv []) // Initiera GLUT och bearbeta anpassade parametrar glutInit (& argc, argv); // Begär ett fönster med stöd för dubbel buffring, Z-buffring och True Color glutInitDisplayMode (GLUT_DOUBLE

Del 2 av 3: Displayen () -funktion

  1. 1 Förstå syftet med display () -funktionen. Allt arbete med att göra kuben faller på de sköra linjerna i denna funktion. Den allmänna idén är följande: du kommer att rita sex separata ansikten på kuben och placera dem i sina respektive positioner.
    • För varje ansikte kommer du att definiera fyra hörn, och OpenGL kommer att ansluta dem med linjer och fylla dem med din valda färg. Hur du gör detta kommer att förklaras nedan.
  2. 2 Lägg till funktionen glClear (). Först och främst, när vi arbetar med den här funktionen, behöver vi klar färg och z-buffert... Utan detta kommer den gamla att synas under den nya bilden, och de objekt som ritats av programmet kommer att placeras felaktigt.

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

    • Var uppmärksam på de två sista raderna. Det här är funktionerna glFlush (); och glutSwapBuffers ();, vilket ger effekten av dubbel buffring, vilket beskrivits ovan.

Del 3 av 3: Programinteraktivitet

  1. 1 Lägg till specialKeys () -funktionen. I princip är allt nästan klart, men kuben är bara ritad och inte roterad. För att göra detta måste du skapa specialKeys () -funktionen, som låter dig rotera kuben genom att trycka på piltangenterna!
    • Det är för denna funktion som de globala variablerna rotate_x och rotate_y deklarerades. När du trycker på vänster och höger piltangenter ökar eller minskar rotate_y -värdet med fem grader. Värdet på rotate_x ändras på samma sätt, men den här gången genom att trycka på upp- och nedpilarna.
    • void specialKeys (int key, int x, int y) {// Högerpil - öka rotationen med 5 grader om (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Vänsterpil - Minska rotationen med 5 grader annars om (key == GLUT_KEY_LEFT) rotate_y - = 5; annars om (key == GLUT_KEY_UP) rotate_x + = 5; annars om (key == GLUT_KEY_DOWN) rotate_x - = 5; // Begär skärmuppdatering glutPostRedisplay (); }

  2. 2 Lägg till glRotate (). Det sista vi ska göra är att lägga till en rad som gör att vi kan rotera objektet. Återgå till funktionen display () och före beskrivningen av FRAMSIDAN lägg till:

      // Återställ Transforms glLoadIdentity (); // Rotera när användaren ändrar Värdena rotate_x och rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Flerfärgad sida - FRAM ...

    • Observera att syntaxen glRotatef ()som liknar syntaxen för glColor3f () och glVertex3f (), men kräver alltid fyra parametrar. Den första är rotationsvinkeln i grader. De tre följande är axlarna längs vilka rotationen sker, i ordningen x, y, z. För tillfället måste vi rotera kuben längs två axlar, x och y.
    • Alla transformationer som vi definierar i programmet kräver liknande linjer. I grund och botten representerar vi rotation av ett objekt längs x-axeln som en förändring i värdet av rotate_x och rotation längs y-axeln som en förändring i värdet av rotate_y. OpenGL kommer dock att bunta ihop allt till en transformationsmatris. Varje gång du ringer display, skapar du en transformationsmatris och glLoadIdentity () låter dig börja med en ny matris varje gång.
    • Andra transformationsfunktioner du kan ha använt är glTranslatef () och glScalef (). De liknar glRotatef (), förutom att de bara kräver tre parametrar: x-, y- och z -värdena för att ändra storlek och skala objektet.
    • För att allt ska visas korrekt när alla tre transformationerna tillämpas på ett objekt måste du ställa in transformationer i lämplig ordning, nämligen glTranslate, glRotate, glScale - och aldrig annars. OpenGL omvandlar objektet genom att läsa programmet från botten till toppen. För att bättre förstå detta, föreställ dig hur 1x1x1 -kuben skulle se ut efter alla transformationer om OpenGL applicerade dem i den ordning som visas (uppifrån och ner), och tänk sedan på hur OpenGL skulle bearbeta kuben genom att läsa instruktionerna från botten till toppen.
  3. 3 Lägg till följande kommandon för att skala kuben två gånger i x- och y -riktningen, för att rotera kuben 180 grader i y -axeln och för att flytta kuben 0,1 i x -axeln. Se till att alla relevanta kommandon, inklusive de tidigare givna glRotate () -kommandona, är i rätt ordning. Om du är rädd för att göra ett misstag, se den slutliga versionen av programmet i slutet av artikeln.

      // Fler 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 Kompilera och kör koden. Låt oss säga att du använder gcc som kompilator, så ange följande kommandon i din terminal:

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

  5. 5 Kontrollera den slutliga koden. Här är den sista koden som skapats av författaren till artikeln, som inte översätter kommentarerna.

      // // Fil: mycube.c // Författare: Matt Daisley // Skapad: 2012-04-25 // Projekt: Källkod för Gör en kub i OpenGL // Beskrivning: Skapar ett OpenGL -fönster och ritar en 3D -kub/ / Att användaren kan rotera med piltangenterna // // Kontroller: vänsterpil -rotera vänster // högerpil -rotera höger // pil upp -rotera upp // pil ned -rotera ned // ------ ---------------------------------------------------------- -// Inkluderar // -------------------------------------------- -------------- #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 (); // ------------------------------------------------ ---------- // Globala variabler // ---------------------------------- ------------------------ dubbel rotera_y = 0; dubbel rotera_x = 0; // ------------------------------------------------ ---------- // display () Återuppringningsfunktion // ------------------------------- --------------------------- void display () // Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ ---------------------------------------------------------- -// specialKeys () Återuppringningsfunktion // ------------------------------------------ ------------------ void specialKeys (int-tangenten, int x, int y) {// Högerpil-öka rotationen med 5 grader om (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Vänsterpil - minska rotationen med 5 grader annars om (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; // Begär visningsuppdatering glutPostRedisplay ();} // ------------------------------------- ---------------------- // main () -funktion // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB