Ako vytvoriť kocku v OpenGL (s obrázkami)

Obsah:

Ako vytvoriť kocku v OpenGL (s obrázkami)
Ako vytvoriť kocku v OpenGL (s obrázkami)

Video: Ako vytvoriť kocku v OpenGL (s obrázkami)

Video: Ako vytvoriť kocku v OpenGL (s obrázkami)
Video: Jak vytvořit virtuální PC | VirtualBox - virtuální počítač | nahrání Windows10 (tutoriál) 2024, Apríl
Anonim

OpenGL je výkonný 3D programovací nástroj, ktorý sa používa na kreslenie zložitých trojrozmerných scén z jednoduchých primitívov. Tento článok vás naučí, ako nakresliť jednoduchú kocku, ktorú môžete otáčaním zobraziť v troch rozmeroch!

Na tento projekt budete potrebovať editor kódu a určité znalosti programovania v jazyku C.

Kroky

Časť 1 z 3: Počiatočné nastavenie

1994315 1 1
1994315 1 1

Krok 1. Inštalácia OpenGL Ak chcete začať, pri inštalácii OpenGL do vášho systému postupujte podľa týchto krokov

Ak už máte OpenGL a nainštalovaný kompatibilný kompilátor C, môžete tento krok preskočiť a prejsť na ďalší.

1994315 2 1
1994315 2 1

Krok 2. Vytvorte dokument

Vytvorte nový súbor vo svojom obľúbenom editore kódu a uložte ho ako mycube.c

1994315 3 1
1994315 3 1

Krok 3. Pridajte #obsahuje

Toto sú základné položky, ktoré budete pre svoj program potrebovať. Je dôležité si uvedomiť, že v skutočnosti existujú rôzne zahrnutia potrebné pre rôzne operačné systémy. Nezabudnite zahrnúť všetky tieto položky, aby bol váš program univerzálny a mohol bežať pre akéhokoľvek používateľa.

    // Zahŕňa #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif

1994315 4 1
1994315 4 1

Krok 4. Pridajte funkčné prototypy a globálne premenné

Ďalším krokom je deklarovanie niektorých prototypov funkcií.

    // Funkčné prototypy void display (); neplatné špeciálne klávesy (); // Globálne premenné double rotate_y = 0; dvojité otočenie_x = 0;

1994315 5 1
1994315 5 1

Krok 5. Nastavte funkciu main ()

    int main (int argc, char* argv ) {// Inicializácia GLUT a spracovanie užívateľských parametrov glutInit (& argc, argv); // Požiadajte okno s dvojitou vyrovnávacou pamäťou o skutočnú farbu pomocou Z-bufferu glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  • Toto vyhlásenie nastavuje vaše prostredie. Pri písaní programov OpenGL je dôležité mať na pamäti, že musíte o všetko požiadať. To vyžaduje, aby ste lepšie porozumeli tomu, ako váš program funguje a čo musíte zahrnúť, aby ste získali požadované funkcie. V tomto riadku nastavíte zobrazenie s dvojitým ukladaním do vyrovnávacej pamäte, farbou RGB a vyrovnávacou pamäťou Z.
  • Dvojité ukladanie do vyrovnávacej pamäte je technika používaná v grafických programoch na odstránenie problému, ktorý vzniká v dôsledku kreslenia obrázkov na obrazovku. Pri každom prekreslení scény musíte najskôr vymazať zobrazenie a potom sa nakreslia nové informácie. Bez dvojitého ukladania do vyrovnávacej pamäte budete pozorovať efekt blikania, pretože obrazovka sa opakovane vymazáva a prekresľuje.
  • Tento problém je vyriešený pridaním druhej vyrovnávacej pamäte, do ktorej sa má kresliť. Pri tejto metóde sa obrázok nakreslí do prvej vyrovnávacej pamäte a táto vyrovnávacia pamäť sa vám zobrazí. Ďalší rámec sa nakreslí do druhého vyrovnávacej pamäte, a keď je to hotové, dve vyrovnávacie pamäte si vymenia miesta. Okamžite uvidíte druhú vyrovnávaciu pamäť, ale skrytá pred nami, prvá vyrovnávacia pamäť sa vymazáva a prekresľuje s tretím rámcom, ktorý sa po dokončení zamení.
  • Tiež chcete povoliť Farba RGB systému vo vašom okne.
  • Vyrovnávacia pamäť Z takto získate požadované 3D efekty. OpenGL používa trojrozmerný súradnicový systém s osami x, y a z. Aby však objekt pôsobil bližšie k vám, jeho poloha na osi z sa zvýši, ale aby pôsobil ďalej, jeho poloha na osi z sa zníži.
1994315 6 1
1994315 6 1

Krok 6. Vytvorte okno

Ďalším krokom je vytvorte okno v rámci ktorého nakreslíte kocku. V tomto návode sa toto okno nazýva „Úžasná kocka“.

    // Vytvorenie okna glutCreateWindow ("Úžasná kocka");

1994315 7 1
1994315 7 1

Krok 7. Povoliť test hĺbky

OpenGL je striktný jazyk, pretože nepredpokladá, že sú povolené akékoľvek špeciálne funkcie. Aby sa váš program správne zobrazoval v 3-rozmeroch pomocou vyrovnávacej pamäte Z, na ktorú ste sa pozerali predtým, musíte povoliť hĺbkový test. Ako budete pokračovať v skúmaní OpenGL, objavíte mnoho funkcií, ktoré budete musieť povoliť, vrátane osvetlenia, textúr, orientácie na porážku a mnohých ďalších.

    // Povoliť test hĺbky Z-buffera glEnable (GL_DEPTH_TEST);

1994315 8 1
1994315 8 1

Krok 8. Pridajte funkcie spätného volania

Tu sú funkcie spätného volania, pre ktoré ste predtým napísali prototypy. Zakaždým, keď prejdete hlavnou slučkou, budú tieto funkcie vyvolané. Funkcia zobrazenia prekreslí scénu na základe akýchkoľvek zmien premenných, ktoré boli vykonané od predchádzajúceho hovoru. Funkcia specialKeys nám umožňuje interakciu s programom.

    // Funkcie spätného volania glutDisplayFunc (zobrazenie); glutSpecialFunc (specialKeys);

1994315 9 1
1994315 9 1

Krok 9. Spustite MainLoop

Tým sa vyvolá hlavná funkcia, kým program neukončíte, aby sa umožnili animácie a interakcia s používateľom.

    // Odovzdanie kontroly GLUT pre udalosti glutMainLoop (); // Návrat do OS návrat 0; }

Časť 2 z 3: Funkcia displeja ()

1994315 10 1
1994315 10 1

Krok 1. Pochopte účel tejto funkcie

V tejto funkcii bude vykonaná všetka práca pri kreslení vašej kocky. Všeobecnou myšlienkou vašej kocky je nakresliť všetkých šesť strán jednotlivo a umiestniť ich do príslušnej polohy.

Koncepčne bude každá strana nakreslená definovaním štyroch rohov a nechaním OpenGL spojí čiary a vyplní ju vami definovanou farbou. Nasledujú kroky, ako to urobiť

1994315 11 1
1994315 11 1

Krok 2. Pridajte glClear ()

Prvým krokom, ktorý musíte v tejto funkcii urobiť, je vymažte farbu a Z buffer. Bez týchto krokov môžu byť pod novými kresbami stále viditeľné staré kresby a nakreslené objekty by neboli na správnom mieste na obrazovke.

    void display () {// Čistá obrazovka a Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

1994315 12 1
1994315 12 1

Krok 3. Pridajte glBegin () a glEnd ()

OpenGL definuje objekty ako kombinácie rôznych polygónov. Pomocou glBegin () príkaz, efektívne odložíte ceruzku, ktorá nakreslí tvar. Ak chcete zdvihnúť ceruzku a začať nový tvar, musíte použiť glEnd () príkaz. V tomto návode použijete GL_POLYGON na nakreslenie každej strany kocky, ale na vytvorenie ďalších tvarov je možné použiť aj ďalšie možnosti parametrov, ako napríklad GL_LINE, GL_QUAD alebo GL_TRIANGLE.

  • Tu budete začínať od prednej časti svojej kocky. Neskôr pridáte farbu na všetkých 6 strán.
  • // Viacfarebná strana - PREDNÁ glBegin (GL_POLYGON); // V ďalšom kroku budú pridané vrcholy glEnd ();

1994315 13 1
1994315 13 1

Krok 4. Pridajte glVertex3f ()

Keď ste povedali, že chcete začať s mnohouholníkom, musíte definujte vrcholy predmetu. glVertex má niekoľko foriem v závislosti od toho, čo chcete s objektom robiť.

  • Prvá je, v koľkých dimenziách pracujete. 3 vyššie v glVertex3f hovorí, že kreslíte v 3 dimenziách. Je tiež možné pracovať v 2 alebo 4 rozmeroch. F vyššie v glVertex3f hovorí, že pracujete s číslami s pohyblivou rádovou čiarkou. Môžete tiež použiť krátke, celé alebo dvojité čísla.
  • Všimnite si, že tieto body sú definované v a proti smeru hodinových ručičiek spôsobom. V tejto chvíli to nie je veľmi dôležité, ale keď začnete pracovať s osvetlením, textúrami a orientáciou na porážku, bude to veľmi dôležité, takže si zvyknite definovať svoje body teraz proti smeru hodinových ručičiek.
  • Pridajte sčítanie vrcholov medzi riadky glBegin () a glEnd ().
  • // Viacfarebná strana - PREDNÁ 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

Krok 5. Pridajte glColor3f ()

glColor funguje podobným spôsobom ako glVertex. Body môžete definovať ako šortky, celé čísla, štvorhry alebo plávajúce čísla. Každá farba má hodnotu od 0 do 1. Všetky 0 spôsobia, že bod bude čierny a všetky 1 body budú biele. 3 v glColor3f () odkazuje na farebný systém RGB bez kanála alfa. Alfa farby definuje jej priehľadnosť. Ak chcete zmeniť úroveň alfa, použite glColor4f () s tým, že posledný parameter bude mať hodnotu 0 až 1 pre nepriehľadné až priehľadné.

  • Keď zavoláte glColor3f (), každý vrchol nakreslený od tohto bodu bude mať túto farbu. Ak teda chcete, aby všetky štyri vrcholy boli červené, jednoducho nastavte farbu raz pred príkazmi glVertex3f () a všetky vrcholy budú červené.
  • Predná strana definovaná nižšie ukazuje, ako definovať novú farbu pre každý vrchol. Keď to urobíte, môžete vidieť zaujímavú vlastnosť farieb OpenGL. Pretože každý vrchol mnohouholníka má svoju vlastnú farbu, OpenGL farby automaticky zmieša! Ďalší krok ukáže, ako priradiť štyri vrcholy s rovnakou farbou.
  • // Viacfarebná strana - PREDNÁ glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je červená 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 modrá glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je purpurový glEnd ();

1994315 15 1
1994315 15 1

Krok 6. Zaobchádzajte s ostatnými stranami

Zistite, aké bude umiestnenie každého vrcholu pre ostatných päť strán kocky, ale pre jednoduchosť tieto boli vypočítané za vás a sú zahrnuté v konečná funkcia display () nižšie.

    // Biela strana - SPÄŤ 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 (); // Fialová strana - SPRÁVNE 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 (); // Zelená strana - VĽAVO 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 (); // Modrá 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 (); // Červená strana - 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 (); }

  • Chceme tiež pridať dva posledné riadky kódu pre túto funkciu. Toto sú glFlush ();

    a glutSwapBuffers ();

    ktoré nám poskytujú efekt dvojitého ukladania do vyrovnávacej pamäte, o ktorom ste sa dozvedeli skôr.

Časť 3 z 3: Interaktivita používateľov

1994315 16 1
1994315 16 1

Krok 1. Pridajte specialKeys ()

Ste takmer hotoví, ale v súčasnosti môžete kocku nakresliť, ale nemôžete ju otáčať. Ak to chcete urobiť, urobíte to vytvoriť špeciálne klávesy () funkcia, ktorá nám umožňuje stláčať klávesy šípok a otáčať kockou!

  • Z tohto dôvodu ste deklarovali globálne premenné rotate_x a rotate_y. Keď stlačíte šípku doprava a doľava, funkcia rotate_y sa zvýši alebo zníži o 5 stupňov. Podobne, keď stlačíte klávesy so šípkou nahor a nadol, rotate_x sa zodpovedajúcim spôsobom zmení.
  • void specialKeys (int key, int x, int y) {// Šípka doprava - zvýši rotáciu o 5 stupňov, ak (kláves == GLUT_KEY_RIGHT) rotate_y += 5; // Šípka doľava - zníženie rotácie o 5 stupňov inak, ak (kláves == GLUT_KEY_LEFT) rotate_y - = 5; else if (key == GLUT_KEY_UP) rotate_x += 5; else if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Žiadosť o aktualizáciu displeja glutPostRedisplay (); }

1994315 17 1
1994315 17 1

Krok 2. Pridajte glRotate ()

Vaše posledné vyhlásenie je pridať príkaz, ktorý bude otáčať váš objekt. Vráťte sa na funkciu display () a pred PREDNÚ stranu pridajte tieto riadky:

    // Reset transformácií glLoadIdentity (); // Rotate when user changes rotate_x and rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0,0, 1,0, 0,0); // Viacfarebná strana - PREDNÁ …

  • Najprv si všimnite, že syntax súboru glRotatef () je podobný parametrom glColor3f () a glVertex3f (), ale vždy vyžaduje 4 parametre. Prvým parametrom je stupeň rotácie, ktorý sa má použiť. Nasledujúce tri parametre definujú, ktorá os sa má otáčať, pričom prvá je os x, druhá os y a tretia os z. Teraz sa musíte otáčať iba okolo osi x a y.
  • Všetky transformácie, ktoré napíšete do svojho programu, vyžadujú podobné riadky. Koncepčne si to môžete predstaviť ako otáčanie predmetu okolo osi x o hodnotu definovanú pomocou rotate_x a následné otáčanie okolo osi y otáčaním_y. OpenGL však kombinuje všetky tieto príkazy do jednej maticovej transformácie. Zakaždým, keď zavoláte funkciu zobrazenia, vytvoríte transformačnú maticu a glLoadIdentity () zaisťuje, že začnete s novou maticou v každom priechode.
  • Ďalšie transformačné funkcie, ktoré môžete použiť, sú glTranslatef () a glScalef (). Tieto funkcie sú podobné funkciám glRotatef () s tou výnimkou, že na preklad alebo zmenu veľkosti objektu vyžadujú iba 3 parametre, hodnoty x, y a z.
  • Aby ste získali správny efekt pri aplikácii všetkých troch transformácií na jeden objekt, musíte ich použiť v správnom poradí. Napíšte ich vždy do objednávky glTranslate, glRotate, potom glScale. OpenGL v zásade aplikuje transformácie spôsobom zdola nahor. Aby ste to pochopili, skúste si predstaviť, ako by vyzerala jednoduchá kocka 1x1x1 s transformáciami, keby ich OpenGL aplikoval zhora nadol a keby ich OpenGL použil zdola nahor.
1994315 18 1
1994315 18 1

Krok 3. Pridajte nasledujúce príkazy na zmenu veľkosti kocky o 2 pozdĺž osi x, 2 pozdĺž osi y, otočte kockou o 180 stupňov okolo osi y a preložte kocku o 0,1 pozdĺž osi x

Uistite sa, že ste ich usporiadali rovnako ako predchádzajúce príkazy glRotate () v správnom poradí, ako je popísané vyššie. (Ak si nie ste istí, urobí sa to v konečnom kóde na konci tutoriálu.)

    // Ostatné transformácie 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

Krok 4. Skompilujte a spustite kód

Za predpokladu, že ako kompilátor používate gcc, spustite tieto príkazy z terminálu na kompiláciu a testovanie programu.

    V systéme Linux: gcc cube.c -o cube -lglut -lGL./ mycube V systéme Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube V systéme Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube

1994315 20 1
1994315 20 1

Krok 5. Skontrolujte svoj úplný kód

Malo by to byť takto:

    // // Súbor: mycube.c // Autor: Matt Daisley // Vytvorené: 25. 4. 2012 // Projekt: Zdrojový kód pre Make a Cube in OpenGL // Popis: Vytvorí okno OpenGL a nakreslí 3D kocku/ / Že sa používateľ môže otáčať pomocou klávesov so šípkami // // Ovládacie prvky: Šípka doľava -Otočiť doľava // Šípka doprava -Otočiť doprava // Šípka hore -Otočiť nahor // Šípka nadol -Otočiť nadol // ------ ---------------------------------------------------------- -// Obsahuje // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Funkčné prototypy / / ------------------------------------------------- --------- neplatné zobrazenie (); neplatné špeciálne klávesy (); // ------------------------------------------------ ---------- // Globálne premenné // ---------------------------------- ------------------------ double rotate_y = 0; dvojité otočenie_x = 0; // ------------------------------------------------ ---------- // display () Funkcia spätného volania // ------------------------------- --------------------------- neplatné zobrazenie () {// Čistá obrazovka a Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset transformácií glLoadIdentity (); // Ostatné transformácie // glTranslatef (0,1, 0,0, 0,0); // Nie je zahrnuté // glRotatef (180, 0,0, 1,0, 0,0); // Nie je zahrnuté // Rotate when user changes rotate_x and rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0,0, 1,0, 0,0); // Ostatné transformácie // glScalef (2.0, 2.0, 0.0); // Nie je súčasťou // Viacfarebná strana - PREDNÁ glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je červená 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 modrá glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je purpurový glEnd (); // Biela strana - SPÄŤ 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 (); // Fialová strana - SPRÁVNE 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 (); // Zelená strana - VĽAVO 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 (); // Modrá 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 (); // Červená strana - 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 () Funkcia spätného volania // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// Šípka doprava-zvýšenie otáčania o 5 stupeň, ak (kláves == GLUT_KEY_RIGHT) rotate_y += 5; // Šípka doľava - zníženie rotácie o 5 stupňov inak, ak (kláves == GLUT_KEY_LEFT) rotate_y - = 5; else if (key == GLUT_KEY_UP) rotate_x += 5; else if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Žiadosť o aktualizáciu displeja glutPostRedisplay (); } // ----------------------------------------------- ----------- // funkcia main () // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Inicializácia GLUT a spracovanie užívateľských parametrov glutInit (& argc, argv); // Požiadajte okno s dvojitou vyrovnávacou pamäťou o skutočnú farbu pomocou Z-bufferu glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Vytvorenie okna glutCreateWindow ("Úžasná kocka"); // Povoliť test hĺbky Z-buffera glEnable (GL_DEPTH_TEST); // Funkcie spätného volania glutDisplayFunc (zobrazenie); glutSpecialFunc (specialKeys); // Odovzdanie kontroly GLUT pre udalosti glutMainLoop (); // Návrat do OS návrat 0; }

Odporúča: