Kako narediti kocko v OpenGL

Avtor: Gregory Harris
Datum Ustvarjanja: 12 April 2021
Datum Posodobitve: 1 Julij. 2024
Anonim
Writing 2D Games in C using SDL by Thomas Lively
Video.: Writing 2D Games in C using SDL by Thomas Lively

Vsebina

OpenGL je orodje za 3D programiranje, ki vam omogoča ustvarjanje kompleksnih 3D slik iz preprostih oblik. V tem članku se boste naučili, kako z njegovo pomočjo narisati preprosto kocko, ki jo je mogoče zasukati v treh dimenzijah!

Koraki

1. del od 3: Začetna namestitev

  1. 1 Namestite OpenGL. Začnite z vadnico o tem, kako namestiti OpenGL v računalnik. Če že imate OpenGL in prevajalnik C, lahko ta korak preskočite in se pomaknete na naslednjega.
  2. 2 Ustvarite dokument. Ustvarite novo datoteko v svojem najljubšem urejevalniku kod in jo shranite kot mycube.c
  3. 3 Dodajte #includes. Tu so osnovne direktive #include, ki jih boste potrebovali. Pomembno si je zapomniti, da so direktive za različne operacijske sisteme različne, zato morate izbrati vse, da bo program univerzalen in ga je mogoče izvajati v katerem koli sistemu.

      // Vključuje #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 Dodajte funkcionalne prototipe in globale. Naslednji korak je razglasitev funkcionalnih prototipov.

      // Funkcionalni prototipi void display (); void specialKeys (); // Globalne spremenljivke double rotate_y = 0; dvojno vrtenje_x = 0;

  5. 5 Določite funkcijo main ().

      int main (int argc, char * argv []) // Inicializirajte GLUT in obdelajte parametre po meri glutInit (& argc, argv); // Zahtevajte okno s podporo za dvojno pufriranje, Z-pufriranje in pravo barvo glutInitDisplayMode (GLUT_DOUBLE

2. del od 3: Funkcija zaslona ()

  1. 1 Razumeti namen funkcije display (). Vse delo pri upodabljanju kocke bo padlo na krhke črte te funkcije. Splošna ideja je naslednja: narisali boste šest ločenih obrazov kocke in jih postavili na ustrezna mesta.
    • Za vsak obraz boste določili štiri vogale, OpenGL pa jih bo povezal s črtami in jih napolnil z izbrano barvo. Kako to storiti, bo razloženo spodaj.
  2. 2 Dodajte funkcijo glClear (). Najprej pri delu s to funkcijo potrebujemo prozorna barva in z-pufer... Brez tega bo stara videti pod novo sliko, predmeti, ki jih nariše program, pa bodo nepravilno postavljeni.

      void display () // Počisti zaslon in vmesnik Z glClear (GL_COLOR_BUFFER_BIT

    • Bodite pozorni na zadnji dve vrstici. To so funkcije glFlush (); in glutSwapBuffers ();, ki daje učinek dvojnega pufranja, kar je bilo opisano zgoraj.

3. del 3: Interaktivnost programa

  1. 1 Dodajte funkcijo specialKeys (). Načeloma je vse skoraj pripravljeno, kocka pa je le vlečena in ne vrteča se. Če želite to narediti, morate ustvariti funkcijo specialKeys (), ki vam bo omogočil vrtenje kocke s pritiskom na puščične tipke!
    • Za to funkcijo so bile razglašene globalne spremenljivke rotate_x in rotate_y. Ko pritisnete levo in desno puščično tipko, se bo vrednost rotate_y povečala ali zmanjšala za pet stopinj. Vrednost rotate_x se bo spremenila na enak način, vendar tokrat s pritiskom na puščični tipki gor in dol.
    • void specialKeys (int key, int x, int y) {// Puščica desno - povečajte rotacijo za 5 stopinj, če (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Puščica levo - Zmanjšaj vrtenje za 5 stopinj drugače, če (ključ == GLUT_KEY_LEFT) rotate_y - = 5; else if (key == GLUT_KEY_UP) rotate_x + = 5; sicer, če (ključ == GLUT_KEY_DOWN) rotate_x - = 5; // Zahtevaj osvežitev zaslona glutPostRedisplay (); }

  2. 2 Dodajte glRotate (). Zadnja stvar, ki jo bomo naredili, je, da dodamo črto, ki nam bo omogočila zasuk predmeta. Vrnite se v funkcijo display () in pred opis sprednje strani dodajte:

      // Ponastavi transformacije glLoadIdentity (); // Zavrti, ko se uporabnik spremeni Vrednosti rotate_x in rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Večbarvna stran - spredaj ....

    • Upoštevajte, da je skladnja glRotatef ()ki je podoben skladnji glColor3f () in glVertex3f (), vendar vedno zahteva štiri parametre. Prvi je kot vrtenja v stopinjah. Naslednje tri so osi, po katerih poteka vrtenje, v vrstnem redu x, y, z. Zaenkrat moramo kocko zavrtiti vzdolž dveh osi, x in y.
    • Vse transformacije, ki jih definiramo v programu, zahtevajo podobne vrstice. V osnovi predstavljamo vrtenje predmeta vzdolž osi x kot spremembo vrednosti rotate_x, vrtenje vzdolž osi y pa kot spremembo vrednosti rotate_y. Vendar bo OpenGL vse združil v eno transformacijsko matriko. Vsakič, ko pokličete zaslon, boste ustvarili transformacijsko matriko in glLoadIdentity () vam bo omogočilo, da vsakič začnete z novo matrico.
    • Druge transformacijske funkcije, ki ste jih morda uporabili, so glTranslatef () in glScalef (). Podobni so glRotatef (), le da zahtevajo le tri parametre: vrednosti x, y in z za spreminjanje velikosti in spreminjanje velikosti predmeta.
    • Če želite, da se vse prikaže pravilno, ko so vse tri transformacije uporabljene za en predmet, morate pretvorbe nastaviti v ustreznem vrstnem redu, in sicer glPrevajaj, glRotate, glScale - in nikoli drugače. OpenGL preoblikuje predmet z branjem programa od spodaj navzgor. Če želite to bolje razumeti, si predstavljajte, kako bi kocka 1x1x1 izgledala po vseh transformacijah, če bi jih OpenGL uporabil v prikazanem vrstnem redu (od zgoraj navzdol), nato pa razmislite, kako bi OpenGL obdelal kocko, tako da preberete navodila od spodaj navzgor.
  3. 3 Dodajte naslednje ukaze za dvakratno merjenje kocke v smeri x in y, kocko zavrtite za 180 stopinj po osi y in premaknite kocko 0,1 za os x. Prepričajte se, da so vsi ustrezni ukazi, vključno s prej danimi ukazi glRotate (), v pravilnem vrstnem redu. Če se bojite narediti napako, si oglejte končno različico programa na koncu članka.

      // Več transformacij glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2.0, 2.0, 0.0);

  4. 4 Sestavite in zaženite kodo. Recimo, da za prevajalnik uporabljate gcc, zato v svoj terminal vnesite naslednje ukaze:

      V Linuxu: gcc cube.c -o cube -lglut -lGL ./ mycube V računalniku Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube V sistemu Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 Preverite končno kodo. Tu je končna koda, ki jo je ustvaril avtor članka in ne prevaja komentarjev.

      // // Datoteka: mycube.c // Avtor: Matt Daisley // Ustvarjen: 25.4.2012 // Projekt: Izvorna koda za Make a Cube v OpenGL // Opis: Ustvari okno OpenGL in nariše 3D kocko/ / Da se lahko uporabnik vrti s puščičnimi tipkami // // Kontrolniki: Puščica levo -Zavrtite levo // Puščica desno -Zavrtite desno // Puščica navzgor -Zavrtite navzgor // Puščica navzdol -Zavrtite navzdol // ------ -------------------------------------------------- -// Vključuje // -------------------------------------------- -------------- #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 // ---------------------------------------- ------------------ // Prototipi funkcij // -------------------------- -------------------------------- prikaz praznine (); void specialKeys (); // ------------------------------------------------ ---------- // Globalne spremenljivke // ---------------------------------- ------------------------ dvojno vrtenje_y = 0; dvojno vrtenje_x = 0; // ------------------------------------------------ ---------- // display () Funkcija povratnega klica // ------------------------------- --------------------------- void display () // Počisti zaslon in Z-vmesnik glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () Funkcija povratnega klica // ---------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// Puščica desno-povečajte rotacijo za 5 stopinj, če (key == GLUT_KEY_RIGHT) rotate_y + = 5; // puščica levo - zmanjšajte rotacijo za 5 stopinj, če if (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; // Zahtevaj posodobitev zaslona glutPostRedisplay ();} // ------------------------------------ ---------------------- // funkcija main () // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB