OpenGL er et kraftfuldt 3D-programmeringsværktøj, der bruges til at tegne komplekse tredimensionelle scener fra enkle primitiver. Denne artikel vil lære dig at tegne en simpel terning, som du kan dreje for at se i tre dimensioner!
Til dette projekt skal du bruge en kode -editor og en vis viden om C -programmering.
Trin
Del 1 af 3: Første opsætning
Trin 1. Installer OpenGL Følg disse trin for at begynde at installere OpenGL på dit system
Hvis du allerede har OpenGL, samt en kompatibel C -compiler installeret, kan du springe dette trin over og gå til det næste.
Trin 2. Opret dokumentet
Opret en ny fil i din foretrukne kode -editor, og gem den som mycube.c
Trin 3. Tilføj #includes
Disse er de grundlæggende inkluderinger, du skal bruge til dit program. Det er vigtigt at indse, at der faktisk kræves forskellige inkluderinger til de forskellige operativsystemer. Sørg for at inkludere alle disse for at sikre, at dit program er alsidigt og kan køre for enhver bruger.
// Inkluderer #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
Trin 4. Tilføj funktionsprototyper og globale variabler
Dit næste trin er at erklære nogle funktionsprototyper.
// Funktionsprototyper ugyldig visning (); void specialKeys (); // Globale variabler dobbelt rotate_y = 0; dobbelt roter_x = 0;
Trin 5. Konfigurer hovedfunktionen ()
int main (int argc, char* argv ) {// Initialiser GLUT og behandl brugerparametre glutInit (& argc, argv); // Anmod om dobbeltbufferet ægte farvevindue med Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Trin 6. Opret vinduet
Det næste trin er at opret vinduet inden for hvilken du vil tegne terningen. I denne vejledning kaldes vinduet "Awesome Cube".
// Opret vindue glutCreateWindow ("Awesome Cube");
Trin 7. Aktiver dybdestest
OpenGL er et strengt sprog, idet det ikke forudsætter, at særlige funktioner er aktiveret. For at dit program korrekt kan vises i 3-dimensioner ved hjælp af den Z-buffer, som du kiggede på tidligere, skal du muliggøre dybde-test. Efterhånden som du fortsætter med at udforske OpenGL, vil du opdage mange funktioner, som du skal aktivere, herunder belysning, teksturer, nedslidning og meget mere.
// Aktiver Z-buffer dybde test glEnable (GL_DEPTH_TEST);
Trin 8. Tilføj opkaldsfunktioner
Her er tilbagekaldsfunktionerne, du skrev prototyperne til tidligere. Hver gang gennem hovedsløjfen vil disse funktioner blive kaldt. Displayfunktionen tegner scenen igen baseret på eventuelle ændringer af variabler, der blev foretaget siden det forrige opkald. SpecialKeys -funktionen giver os mulighed for at interagere med programmet.
// Tilbagekaldsfunktioner glutDisplayFunc (display); glutSpecialFunc (specialTaster);
Trin 9. Start MainLoop
Dette vil huske hovedfunktionen, indtil du lukker programmet for at give mulighed for animationer og brugerinteraktion.
// Overfør kontrol til GLUT for begivenheder glutMainLoop (); // Tilbage til OS return 0; }
Del 2 af 3: Displayet () Funktion
Trin 1. Forstå formålet med denne funktion
Alt arbejdet med at tegne din terning udføres i denne funktion. Den generelle idé bag din terning er at tegne alle seks sider individuelt og placere dem i den passende position.
Begrebsmæssigt tegnes hver side ved at definere de fire hjørner og lade OpenGL forbinde linjerne og udfylde den med en farve, du definerer. Nedenfor er trinene til at gøre dette
Trin 2. Tilføj glClear ()
Det første trin, du skal tage i denne funktion, er at ryd farve og Z -buffer. Uden disse trin kan de gamle tegninger stadig være synlige under de nye tegninger, og tegnede objekter ville ikke være på den korrekte placering på skærmen.
tomrumsvisning () {// Ryd skærm og Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Trin 3. Tilføj glBegin () og glEnd ()
OpenGL definerer objekter som kombinationer af forskellige polygoner. Bruger glBegin () kommando, lægger du effektivt en blyant ned, der tegner en form. For at løfte blyanten og begynde en ny form skal du bruge glEnd () kommando. I denne vejledning bruger du GL_POLYGON til at tegne hver side af terningen, men det er muligt at bruge andre parameterindstillinger, f.eks. GL_LINE, GL_QUAD eller GL_TRIANGLE til at oprette andre former.
- Her starter du med forsiden af din terning. Senere tilføjer du farve til alle 6 sider.
// Flerfarvet side - FRONT glBegin (GL_POLYGON); // Vertices tilføjes i næste trin glEnd ();
Trin 4. Tilføj glVertex3f ()
Når du har angivet, at du vil starte din polygon, skal du definere hjørnerne af objektet. glVertex har flere former afhængigt af hvad du vil gøre med dit objekt.
- Den første er, hvor mange dimensioner du arbejder i. De 3 ovenstående i glVertex3f siger, at du tegner i 3 dimensioner. Det er også muligt at arbejde i 2 eller 4 dimensioner. F ovenfor i glVertex3f siger, at du arbejder med flydende tal. Du kan også bruge shorts, heltal eller doubler.
- Bemærk, at disse punkter er defineret i a mod uret måde. Dette er ikke særlig vigtigt i øjeblikket, men når du begynder at arbejde med belysning, teksturer og afskærmning, bliver dette utroligt vigtigt, så vane med at definere dine punkter mod uret nu.
- Tilføj tilføj hjørner mellem linjerne glBegin () og glEnd ().
// Flerfarvet side - FRONT glBegin (GL_POLYGON); glVertex3f (-0,5, -0,5, -0,5); // P1 glVertex3f (-0,5, 0,5, -0,5); // P2 glVertex3f (0,5, 0,5, -0,5); // P3 glVertex3f (0,5, -0,5, -0,5); // P4 glEnd ();
Trin 5. Tilføj glColor3f ()
glColor fungerer på samme måde som glVertex. Du kan definere punkter som shorts, heltal, doubler eller floats. Hver farve har en værdi fra 0 til 1. Alle 0'er gør punktet sort, og alle 1'er gør punktet hvidt. 3 i glColor3f () refererer til RGB -farvesystemet uden alfakanal. Farvenes alfa definerer dens gennemsigtighed. For at ændre alfa -niveauet skal du bruge glColor4f (), hvor den sidste parameter er en værdi på 0 til 1 for uigennemsigtig til gennemsigtig.
- Når du ringer til glColor3f () vil hvert toppunkt, der er trukket fra det tidspunkt, have den farve. Derfor, hvis du vil have alle fire hjørner til at være røde, skal du bare indstille farven en gang når som helst før kommandoerne glVertex3f (), og alle hjørner vil være røde.
- Forsiden defineret nedenfor viser, hvordan man definerer en ny farve for hvert toppunkt. Når du gør dette, kan du se en interessant egenskab ved OpenGL -farverne. Da hvert toppunkt i polygonen har sin egen farve, blander OpenGL automatisk farverne! Det næste trin viser, hvordan du tildeler fire hjørner med samme farve.
// Flerfarvet side - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 er rød glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 er grøn glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 er blå glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 er lilla glEnd ();
Trin 6. Håndter de andre sider
Find ud af, hvad hvert toppunkt vil være for de andre fem sider af terningen, men for nemheds skyld er disse blevet beregnet til dig og er inkluderet i sidste display () -funktion under.
// Hvid side - TILBAGE glBegin (GL_POLYGON); glColor3f (1,0, 1,0, 1,0); glVertex3f (0,5, -0,5, 0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glEnd (); // Lilla side - HØJRE glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 1,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, -0,5, 0,5); glEnd (); // Grøn side - VENSTRE glBegin (GL_POLYGON); glColor3f (0,0, 1,0, 0,0); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); // Blå side - TOP glBegin (GL_POLYGON); glColor3f (0,0, 0,0, 1,0); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, 0,5); glEnd (); // Rød side - BUNDT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); glFlush (); glutSwapBuffers (); }
Vi vil også tilføje to sidste linjer med kode til denne funktion. Disse er glFlush ();
og glutSwapBuffers ();
som giver os den dobbeltbuffereffekt, du tidligere har lært om.
Del 3 af 3: Brugerinteraktivitet
Trin 1. Tilføj specialKeys ()
Du er næsten færdig, men i øjeblikket kan du tegne en terning, men kan ikke rotere den. For at gøre dette, vil du opret en specialkey () funktion, så vi kan trykke på piletasterne og rotere terningen!
- Denne funktion er grunden til, at du erklærede de globale variabler rotate_x og rotate_y. Når du trykker på højre og venstre piletast, øges eller reduceres rotate_y med 5 grader. På samme måde, når du trykker på piletasterne op og ned, ændres rotate_x tilsvarende.
void specialKeys (int key, 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; ellers hvis (key == GLUT_KEY_UP) rotate_x += 5; ellers hvis (key == GLUT_KEY_DOWN) rotate_x -= 5; // Anmod om visningsopdatering glutPostRedisplay (); }
Trin 2. Tilføj glRotate ()
Din sidste erklæring er at tilføje den sætning, der vil rotere dit objekt. Gå tilbage til displayet () -funktionen, og tilføj følgende linjer før fronten:
// Nulstil transformationer glLoadIdentity (); // Rotér, når bruger ændrer 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….
Trin 3. Tilføj følgende kommandoer for at skalere terningen med 2 langs x-aksen, 2 langs y-aksen, rotere terningen 180 grader om y-aksen og oversætte terningen med 0,1 langs x-aksen
Sørg for at arrangere disse såvel som de tidligere glRotate () kommandoer i den korrekte rækkefølge som beskrevet ovenfor. (Hvis du er usikker, gøres dette i den sidste kode i slutningen af selvstudiet.)
// Andre transformationer glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);
Trin 4. Kompilér og kør din kode
Forudsat at du bruger gcc som din kompilator, skal du køre disse kommandoer fra din terminal for at kompilere og teste dit program.
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
Trin 5. Kontroller din komplette kode
Det skal være sådan her:
// // 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 // ------ -------------------------------------------------- -// Inkluderer // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Funktionsprototyper / / ------------------------------------------------- --------- ugyldigt display (); 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 | GL_DEPTH_BUFFER_BIT); // Nulstil transformationer glLoadIdentity (); // Andre transformationer // glTranslatef (0,1, 0,0, 0,0); // Ikke inkluderet // glRotatef (180, 0.0, 1.0, 0.0); // Ikke inkluderet // Rotér når bruger ændrer rotate_x og rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Andre transformationer // glScalef (2.0, 2.0, 0.0); // Ikke inkluderet // Flerfarvet side - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 er rød glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 er grøn glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 er blå glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 er lilla glEnd (); // Hvid side - TILBAGE glBegin (GL_POLYGON); glColor3f (1,0, 1,0, 1,0); glVertex3f (0,5, -0,5, 0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glEnd (); // Lilla side - HØJRE glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 1,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, -0,5, 0,5); glEnd (); // Grøn side - VENSTRE glBegin (GL_POLYGON); glColor3f (0,0, 1,0, 0,0); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); // Blå side - TOP glBegin (GL_POLYGON); glColor3f (0,0, 0,0, 1,0); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, 0,5); glEnd (); // Rød side - BUNDT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); glFlush (); glutSwapBuffers (); } // ----------------------------------------------- ----------- // specialKeys () tilbagekaldsfunktion // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// Højre pil-øg rotation med 5 grad 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 visningsopdatering glutPostRedisplay (); } // ----------------------------------------------- ----------- // main () funktion // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Initialiser GLUT og behandl brugerparametre glutInit (& argc, argv); // Anmod om dobbeltbufferet ægte farvevindue med Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Opret vindue glutCreateWindow ("Awesome Cube"); // Aktiver Z-buffer dybde test glEnable (GL_DEPTH_TEST); // Tilbagekaldsfunktioner glutDisplayFunc (display); glutSpecialFunc (specialTaster); // Overfør kontrol til GLUT for begivenheder glutMainLoop (); // Tilbage til OS return 0; }