OpenGL je moćan alat za 3D programiranje koji se koristi za crtanje složenih trodimenzionalnih scena iz jednostavnih primitiva. Ovaj članak će vas naučiti kako nacrtati jednostavnu kocku koju možete okretati da biste je vidjeli u tri dimenzije!
Za ovaj projekt trebat će vam uređivač koda i neko znanje programiranja na C -u.
Koraci
Dio 1 od 3: Početno postavljanje
Korak 1. Instalirajte OpenGL Za početak slijedite ove korake za instaliranje OpenGL -a na svoj sustav
Ako već imate OpenGL, kao i kompatibilni C kompajler, možete preskočiti ovaj korak i prijeći na sljedeći.
Korak 2. Kreirajte dokument
Izradite novu datoteku u svom omiljenom uređivaču koda i spremite je kao mycube.c
Korak 3. Dodajte #includes
Ovo su osnovni sadržaji koji će vam trebati za vaš program. Važno je shvatiti da su za različite operativne sustave zapravo potrebni različiti sadržaji. Uključite sve ove stavke kako biste bili sigurni da je vaš program svestran i da se može pokrenuti za svakog korisnika.
// Uključuje #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
Korak 4. Dodajte prototipe funkcija i globalne varijable
Vaš sljedeći korak je deklariranje nekih prototipova funkcija.
// Funkcija Prototipovi void display (); void specialKeys (); // Globalne varijable double rotate_y = 0; dvostruko rotiranje_x = 0;
Korak 5. Postavite funkciju main ()
int main (int argc, char* argv ) {// Inicijalizacija GLUT -a i obrada korisničkih parametara glutInit (& argc, argv); // Zatražite prozor s istinskom bojom s dvostrukim međuspremnikom sa Z-međuspremnikom glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Korak 6. Izradite prozor
Sljedeći korak je do stvoriti prozor unutar kojeg ćete nacrtati kocku. U ovom vodiču prozor se zove "Awesome Cube".
// Stvaranje prozora glutCreateWindow ("Awesome Cube");
Korak 7. Omogućite ispitivanje dubine
OpenGL je strog jezik jer ne pretpostavlja da su omogućene posebne značajke. Da bi se vaš program ispravno prikazao u 3-dimenzije pomoću Z-međuspremnika koji ste ranije pogledali, morate omogućiti dubinsko ispitivanje. Nastavljajući s istraživanjem OpenGL-a, otkrit ćete mnoge značajke koje ćete morati omogućiti, uključujući osvjetljenje, teksture, okidanje i mnogo više.
// Omogući ispitivanje dubine Z-međuspremnika glEnable (GL_DEPTH_TEST);
Korak 8. Dodajte funkcije povratnog poziva
Evo funkcija povratnog poziva za koje ste ranije napisali prototipove. Svaki put kroz glavnu petlju ove će se funkcije pozivati. Funkcija prikaza precrtava scenu na temelju svih promjena varijabli koje su napravljene od prethodnog poziva. Funkcija specialKeys omogućuje nam interakciju s programom.
// Funkcije povratnog poziva glutDisplayFunc (zaslon); glutSpecialFunc (specialKeys);
Korak 9. Pokrenite MainLoop
Ovo će opozvati glavnu funkciju sve dok ne zatvorite program kako biste omogućili animacije i interakciju s korisnikom.
// Prijenos kontrole na GLUT za događaje glutMainLoop (); // Povratak na OS povratak 0; }
Dio 2 od 3: Funkcija prikaza ()
Korak 1. Shvatite svrhu ove funkcije
Sav posao crtanja kocke bit će obavljen u ovoj funkciji. Opća ideja iza vaše kocke je nacrtati svih šest strana pojedinačno i postaviti ih u odgovarajući položaj.
Konceptualno, svaka će se strana nacrtati definiranjem četiri kuta i dopustiti OpenGL -u da poveže linije i ispuni ga bojom koju definirate. U nastavku su navedeni koraci za to
Korak 2. Dodajte glClear ()
Prvi korak koji trebate poduzeti u ovoj funkciji je da očistite boju i Z međuspremnik. Bez ovih koraka stari crteži mogu biti vidljivi pod novim crtežima, a nacrtani objekti ne bi bili na ispravnom mjestu na ekranu.
void display () {// Očisti zaslon i Z-međuspremnik glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Korak 3. Dodajte glBegin () i glEnd ()
OpenGL definira objekte kao kombinacije različitih poligona. Koristiti glBegin () naredbom, učinkovito odložite olovku koja će nacrtati oblik. Da biste podigli olovku i započeli novi oblik, morate koristiti glEnd () naredba. U ovom ćete vodiču koristiti GL_POLYGON za crtanje svake strane kocke, ali moguće je upotrijebiti i druge opcije parametara kao što su GL_LINE, GL_QUAD ili GL_TRIANGLE za stvaranje drugih oblika.
- Ovdje ćete početi s prednje strane kocke. Kasnije ćete dodati boju na svih 6 strana.
// Višebojna strana - FRONT glBegin (GL_POLYGON); // Vrhovi će se dodati u sljedećem koraku glEnd ();
Korak 4. Dodajte glVertex3f ()
Nakon što ste izjavili da želite započeti svoj poligon, morate definirati vrhove objekta. glVertex ima više oblika ovisno o tome što želite učiniti sa svojim objektom.
- Prvi je u koliko dimenzija radite. Gornje 3 u glVertex3f govore da crtate u 3 dimenzije. Također je moguće raditi u 2 ili 4 dimenzije. Gornje f u glVertex3f kaže da radite s brojevima s pomičnim zarezom. Također možete koristiti kratke, cijele brojeve ili parove.
- Uočite da su te točke definirane u a suprotno od kazaljke na satu način. To trenutačno nije jako važno, ali kad počnete raditi na osvjetljenju, teksturama i okretanju, to će postati nevjerojatno važno pa steknite naviku da sada definirate svoje bodove u smjeru suprotnom od kazaljke na satu.
- Dodaj, dodaj vrhove između redaka glBegin () i glEnd ().
// Višebojna strana - 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 radi na sličan način kao glVertex. Točke možete definirati kao kratke, cijele brojeve, dvostruke ili plutajuće. Svaka boja ima vrijednost od 0 do 1. Sve 0 čine točku crnom, a sve 1 će točku učiniti bijelom. 3 u glColor3f () odnosi se na RGB sustav boja bez alfa kanala. Alfa boje definira njezinu prozirnost. Za promjenu alfa razine upotrijebite glColor4f () s posljednjim parametrom od 0 do 1 za neprozirno do prozirno.
- Kada pozovete glColor3f () svaki vrh od te točke bit će te boje. Stoga, ako želite da sva četiri vrha budu crvena, samo postavite boju jednom bilo kada prije naredbi glVertex3f () i svi će vrhovi biti crveni.
- Dolje definirana prednja strana pokazuje kako definirati novu boju za svaki vrh. Kad to učinite, možete vidjeti zanimljivo svojstvo OpenGL boja. Budući da svaki vrh poligona ima svoju boju, OpenGL će automatski pomiješati boje! Sljedeći korak pokazat će kako dodijeliti četiri vrha iste boje.
// Višebojna strana - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je crvena glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 je zelena glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 je plavo glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je ljubičasta glEnd ();
Korak 6. Rukujte drugim stranama
Odredite mjesto svakog vrha za ostalih pet strana kocke, ali radi jednostavnosti, oni su izračunati za vas i uključeni su u final display () funkcija ispod.
// Bijela strana - NAZAD 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 (); // Ljubičasta strana - 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 strana - LIJEVO 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 (); // Plava strana - 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 (); // Crvena strana - DOLJE 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 (); }
Također želimo dodati dva posljednja retka koda za ovu funkciju. Ovi su glFlush ();
i glutSwapBuffers ();
koji nam daju učinak dvostrukog međuspremnika o kojem ste ranije naučili.
3. dio 3: Interakcija korisnika
Korak 1. Dodajte specialKeys ()
Skoro ste gotovi, ali u ovom trenutku možete nacrtati kocku, ali je ne možete rotirati. Da biste to učinili, hoćete izradi posebanKeys () funkcija koja nam omogućuje da pritisnemo tipke sa strelicama i rotiramo kocku!
- Ova funkcija je razlog zašto ste globalne varijable proglasili rotate_x i rotate_y. Kada pritisnete tipke sa strelicama udesno i ulijevo, rotate_y će se povećati ili smanjiti za 5 stupnjeva. Slično, kada pritisnete tipke sa strelicama gore i dolje, rotate_x će se promijeniti u skladu s tim.
void specialKeys (int key, int x, int y) {// Strelica udesno - povećanje rotacije za 5 stupnjeva if (key == GLUT_KEY_RIGHT) rotate_y += 5; // Strelica ulijevo - smanji rotaciju za 5 stupnjeva inače if (key == GLUT_KEY_LEFT) rotate_y - = 5; inace if (key == GLUT_KEY_UP) rotate_x += 5; inace if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Zatražite ažuriranje zaslona glutPostRedisplay (); }
Korak 2. Dodajte glRotate ()
Vaša posljednja izjava je dodavanje izjave koja će rotirati vaš objekt. Vratite se na funkciju display () i prije FRONT strane dodajte ove retke:
// Poništavanje transformacija glLoadIdentity (); // Rotiraj kada korisnik promijeni rotate_x i rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Višebojna strana - PREDNJA….
Korak 3. Dodajte sljedeće naredbe za mjerenje kocke za 2 duž osi x, 2 duž osi y, zarotirajte kocku za 180 stupnjeva oko osi y i prevedite kocku za 0,1 duž osi x
Rasporedite ove, kao i prethodne naredbe glRotate () ispravnim redoslijedom, kako je gore opisano. (Ako niste sigurni, to ćete učiniti u konačnom kodu na kraju vodiča.)
// Ostale 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. Sastavite i pokrenite svoj kôd
Pod pretpostavkom da koristite gcc kao prevoditelj, pokrenite ove naredbe sa svog terminala da biste kompajlirali i testirali svoj program.
Na Linuxu: gcc cube.c -o kocka -lglut -lGL./ mycube Na Macu: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube U sustavu Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Korak 5. Provjerite potpuni kôd
To bi trebalo biti ovako:
// // Datoteka: mycube.c // Autor: Matt Daisley // Kreirano: 25.4.2012 / Da se korisnik može okretati pomoću tipki sa strelicama // // Kontrole: Strelica ulijevo -Rotiraj ulijevo // Strelica udesno -Rotiraj udesno // Strelica gore -Rotiraj gore // Strelica prema dolje -Rotiraj prema dolje // ------ -------------------------------------------------- -// Uključuje // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Prototipovi funkcija / / ------------------------------------------------- --------- prikaz praznine (); void specialKeys (); // ------------------------------------------------ ---------- // Globalne varijable // ---------------------------------- ------------------------ dvostruko rotiranje_y = 0; dvostruko rotiranje_x = 0; // ------------------------------------------------ ---------- // display () Funkcija povratnog poziva // ------------------------------- --------------------------- void display () {// Očisti zaslon i Z-međuspremnik glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Poništavanje transformacija glLoadIdentity (); // Ostale transformacije // glTranslatef (0.1, 0.0, 0.0); // Nije uključeno // glRotatef (180, 0.0, 1.0, 0.0); // Nije uključeno // Rotiraj kada korisnik promijeni rotate_x i rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Ostale transformacije // glScalef (2.0, 2.0, 0.0); // Nije uključeno // Višebojna strana - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je crvena glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 je zelena glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 je plavo glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je ljubičasta glEnd (); // Bijela strana - NAZAD 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 (); // Ljubičasta strana - 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 strana - LIJEVO 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 (); // Plava strana - 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 (); // Crvena strana - DOLJE 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 povratnog poziva // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// Strelica udesno-povećanje rotacije za 5 stupanj ako (ključ == GLUT_KEY_RIGHT) rotirati_y += 5; // Strelica ulijevo - smanji rotaciju za 5 stupnjeva inače if (key == GLUT_KEY_LEFT) rotate_y - = 5; inace if (key == GLUT_KEY_UP) rotate_x += 5; inace if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Zatraži ažuriranje zaslona glutPostRedisplay (); } // ----------------------------------------------- ----------- // glavna funkcija // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Inicijalizacija GLUT-a i obrada korisničkih parametara glutInit (& argc, argv); // Zatražite prozor s istinskom bojom s dvostrukim međuspremnikom sa Z-međuspremnikom glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Stvaranje prozora glutCreateWindow ("Awesome Cube"); // Omogući ispitivanje dubine Z-međuspremnika glEnable (GL_DEPTH_TEST); // Funkcije povratnog poziva glutDisplayFunc (zaslon); glutSpecialFunc (specialKeys); // Prijenos kontrole na GLUT za događaje glutMainLoop (); // Povratak na OS povratak 0; }