Sådan laver du en terning i OpenGL (med billeder)

Indholdsfortegnelse:

Sådan laver du en terning i OpenGL (med billeder)
Sådan laver du en terning i OpenGL (med billeder)

Video: Sådan laver du en terning i OpenGL (med billeder)

Video: Sådan laver du en terning i OpenGL (med billeder)
Video: OpenSSH for Windows: Install, Configure, Connect, and Troubleshoot 2024, April
Anonim

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

1994315 1 1
1994315 1 1

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.

1994315 2 1
1994315 2 1

Trin 2. Opret dokumentet

Opret en ny fil i din foretrukne kode -editor, og gem den som mycube.c

1994315 3 1
1994315 3 1

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

1994315 4 1
1994315 4 1

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;

1994315 5 1
1994315 5 1

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);

  • Denne erklæring opretter dit miljø. En stor ting at huske, når du skriver OpenGL -programmer, er, at du skal bede om alt. Dette kræver, at du har en større forståelse for, hvordan dit program fungerer, og hvad du skal medtage for at få den funktionalitet, du ønsker. På denne linje opsætter du skærmen med dobbeltbuffering, RGB-farve og en Z-buffer.
  • Dobbelt buffering er en teknik, der bruges i grafikprogrammer til at eliminere et problem, der opstår på grund af, hvordan billeder trækkes til skærmen. Hver gang du tegner scenen igen, skal displayet først slettes, derefter trækkes de nye oplysninger. Uden dobbeltbuffering vil du observere en flimrende effekt, da skærmen slettes og tegnes gentagne gange.
  • Dette problem løses ved at tilføje en anden buffer at trække til. Med denne metode tegnes et billede til den første buffer, og den buffer vises for dig. Den næste ramme trækkes til den anden buffer, og når det er gjort, skifter de to buffere sted. Du vil straks se den anden buffer, men skjult for os bliver den første buffer slettet og tegnet med den tredje ramme, som vil blive byttet ind, når den er færdig.
  • Du vil også aktivere RGB farve system i dit vindue.
  • Z-buffering er, hvordan du får de 3D -effekter, du ønsker. OpenGL bruger et tredimensionelt koordinatsystem med x-, y- og z -akser. For at give den effekt, at et objekt er tættere på dig, øges dets position på z -aksen, men for at få det til at se længere væk, reduceres dets position på z -aksen.
1994315 6 1
1994315 6 1

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");

1994315 7 1
1994315 7 1

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);

1994315 8 1
1994315 8 1

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);

1994315 9 1
1994315 9 1

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

1994315 10 1
1994315 10 1

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

1994315 11 1
1994315 11 1

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);

1994315 12 1
1994315 12 1

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 ();

1994315 13 1
1994315 13 1

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 ();

1994315 14 1
1994315 14 1

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 ();

1994315 15 1
1994315 15 1

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

1994315 16 1
1994315 16 1

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 (); }

1994315 17 1
1994315 17 1

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….

  • Bemærk først, at syntaksen for glRotatef () ligner glColor3f () og glVertex3f (), men kræver altid 4 parametre. Den første parameter er graden af rotation, der skal anvendes. De næste tre parametre definerer, hvilken akse der skal roteres, idet den første er x -aksen, den anden er y -aksen og den tredje er z -aksen. Lige nu behøver du kun at rotere om x- og y-aksen.
  • Alle transformationer, du skriver i dit program, har brug for linjer, der ligner dette. Konceptuelt kan du tænke på dette som at rotere dit objekt om x -aksen med den mængde, der er defineret af rotate_x og derefter rotere rundt om y -aksen med rotate_y. OpenGL kombinerer imidlertid alle disse udsagn til en matrix -transformation. Hver gang du kalder displayfunktionen, opbygger du en transformationsmatrix og glLoadIdentity () sikrer, at du starter med en ny matrix i hvert pas.
  • De andre transformationsfunktioner, du kan anvende, er glTranslatef () og glScalef (). Disse funktioner ligner glRotatef () med undtagelse af, at de kun tager 3 parametre, x, y og z -beløbene til at oversætte eller skalere objektet.
  • For at få den korrekte effekt, når du anvender alle tre transformationer på et objekt, skal du anvende dem i den korrekte rækkefølge. Skriv dem altid i rækkefølgen glTranslate, glRotate, derefter glScale. OpenGL anvender hovedsageligt transformationerne på en bottom up -måde. For at forstå dette, prøv at forestille dig, hvordan en simpel 1x1x1 terning ville se ud med transformationerne, hvis OpenGL anvendte dem fra top til bund, og hvis OpenGL anvendte dem fra bund til top.
1994315 18 1
1994315 18 1

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);

1994315 19 1
1994315 19 1

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

1994315 20 1
1994315 20 1

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; }

Anbefalede: