OpenGL je močno orodje za 3D programiranje, ki se uporablja za risanje kompleksnih tridimenzionalnih prizorov iz preprostih primitiv. Ta članek vas bo naučil, kako narisati preprosto kocko, ki jo lahko zavrtite za ogled v treh dimenzijah!
Za ta projekt boste potrebovali urejevalnik kod in nekaj znanja programiranja C.
Koraki
1. del od 3: Začetna nastavitev
Korak 1. Namestite OpenGL Za začetek sledite tem korakom za namestitev OpenGL v sistem
Če že imate nameščen OpenGL in združljiv prevajalnik C, lahko preskočite ta korak in pojdite na naslednjega.
Korak 2. Ustvarite dokument
Ustvarite novo datoteko v svojem najljubšem urejevalniku kod in jo shranite kot mycube.c
Korak 3. Dodajte #includes
To so osnovni elementi, ki jih potrebujete za svoj program. Pomembno se je zavedati, da so za različne operacijske sisteme dejansko potrebni različni vključki. Vse to vključite, da zagotovite, da je vaš program vsestranski in se lahko izvaja za vsakega uporabnika.
// Vključuje #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
Korak 4. Dodajte prototipe funkcij in globalne spremenljivke
Naslednji korak je razglasitev nekaterih prototipov funkcij.
// Funkcijski prototipi void display (); void specialKeys (); // Globalne spremenljivke double rotate_y = 0; dvojno vrtenje_x = 0;
Korak 5. Nastavite funkcijo main ()
int main (int argc, char* argv ) {// Inicializirajte GLUT in obdelajte uporabniške parametre glutInit (& argc, argv); // Zahtevaj dvojno pufrirano okno prave barve z Z-vmesnikom glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Korak 6. Ustvarite okno
Naslednji korak je, da ustvarite okno znotraj katerega boste narisali kocko. V tej vadnici se okno imenuje "Awesome Cube".
// Ustvari okno glutCreateWindow ("Awesome Cube");
Korak 7. Omogočite preskus globine
OpenGL je strog jezik, saj ne predvideva, da so omogočene posebne funkcije. Če želite, da se vaš program pravilno prikaže v 3-dimenzijah z vmesnikom Z, ki ste ga pogledali prej, morate omogoči globinski preizkus. Ko nadaljujete z raziskovanjem OpenGL-a, boste odkrili številne funkcije, ki jih boste morali omogočiti, vključno z razsvetljavo, teksturami, obrnjenostjo in še veliko več.
// Omogoči preskus globine Z-vmesnega pomnilnika glEnable (GL_DEPTH_TEST);
Korak 8. Dodajte funkcije povratnega klica
Tu so funkcije povratnega klica, za katere ste prej napisali prototipe. Vsakič po glavni zanki bodo te funkcije poklicane. Funkcija prikaza na novo nariše prizor na podlagi sprememb spremenljivk, ki so bile izvedene od prejšnjega klica. Funkcija specialKeys nam omogoča interakcijo s programom.
// funkcije povratnega klica glutDisplayFunc (zaslon); glutSpecialFunc (specialKeys);
Korak 9. Zaženite MainLoop
S tem boste priklicali glavno funkcijo, dokler ne zaprete programa, da omogočite animacije in interakcijo z uporabnikom.
// Prenesite nadzor na GLUT za dogodke glutMainLoop (); // vrnitev v OS vrnitev 0; }
2. del od 3: Funkcija zaslona ()
Korak 1. Razumeti namen te funkcije
Vse delo pri risanju kocke bo opravljeno v tej funkciji. Splošna ideja vaše kocke je, da narišete vseh šest strani posamično in jih postavite v ustrezen položaj.
Konceptualno bomo vsako stran narisali tako, da določimo štiri vogale in pustimo OpenGL -ju, da poveže vrstice in jo napolni z barvo, ki jo določite. Spodaj so navedeni koraki za to
Korak 2. Dodajte glClear ()
Prvi korak, ki ga morate narediti pri tej funkciji, je počistite barvo in Z medpomnilnik. Brez teh korakov so lahko stare risbe še vedno vidne pod novimi risbami in narisani predmeti ne bi bili na pravilnem mestu na zaslonu.
void display () {// Počisti zaslon in Z-vmesnik glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Korak 3. Dodajte glBegin () in glEnd ()
OpenGL definira predmete kot kombinacijo različnih poligonov. Uporabljati glBegin () ukaz, ste učinkovito odložili svinčnik, ki bo narisal obliko. Če želite dvigniti svinčnik in začeti novo obliko, morate uporabiti glEnd () ukaz. V tej vadnici boste za risanje vsake strani kocke uporabili GL_POLYGON, za ustvarjanje drugih oblik pa lahko uporabite tudi druge možnosti parametrov, kot so GL_LINE, GL_QUAD ali GL_TRIANGLE.
- Tu boste začeli s sprednje strani kocke. Kasneje boste vsem 6 stranem dodali barvo.
// Večbarvna stran - FRONT glBegin (GL_POLYGON); // V naslednjem koraku bodo dodane tocke glEnd ();
Korak 4. Dodajte glVertex3f ()
Ko izjavite, da želite začeti svoj poligon, morate določite točke predmeta. glVertex ima več oblik, odvisno od tega, kaj želite narediti s svojim objektom.
- Prvi je, v koliko dimenzijah delate. Zgornje 3 v glVertex3f pravijo, da rišete v 3 dimenzijah. Možno je tudi delo v 2 ali 4 dimenzijah. Zgornja f v glVertex3f pravi, da delate s številkami s plavajočo vejico. Uporabite lahko tudi kratke, cele ali dvojice.
- Upoštevajte, da so te točke opredeljene v a v nasprotni smeri urinega kazalca način. To trenutno ni zelo pomembno, toda ko začnete delati z razsvetljavo, teksturami in obračanjem, bo to postalo neverjetno pomembno, zato se navadite, da svoje točke definirate v nasprotni smeri urinega kazalca.
- Dodaj, dodaj oglišča med vrsticama glBegin () in glEnd ().
// Večbarvna stran - 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 ();
Korak 5. Dodajte glColor3f ()
glColor deluje na podoben način kot glVertex. Točke lahko definirate kot kratke, cela števila, dvojice ali plavajoče. Vsaka barva ima vrednost od 0 do 1. Vse 0 pomenijo, da je točka črna, vse 1 pa bodo točko bele. 3 v glColor3f () se nanaša na barvni sistem RGB brez alfa kanala. Alfa barve določa njeno preglednost. Če želite spremeniti raven alfa, uporabite glColor4f (), pri čemer je zadnji parameter vrednost 0 do 1 za nepregledno do prozorno.
- Ko pokličete glColor3f (), bo vsaka točka, potegnjena od te točke naprej, te barve. Zato, če želite, da so vsa štiri oglišča rdeča, barvo nastavite enkrat, kadar koli pred ukazi glVertex3f () in vsa oglišča bodo rdeča.
- Spodnja stran, opredeljena spodaj, prikazuje, kako določiti novo barvo za vsako točko. Ko to storite, lahko vidite zanimivo lastnost barv OpenGL. Ker ima vsaka točka poligona svojo barvo, bo OpenGL samodejno mešal barve! Naslednji korak bo pokazal, kako dodeliti štiri točke z isto barvo.
// Večbarvna stran - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je rdeča glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 je zelen glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 je modra glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je vijolična glEnd ();
Korak 6. Ročaj z drugimi stranmi
Ugotovite, kakšna bo lokacija vsakega oglišča za drugih pet strani kocke, vendar so zaradi poenostavitve ti izračunani za vas in so vključeni v funkcija končnega prikaza () spodaj.
// Bela stran - NAZAJ 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 (); // Vijolična stran - DESNO 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 (); // zelena stran - LEVA 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 (); // Modra stran - 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 (); // Rdeča stran - BOTTOM 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 (); }
Za to funkcijo želimo dodati še dve zadnji vrstici kode. To so glFlush ();
in glutSwapBuffers ();
ki nam dajejo učinek dvojnega pufranja, o katerem ste izvedeli prej.
3. del 3: Interakcija uporabnikov
Korak 1. Dodajte specialKeys ()
Skoraj ste končali, trenutno pa lahko narišete kocko, vendar je ne morete zavrteti. Če želite to narediti, boste ustvari posebenKeys () funkcija, ki nam omogoča, da pritisnemo puščične tipke in zasukamo kocko!
- Zaradi te funkcije ste globalne spremenljivke razglasili rotate_x in rotate_y. Ko pritisnete smerni tipki desno in levo, se rotate_y poveča ali zmanjša za 5 stopinj. Podobno, ko pritisnete puščični tipki gor in dol, se bo rotate_x ustrezno spremenil.
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 vrtenje za 5 stopinj, sicer č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 posodobitev zaslona glutPostRedisplay (); }
Korak 2. Dodajte glRotate ()
Zadnji stavek je dodati izjavo, ki bo zavrtela vaš predmet. Vrnite se na funkcijo display () in pred FRONT stranjo dodajte te vrstice:
// Ponastavi transformacije glLoadIdentity (); // Zavrti, ko uporabnik spremeni 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….
Korak 3. Dodajte naslednje ukaze za prilagoditev kocke za 2 vzdolž osi x, 2 vzdolž osi y, zavrtite kocko za 180 stopinj okoli osi y in kocko prenesite za 0,1 vzdolž osi x
Te in prejšnje ukaze glRotate () razporedite v pravilnem vrstnem redu, kot je opisano zgoraj. (Če niste prepričani, to storite v zadnji kodi na koncu vadnice.)
// Druge transformacije glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);
Korak 4. Sestavite in zaženite kodo
Ob predpostavki, da za prevajalnik uporabljate gcc, zaženite te ukaze iz svojega terminala, da sestavite in preizkusite svoj program.
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
Korak 5. Preverite celotno kodo
Tako bi moralo biti:
// // 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 #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Prototipi funkcij / / ------------------------------------------------- --------- prikaz praznine (); void specialKeys (); // ------------------------------------------------ ---------- // Globalne spremenljivke // ---------------------------------- ------------------------ dvojno vrtenje_y = 0; dvojno vrtenje_x = 0; // ------------------------------------------------ ---------- // prikaz () funkcija povratnega klica // ------------------------------- --------------------------- void display () {// Počisti zaslon in Z-vmesnik glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Ponastavi transformacije glLoadIdentity (); // Druge transformacije // glTranslatef (0,1, 0,0, 0,0); // ni vključeno // glRotatef (180, 0,0, 1,0, 0,0); // Ni vključeno // Zavrti, ko uporabnik spremeni rotate_x in rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Druge transformacije // glScalef (2.0, 2.0, 0.0); // Ni vključeno // Večbarvna stran - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je rdeča glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 je zelen glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 je modra glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je vijolična glEnd (); // Bela stran - NAZAJ 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 (); // Vijolična stran - DESNO 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 (); // zelena stran - LEVA 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 (); // Modra stran - 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 (); // Rdeča stran - BOTTOM 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 () Funkcija povratnega klica // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// Puščica desno-povečajte rotacijo za 5 stopnja, če se (ključ == GLUT_KEY_RIGHT) zavrti_y += 5; // puščica levo - zmanjšajte vrtenje za 5 stopinj, sicer č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 posodobitev zaslona glutPostRedisplay (); } // ----------------------------------------------- ----------- // funkcija main () // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Inicializirajte GLUT in obdelajte uporabniške parametre glutInit (& argc, argv); // Zahtevaj dvojno pufrirano okno prave barve z Z-vmesnikom glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Ustvari okno glutCreateWindow ("Awesome Cube"); // Omogoči preskus globine Z-vmesnega pomnilnika glEnable (GL_DEPTH_TEST); // funkcije povratnega klica glutDisplayFunc (zaslon); glutSpecialFunc (specialKeys); // Prenesite nadzor na GLUT za dogodke glutMainLoop (); // vrnitev v OS vrnitev 0; }