Kako narediti kocko v OpenGL (s slikami)

Kazalo:

Kako narediti kocko v OpenGL (s slikami)
Kako narediti kocko v OpenGL (s slikami)

Video: Kako narediti kocko v OpenGL (s slikami)

Video: Kako narediti kocko v OpenGL (s slikami)
Video: Easiest Way to Install & Run Stable Diffusion Web UI on PC by Using Open Source Automatic Installer 2024, April
Anonim

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

1994315 1 1
1994315 1 1

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.

1994315 2 1
1994315 2 1

Korak 2. Ustvarite dokument

Ustvarite novo datoteko v svojem najljubšem urejevalniku kod in jo shranite kot mycube.c

1994315 3 1
1994315 3 1

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

1994315 4 1
1994315 4 1

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;

1994315 5 1
1994315 5 1

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

  • Ta izjava postavlja vaše okolje. Pri pisanju programov OpenGL morate zapomniti, da morate vprašati vse. To zahteva, da bolje razumete, kako deluje vaš program in kaj morate vključiti, da dobite želeno funkcionalnost. V tej vrstici boste nastavili zaslon z dvojnim pufriranjem, barvo RGB in Z-vmesnikom.
  • Dvojno pufranje je tehnika, ki se uporablja v grafičnih programih za odpravo težave, ki nastane zaradi načina risanja slik na zaslon. Vsakič, ko na novo narišete prizor, morate najprej izbrisati zaslon, nato pa potegniti nove podatke. Brez dvojnega medpomnjenja boste ob večkratnem brisanju in ponovnem risanju opazili utripajoč učinek.
  • Ta težava je odpravljena z dodajanjem drugega vmesnega pomnilnika za risanje. S to metodo se slika potegne v prvi vmesni pomnilnik in ta vmesni vmesnik vam se prikaže. Naslednji okvir bo potegnjen v drugi medpomnilnik in ko bo to storjeno, se bosta oba vmesnika zamenjala. Takoj boste videli drugi vmesni pomnilnik, toda skrit pred nami, se prvi vmesni pomnilnik izbriše in ponovno nariše s tretjim okvirjem, ki bo zamenjan, ko bo končan.
  • Prav tako želite omogočiti RGB barva sistem v vašem oknu.
  • Z-pufranje tako dobite želene 3D učinke. OpenGL uporablja tridimenzionalni koordinatni sistem z osi x, y in z. Da bi dosegli učinek, da je predmet bližje vam, se njegov položaj na osi z poveča, da pa se zdi bolj oddaljen, se njegov položaj na osi z zmanjša.
1994315 6 1
1994315 6 1

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

1994315 7 1
1994315 7 1

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

1994315 8 1
1994315 8 1

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

1994315 9 1
1994315 9 1

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

1994315 10 1
1994315 10 1

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

1994315 11 1
1994315 11 1

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

1994315 12 1
1994315 12 1

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

1994315 13 1
1994315 13 1

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

1994315 14 1
1994315 14 1

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

1994315 15 1
1994315 15 1

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

1994315 16 1
1994315 16 1

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

1994315 17 1
1994315 17 1

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

  • Najprej opazite, da je skladnja datoteke glRotatef () je podoben kot pri glColor3f () in glVertex3f (), vendar vedno zahteva 4 parametre. Prvi parameter je stopnja rotacije, ki jo je treba uporabiti. Naslednji trije parametri določajo, po kateri osi se je treba vrteti, pri čemer je prva os x, druga je os y, tretji pa os z. Trenutno se morate vrteti le okoli osi x in y.
  • Vse transformacije, ki jih zapišete v svoj program, potrebujejo podobne vrstice. Konceptualno si lahko o tem razmišljate kot o vrtenju vašega predmeta okoli osi x za količino, ki jo definira rotate_x, in nato o rotaciji osi y za rotate_y. Vendar OpenGL združuje vse te stavke v eno matrično transformacijo. Vsakič, ko pokličete funkcijo prikaza, sestavite transformacijsko matriko in glLoadIdentity () zagotavlja, da boste pri vsakem prehodu začeli z novo matriko.
  • Druge transformacijske funkcije, ki jih lahko uporabite, so glTranslatef () in glScalef (). Te funkcije so podobne glRotatef () z izjemo, da vzamejo le 3 parametre, x, y in z za prevedbo ali lestvico predmeta.
  • Če želite doseči pravilen učinek pri uporabi vseh treh transformacij na enem objektu, jih morate uporabiti v pravilnem vrstnem redu. Vedno jih zapišite po vrstnem redu glTranslate, glRotate, nato glScale. OpenGL v bistvu uporablja transformacije od spodaj navzgor. Če želite to razumeti, si poskusite predstavljati, kako bi izgledala preprosta kocka 1x1x1 s transformacijami, če bi jih OpenGL uporabil od zgoraj navzdol in če bi jih OpenGL uporabil od spodaj navzgor.
1994315 18 1
1994315 18 1

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

1994315 19 1
1994315 19 1

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

1994315 20 1
1994315 20 1

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

Priporočena: