Kako napraviti kocku u OpenGL -u (sa slikama)

Sadržaj:

Kako napraviti kocku u OpenGL -u (sa slikama)
Kako napraviti kocku u OpenGL -u (sa slikama)

Video: Kako napraviti kocku u OpenGL -u (sa slikama)

Video: Kako napraviti kocku u OpenGL -u (sa slikama)
Video: феникс ос установка с флешки, андроид на пк 2024, Ožujak
Anonim

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

1994315 1 1
1994315 1 1

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.

1994315 2 1
1994315 2 1

Korak 2. Kreirajte dokument

Izradite novu datoteku u svom omiljenom uređivaču koda i spremite je kao mycube.c

1994315 3 1
1994315 3 1

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

1994315 4 1
1994315 4 1

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;

1994315 5 1
1994315 5 1

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

  • Ova izjava postavlja vaše okruženje. Velika stvar koju treba zapamtiti pri pisanju OpenGL programa je da morate tražiti sve. To zahtijeva da bolje razumijete kako vaš program radi i što trebate uključiti da biste dobili željenu funkcionalnost. U ovoj liniji ćete postaviti zaslon s dvostrukim međuspremnikom, RGB bojom i Z-međuspremnikom.
  • Dvostruko puferiranje je tehnika koja se koristi u grafičkim programima za uklanjanje problema koji nastaje zbog načina na koji se slike privlače na zaslon. Svaki put kad ponovno iscrtate scenu, zaslon se prvo mora izbrisati, a zatim će se izvući nove informacije. Bez dvostrukog međuspremnika primijetit ćete učinak treperenja jer se zaslon briše i iznova crta.
  • Ovaj se problem rješava dodavanjem drugog međuspremnika za crtanje. Ovom metodom slika se iscrtava u prvi međuspremnik i taj međuspremnik vam se prikazuje. Sljedeći okvir bit će povučen u drugi međuspremnik i kad to učini, dva međuspremnika promijenit će mjesta. Odmah ćete vidjeti drugi međuspremnik, ali skriveno od nas, prvi međuspremnik se briše i ponovno iscrtava s trećim okvirom koji će se zamijeniti kad završi.
  • Također želite omogućiti RGB boja sustav u vašem prozoru.
  • Z-međuspremnik tako dobivate željene 3D efekte. OpenGL koristi trodimenzionalni koordinatni sustav s osama x, y i z. Kako bi se postigao učinak da vam je objekt bliže, njegov položaj na osi z se povećava, međutim, kako bi izgledao dalje, njegov položaj na osi z se smanjuje.
1994315 6 1
1994315 6 1

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

1994315 7 1
1994315 7 1

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

1994315 8 1
1994315 8 1

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

1994315 9 1
1994315 9 1

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

1994315 10 1
1994315 10 1

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

1994315 11 1
1994315 11 1

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

1994315 12 1
1994315 12 1

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

1994315 13 1
1994315 13 1

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

1994315 14 1
1994315 14 1

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

1994315 15 1
1994315 15 1

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

1994315 16 1
1994315 16 1

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

1994315 17 1
1994315 17 1

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

  • Prvo primijetite da je sintaksa od glRotatef () sličan je onom kod glColor3f () i glVertex3f (), ali uvijek zahtijeva 4 parametra. Prvi parametar je stupanj rotacije koji se primjenjuje. Sljedeća tri parametra definiraju oko koje se osi treba rotirati, pri čemu je prva os x, druga je os y, a treća os z. Trenutno se samo trebate okretati oko osi x i y.
  • Sve transformacije koje napišete u svom programu trebaju slične retke. Konceptualno, ovo možete zamisliti kao rotiranje vašeg objekta oko osi x za iznos definiran rotate_x, a zatim rotiranje oko osi y za rotate_y. Međutim, OpenGL kombinira sve ove izjave u jednu transformaciju matrice. Svaki put kada pozovete funkciju prikaza, sastavljate matricu transformacije i glLoadIdentity () jamči da ćete u svakom prolazu početi s novom matricom.
  • Druge transformacijske funkcije koje možete primijeniti su glTranslatef () i glScalef (). Ove su funkcije slične glRotatef (), osim što uzimaju samo 3 parametra, x, y i z iznosi za prevođenje ili skaliranje objekta.
  • Da biste postigli točan učinak pri primjeni sve tri transformacije na jedan objekt, morate ih primijeniti ispravnim redoslijedom. Uvijek ih upišite redoslijedom glPrevedi, glRotate, pa glScale. OpenGL u osnovi primjenjuje transformacije na način odozdo prema gore. Da biste razumjeli ovo, pokušajte zamisliti kako bi izgledala jednostavna kocka 1x1x1 s transformacijama ako bi ih OpenGL primijenio odozgo prema dolje i ako bi ih OpenGL primijenio odozdo prema gore.
1994315 18 1
1994315 18 1

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

1994315 19 1
1994315 19 1

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

1994315 20 1
1994315 20 1

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

Preporučeni: