Kako napraviti kocku u opengl-u

OpenGL je 3D program za programiranje koji vam omogućava da stvorite složene trodimenzionalne slike iz jednostavnih oblika. Iz ovog člana naučit ćete kako crtati s njim će pomoći jednostavnoj kocki koja se može rotirati u tri dimenzije!

Korake

Dio 1 od 3:
Početna instalacija
jedan. Instalirajte OpenGL. Start S OpenGL instalacijski vodiči na vašem računaru. Ako je OpenGL i prevodilac s vama već, možete preskočiti ovaj korak i preći na sljedeću.
  • 2. Kreirajte dokument. Kreirajte novu datoteku u vašem uređivaču omiljenog koda i sačuvajte je kao Mycube.C
  • 3. Dodaj #includes. Evo glavnih #include direktiva koje su vam potrebne. Važno je zapamtiti da su direktive za različite operativne sisteme različite, pa je potrebno odabrati sve tako da je program univerzalan i može se pokrenuti u bilo kojem sistemu.
    // uključuje # uključuje #Include #Include #Define gl_gelxt_prototipes # ifdef __apple __ # uključuje # drugo # uključuje #ENDIF
  • 4. Dodajte funkcionalne prototipove i globalne varijable. Sljedeći korak će proglasiti funkcionalne prototipove.
    // Funkcionalni prototipesvoidni prikaz () - praznini specijalnike () - // Globalna varijableDeble rotate_y = 0-dvostruki rotate_x = 0-
  • pet. Podesite glavnu () funkciju.
    Int main (int argc, char * argv []) // paralizirati korisnički parametriglutinit (& argc, argv) - // Zatražite dvostruko pufering prozor, z-shema boja i boja True ColorlutinitDisplaymode (glut_double) 
  • Dio 2 od 3:
    Funkcija ekrana ()
    jedan. Shvatite zadatak funkcije zaslona (). Svi radovi na crtanju Kube pasti će na krhke linije ove funkcije. Ideja općenito je sljedeća: izvlačite šest zasebnih lica kocke i stavite ih u odgovarajuće pozicije.
    • Za svako lice definirate se četiri ugla, a OpenGl ih povezuje sa linijama i ispunite boju koju odaberete. Ispod će reći kako to učiniti.
  • 2. Dodajte funkciju GLCLear (). Prije svega, radeći s ovom funkcijom, potrebni smo Jasna boja i z tampon. Bez toga, pod novim uzorkom bit će viđen stari, a objekti koji su izvučeni programom bit će dogovoreni pogrešno.
    Void displej () gl_depth_buffer_bit)-
  • 3. Dodaj Glbegin () i Glet (). OpenGL predmeti su kombinacije različitih poligona. Timu Glbegin () Dopustite nam da nacrtamo objekt s vama - to je poput olovke, koju nacrtate figuru, a da ga ne suvite iz papira. Da otkinu olovku sa lista i počnite crtati nešto novo, treba vam tim Glet (). U ovom ćemo članku koristiti GL_POlygon da nacrtamo svaku ivicu kocke, iako je moguće koristiti druge parametre poput GL_LINE, GL_QUAD ili GL_TRIANGLE za stvaranje drugih oblika.
  • Započnite s prednjom kockom. Kasnije ćemo dodati boju svakom od šest lica.
  • // Multicolor Side - Frontglbegin (GL_Polygon) - // Verse dodaju u sljedećem Stepglend ()-
  • 4. Dodajte funkciju glvertex3f (). Sad kad ste objasnili program koji želite započeti crtanje poligona, trebate Podesite vrhove Objekt. Funkcija GLVERTEX ima nekoliko oblika, čija upotreba ovisi o tome što namjeravate učiniti sa svojim objektom.
  • Prvo - koliko će merenja raditi? Slika 3 u GLVERTEX3F označava tri dimenzije. Međutim, možete raditi u 2, a u 4 mjerenja. Slovo F, zauzvrat, ukazuje da radimo s plutajućim zarezima. Međutim, ovdje možete koristiti cijeli broj, dvostruke ili kratke tipove.
  • Imajte na umu da su sve tačke postavljene suprotno u smjeru kazaljke na satu strelice. Iako nije baš važno, ali kada počnete raditi na rasvjetu, teksturiranju, liječenju ne-tarifnih lica, navika propisivanja svega u smjeru suprotnom od kazaljke na satu za vas bit će vrlo korisna za vas.
  • Dodajte vrhove između GLbegin () i Glend () linija.


  • // Multicolor Side - Frontglbegin (GL_Polygon) -glvertex3f (-0.pedeset.pedeset.5) - // P1GLVERTEX3F (-0.5.0.pedeset.5) - // P2GLVERTEX3F (0.5.0.pedeset.5) - // P3GLVERTEX3F (0.pedeset.pedeset.5) - // P4Glend ()-
  • pet. Dodajte funkciju GLCOLOR3F (). GlColor djeluje na više načina slično glvertex. Bodovi Možete postaviti vrste podataka kratkih, cijeli broj, dvostruki ili plov. Svaka boja ima vrijednost od 0 do 1. Sve nule su crne, sve jedinice - respektivno, bijelo. Slika 3 u GlColor3F () označava RGB shemu boja bez alfa kanala. ALPHA CHANL CANLES odgovorne su za njegovu transparentnost. Da biste promijenili alfa kanapnu vrijednost, koristite GLCOLOR4F () s posljednjim parametrom od 0 do 1, odnosno iz neprozirne do transparentnosti.
  • Pozivanje GLCOLOR3F (), svaku vertexu vršimo iz navedene točke u navedenoj boji. Drugim riječima, ako bi sva četiri vrhova trebala biti crvena, tada samo jedno-samo vrijeme postavlja vrijednost boje prije poziva GLVERTEX3F naredbe () i oni će svi biti crveni.
  • Na primjeru dolje navedenog dijela, možete vidjeti kako je postavljena nova boja svake verzije. Kad to učinite, možete se upoznati sa zanimljivom karakteristikom Cvijeća OpenGL-a. Budući da svaki prstohvat poligona ima svoju boju, OpenGL automatski miješa boje! Kod stavljen na prikazan kako stvoriti četiri vrhove iste boje.
  • // Multicolor Side - Frontglbegin (GL_POLYGON) -GLCOLOR3F (1.0, 0.0, 0.0) -glvertex3f (0.pedeset.pedeset.5) - // P1 RedglColor3F (0.0, 1.0, 0.0) -glvertex3f (0.5.0.pedeset.5) - // P2 GreenGLColor3f (0.0, 0.0, 1.0) -glvertex3f (-0.5.0.pedeset.5) - // P3 BlueglColor3F (1.0, 0.0, 1.0) -glvertex3f (-0.pedeset.pedeset.5) - // P4 PurpleGledlend ()-
  • 6. Nacrtajte drugu licu Kubu. Bolje, naravno, ako sami pronađete lokaciju ostatka kocke i svaku od vrhova, ali radi jednostavnosti izračunali smo ih za vas. Kod je dat B Završni prikaz funkcije () ispod.
    // Bijela strana - Rearglbegin (GL_POLIGON) -GLCOLOR3F (1.0.1.0, 1.0) -glvertex3f (0.pedeset.pedeset.5) -glvertex3f (0.5.0.pedeset.5) -glvertex3f (-0.5.0.pedeset.5) -glvertex3f (-0.pedeset.pedeset.5) -Glend () - // ljubičasta strana - ruralglbegin (gl_polygon) -glcolor3f (1.0,0.0.1.0) -glvertex3f (0.pedeset.pedeset.5) -glvertex3f (0.5.0.pedeset.5) -glvertex3f (0.5.0.5.0.5) -glvertex3f (0.pedeset.5.0.5) -Glend () - // Zelena strana - lijeviBegin (gl_polygon) -glcolor3f (0.0.1.0,0.0) -glvertex3f (-0.pedeset.5.0.5) -glvertex3f (-0.5.0.5.0.5) -glvertex3f (-0.5.0.pedeset.5) -glvertex3f (-0.pedeset.pedeset.5) -Glend () - // Blue Side - Gornjegbegin (GL_POLYGON) -GLCOLOR3F (0.0,0.0.1.0) -glvertex3f (0.5.0.5.0.5) -glvertex3f (0.5.0.pedeset.5) -glvertex3f (-0.5.0.pedeset.5) -glvertex3f (-0.5.0.5.0.5) -Glend () - // Crvena strana - Nižbyglbegin (GL_POLYGON) -GLCOLOR3F (1.0,0.0,0.0) -glvertex3f (0.pedeset.pedeset.5) -glvertex3f (0.pedeset.5.0.5) -glvertex3f (-0.pedeset.5.0.5) -glvertex3f (-0.pedeset.pedeset.5) -Glend () - GLFLUSH () - GlutswapBuffers ()-
  • Obratite pažnju na posljednja dva retka. Ovo su funkcije GLFLUSH ()- i Glutswapbuffers ()-, Davanje efekta dvostrukog pufenja, koji je rečeno gore.
  • Dio 3 od 3:
    Interaktivni program
    jedan. Dodajte funkciju Speciackeys (). U principu je sve gotovo spremno, ali kocka je samo izvučena i ne rotira se. Da biste to učinili, stvorite Funkcija specijalista (), koji će zakretati kocku pritiskom na tipke sa strelicama!
    • Bilo je za ovu funkciju da su najavljene globalne varijable rotate_x i rotate_y. Kada pritisnete "lijevo" i "desno" tipke sa strelicama, rotate_y vrijednost će se povećati ili smanjiti za pet stepeni. Slično tome, promijenit ćemo vrijednost rotate_x, ali već pritiskom na tipke sa strelicama "gore" i dolje.
    Praznine specijalce (Int tipka, INT X, INT Y) {// Strelica u desnoj strani - Povećanje rotacije od 5 stepeni (tipka == GLUT_KEY_Right) Rotate_y + = 5 - // Lijeva strelica - Smanjenje rotacije od 5 stepeni (tipka == GLUT_KEY_LEFT) ROTATE_Y - = 5-ALTE IF (tipka == GLUT_KEY_UP) ROTATE_X + = 5-ALTE IF (tipka == GLUT_KEY_DOWN) ROTATE_X - = 5 - // Zahtjev za ažuriranje ScreeglatPostEdPlay () -}
  • 2. Dodajte Glotate (). Posljednje što ćemo učiniti je dodati niz koji će nam omogućiti da rotimo objekt. Povratak na funkciju Prikaz () I prije nego što opisuje prednju, dodajte:
    // resetiranje transformacijaGloadidentnost () - // rotacija prilikom promjene korisničkih rotate_x i rotate_yglorotatef vrijednosti (rotate_x, 1.0, 0.0, 0.0) -glrotatef (rotate_y, 0.0, 1.0, 0.0) - // višebojna strana - prednji....
  • Imajte na umu da sintaksa glrotatef (), što je slično sintaksi GLCOLOR3F () i GLVERTEX3F (), ali uvijek zahtijeva naznaku četiri parametra. Prvo - ugao rotacije u stupnjevima. Sledeća tri - osi za koja rotacija ide, u redoslijedu X, Y, Z. Do sada moramo zakretati kocku na dvije osi, x i u.
  • Za sve transformacije koje preciziramo program, potrebne su slične linije. Zapravo, predstavljamo rotaciju objekta duž osi X kao promjene u vrijednosti rotate_x, te rotacijom osi osi - kao promjena vrijednosti rotate_y. Međutim, OpenGL će ujediniti sve u jednu transformacijsku matricu. Bilo da pozivate funkciju prikaza, stvorit ćete matricu transformacije i GLOVINDERITNOST () omogućit će vam da započnete svaki put novom matricom.
  • Ostale funkcije transformacije koje biste mogli koristiti je gltranslatef () i glcalef (). Slični su glrotatef (), osim što trebaju samo tri parametra: vrijednosti x, y i z za promjenu i skaliranje objekta.
  • Tako da se sve prikazuje ispravno kada se na jednom objektu primjenjuju sve tri transformacije, morate postaviti transformacije u odgovarajućem redoslijedu, naime GLTRANSLATE, GLROTATE, GLSCALE - I nikad u suprotnom. OpenGL transformiše objekt koji čita program sa odozdo prema gore. Da biste bolje razumjeli, zamislite kako će kocku 1x1x1 paziti na sve transformacije ako ih je OpenGl primijenio u nalogu kao onim naznačenim (od vrha do dna), a zatim razmislite o tome kako OpenGl tretira kocku, čitanje uputstava odozdo prema gore.
  • 3. Dodajte sljedeće naredbe za dvokračno skaliranje kocke uz osi x i y, da biste rotirali kocku 180 stepeni duž osi osi, kao i za pomicanje kocke za 0,1 duž X osi x. Provjerite jesu li sve relevantne naredbe, uključujući prethodno navedene Glrotate () naredbe, navedene u ispravnom redoslijedu. Ako se plašite da se pogriješite, pogledajte konačnu verziju programa na kraju članka.
    // Ostale transformacijeGltranslatef (0.10.0, 0.0) -glrotatef (180, 0).0, 1.0, 0.0) -glscalef (2.0, 2.0, 0.0)-
  • 4. Sastavite i pokrenite kod. Pretpostavimo da koristite GCC kao kompajler, pa unesite sljedeće naredbe na terminal:
    Na Linuxu: GCC kocka.C -O Cube -LGLUT -LGL./ Mycuben Mac: GCC -O foo foo.C -Framework Glut -Framework OpenGL./ Mycube Windows: GCC -Wall -Fooo foo.C -LGLUT32CU -LGLU32 -LOPENGL32./ Mycube
  • pet. Provjerite završni kod. Evo konačnog koda koje je autor kreirao autor članka u kojem komentari nisu prevedeni.
    //// datoteka: mycube.C // Autor: Matt Daisley // Kreirano: 4/25 / 2012 // Projekt: Izvorni kod za čišćenje kocke u OpenGL // Opis: Stvara OpenGL prozor i crta 3D kocku // koju se korisnik može okretati pomoću Kontrole sa strelicama // // Kontrole: Levo strelica - Rotirajte lijevo // DESNO strelica - Zakrenite desno // Up strelica- Rotirajte dolje // -------------- -------------------------------------------- // uključuje // - - -------------------------------------------------- - ------- # uključite #Include #Include #Define gl_gelxt_prototipes # IFDEF __apple __ # uključuje # drugo # uključuje # endif // --------------------------------- - ------------------------ // Funkcijski prototipi // ------------------- --- -------------------------------------- VOOD ekran () - praznini Speciackeys () - // ----------------------------------------------- ----- ---------- // Globalne varijable // ------------------------------- ------- ---------------------- Dvostruki rotate_y = 0-dvostruki rotate_x = 0 - // --------- ------- ------------------------------------------ / / Display () Funkcija povratnog poziva / / ------------------------------------------ ------- --------- Voidni prikaz () // Clear ekrana i Z-Buffergclear (GL_COLOR_BUFFER_BIT // ------------------ ------- --------------------------------- // Specialeys () funkcija povratnog poziva // - - ------- ------------------------------------------- -------- Vučni specijalci (Int tipka, INT X, INT Y) {// DESNO strelica - povećajte rotaciju za 5 stepeni (tipka == GLUT_KEY_Right) Rotate_y + = 5 - // Lijeva strelica - Smanjenje rotacije Do 5 detela ako (ključ == glut_key_ Lijevo) Rotate_y - = 5-drugo ako (tipka == GLUT_KEY_UP) ROTATE_X + = 5-ALTE IF (tipka == GLUT_KEY_DOWN) Rotate_X - = 5 - // Zahtev za prikaz () -} // ------ / -------------------------------------------------- - - // Funkcija glavne () // --------------------------------------- --- ------------------ INT glavna (int argc, char * argv []) glut_depth) - // Kreirajte prozorGlutcreatewindow ("Awesome kocke") - // Omogući z-pufer dubinu testGlable (gl_depth_test) - // povratni functsGlutDisplayFunc (displej) -Glutspecialfunc (specijalce) - // Kontrola prolaska na glut za događanja - // Povratak na OSRETURN 0-
  • Slične publikacije