Kako napraviti kocku u OpenGL -u

Autor: Gregory Harris
Datum Stvaranja: 12 Travanj 2021
Datum Ažuriranja: 1 Srpanj 2024
Anonim
Kako napraviti ninja kornjaču od lego kockica
Video: Kako napraviti ninja kornjaču od lego kockica

Sadržaj

OpenGL je alat za 3D programiranje koji vam omogućuje stvaranje složenih 3D slika od jednostavnih oblika. U ovom ćete članku naučiti kako uz njegovu pomoć nacrtati jednostavnu kocku koja se može rotirati u tri dimenzije!

Koraci

Dio 1 od 3: Početna instalacija

  1. 1 Instalirajte OpenGL. Počnite s vodičem o tome kako instalirati OpenGL na svoje računalo. Ako već imate OpenGL i C prevoditelj, možete preskočiti ovaj korak i prijeći na sljedeći.
  2. 2 Napravite dokument. Izradite novu datoteku u svom omiljenom uređivaču koda i spremite je kao mycube.c
  3. 3 Dodajte #includes. Evo osnovnih smjernica #include koje ćete trebati. Važno je zapamtiti da su direktive za različite operacijske sustave različite, pa stoga morate odabrati sve kako bi program bio univerzalan i mogao se izvoditi na bilo kojem sustavu.

      // Uključ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 i globale. Sljedeći korak je deklariranje funkcionalnih prototipova.

      // Funkcionalni prototipi void display (); void specialKeys (); // Globalne varijable double rotate_y = 0; dvostruko rotiranje_x = 0;

  5. 5 Definirajte funkciju main ().

      int main (int argc, char * argv []) // Inicijalizacija GLUT -a i obrada prilagođenih parametara glutInit (& argc, argv); // Zatražite prozor s podrškom za dvostruko međuspremljenje, Z-međuspremnik i pravu boju glutInitDisplayMode (GLUT_DOUBLE

Dio 2 od 3: Funkcija prikaza ()

  1. 1 Shvatite svrhu funkcije display (). Sav posao oko iscrtavanja kocke past će na krhke crte ove funkcije. Opća ideja je sljedeća: nacrtat ćete šest zasebnih lica kocke i postaviti ih na odgovarajuće položaje.
    • Za svako lice definirat ćete četiri ugla, a OpenGL će ih povezati linijama i ispuniti odabranom bojom. Kako to učiniti bit će objašnjeno u nastavku.
  2. 2 Dodajte funkciju glClear (). Prije svega, pri radu s ovom funkcijom potrebno nam je bistra boja i z-pufer... Bez toga će stari biti vidljiv pod novom slikom, a predmeti nacrtani programom bit će nepravilno postavljeni.

      void display () // Očisti zaslon i Z međuspremnik glClear (GL_COLOR_BUFFER_BIT

    • Obratite pozornost na posljednja dva retka. To su funkcije glFlush (); i glutSwapBuffers ();, dajući učinak dvostrukog puferiranja, koji je gore opisan.

Dio 3 od 3: Interaktivnost programa

  1. 1 Dodajte funkciju specialKeys (). U principu, sve je gotovo spremno, ali kocka se samo izvlači, a ne okreće. Da biste to učinili, morate stvoriti funkcija specialKeys (), koji će vam omogućiti rotiranje kocke pritiskom na tipke sa strelicama!
    • Upravo za ovu funkciju deklarirane su globalne varijable rotate_x i rotate_y. Kad pritisnete lijevu i desnu tipku sa strelicom, vrijednost rotate_y će se povećati ili smanjiti za pet stupnjeva. Vrijednost rotate_x će se promijeniti na isti način, ali ovaj put pritiskom na tipke sa strelicama gore i dolje.
    • void specialKeys (int key, int x, int y) {// Strelica udesno - povećajte rotaciju 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ži osvježavanje zaslona glutPostRedisplay (); }

  2. 2 Dodajte glRotate (). Posljednje što ćemo učiniti je dodati liniju koja će nam omogućiti da rotiramo objekt. Povratak na funkciju prikaz () a prije opisa prednje strane dodajte:

      // Poništi transformacije glLoadIdentity (); // Rotiraj kada korisnik promijeni Vrijednosti 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 ....

    • Napominjemo da je sintaksa glRotatef ()što je slično sintaksi glColor3f () i glVertex3f (), ali uvijek zahtijeva četiri parametra. Prvi je kut rotacije u stupnjevima. Sljedeće tri su osi duž kojih se odvija rotacija, redom x, y, z. Za sada moramo zarotirati kocku duž dvije osi, x i y.
    • Sve transformacije koje definiramo u programu zahtijevaju slične retke. U osnovi, predstavljamo rotaciju objekta duž osi x kao promjenu vrijednosti rotate_x, a rotaciju duž osi y kao promjenu vrijednosti rotate_y. Međutim, OpenGL će sve spojiti u jednu transformacijsku matricu. Svaki put kada pozovete zaslon, stvorit ćete matricu transformacije i glLoadIdentity () omogućit će vam da svaki put započnete s novom matricom.
    • Druge transformacijske funkcije koje ste možda koristili su glTranslatef () i glScalef (). Oni su slični glRotatef (), samo što zahtijevaju samo tri parametra: vrijednosti x, y i z za promjenu veličine i veličinu objekta.
    • Da bi se sve ispravno prikazalo kada se sve tri transformacije primijene na jedan objekt, morate postaviti transformacije odgovarajućim redoslijedom, naime glTranslate, glRotate, glScale - i nikad drugačije. OpenGL transformira objekt čitajući program odozdo prema gore. Da biste to bolje razumjeli, zamislite kako bi kocka 1x1x1 izgledala nakon svih transformacija ako bi ih OpenGL primijenio prikazanim redoslijedom (odozgo prema dolje), a zatim razmislite kako bi OpenGL obradio kocku čitajući upute odozdo prema gore.
  3. 3 Dodajte sljedeće naredbe za skaliranje kocke dvaput u smjerovima x i y, za okretanje kocke za 180 stupnjeva po osi y i za pomicanje kocke 0,1 po osi x. Provjerite jesu li sve relevantne naredbe, uključujući prethodno date naredbe glRotate (), ispravnim redoslijedom. Ako se bojite pogriješiti, pogledajte konačnu verziju programa na kraju članka.

      // Više transformacija glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2.0, 2.0, 0.0);

  4. 4 Sastavite i pokrenite kôd. Recimo da koristite gcc kao prevoditelj, pa unesite sljedeće naredbe u svoj terminal:

      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

  5. 5 Provjerite konačni kod. Evo konačnog koda koji je stvorio autor članka, a koji ne prevodi komentare.

      // // 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 stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #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 // ------ -------------------------------------------------- -// specialKeys () Funkcija povratnog poziva // ---------------------------------------- ------------------ 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 else 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; // Zatražite ažuriranje prikaza glutPostRedisplay ();} // ------------------------------------ ---------------------- // funkcija main () // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB